Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Common / AuthoringOM / Design / Themes.cs / 1305376 / Themes.cs
namespace System.Workflow.ComponentModel.Design { using System; using System.IO; using System.Xml; using System.Text; using System.Drawing; using System.Resources; using System.Reflection; using System.Diagnostics; using System.Collections; using System.Drawing.Text; using System.Globalization; using System.Windows.Forms; using System.Drawing.Design; using System.ComponentModel; using System.Drawing.Drawing2D; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel.Design; using System.Collections.Specialized; using System.Runtime.InteropServices; using System.ComponentModel.Design.Serialization; using Microsoft.Win32; using System.Workflow.ComponentModel.Compiler; using System.Workflow.ComponentModel.Serialization; using System.Windows.Forms.Design; // #region WorkflowTheme Enums public enum ThemeType { Default = 0, System = 1, UserDefined = 2 } public enum DesignerGeometry { Rectangle = 0, RoundedRectangle = 1 } public enum TextQuality { Aliased = 0, AntiAliased = 1, } public enum DesignerSize { //Please note that this enum is used to access array and hence we need to //change all the arrays before changing this enum Small = 0, Medium = 1, Large = 2 } public enum DesignerContentAlignment { Left = 1, Top = 2, Right = 4, Bottom = 8, Center = 16, TopLeft = Left + Top, TopCenter = Center + Top, TopRight = Right + Top, CenterLeft = Left + Center, CenterRight = Right + Center, BottomLeft = Left + Bottom, BottomCenter = Center + Bottom, BottomRight = Right + Bottom, Fill = 32 } public enum LineAnchor { None = 0, Arrow = 1, ArrowAnchor = 2, Diamond = 3, DiamondAnchor = 4, Round = 5, RoundAnchor = 6, Rectangle = 7, RectangleAnchor = 8, RoundedRectangle = 9, RoundedRectangleAnchor = 10 } public enum AmbientProperty { DesignerSize = 0, OperatingSystemSetting = 1 } #endregion #region Class ActivityDesignerThemeAttribute [AttributeUsage(AttributeTargets.Class)] public sealed class ActivityDesignerThemeAttribute : Attribute { private Type designerThemeType = null; private string xml = String.Empty; public ActivityDesignerThemeAttribute(Type designerThemeType) { this.designerThemeType = designerThemeType; } public Type DesignerThemeType { get { return this.designerThemeType; } } public string Xml { get { return this.xml; } set { this.xml = value; } } } #endregion #region Class WorkflowTheme public sealed class WorkflowTheme : IDisposable { #region Static Members private static readonly string WorkflowThemesSubKey = "Themes"; private const string ThemeTypeKey = "ThemeType"; private const string ThemePathKey = "ThemeFilePath"; private const string ThemeResourceNS = "System.Workflow.ComponentModel.Design.ActivityDesignerThemes."; internal const string DefaultThemeFileExtension = "*.wtm"; internal static string DefaultNamespace = typeof(WorkflowTheme).Namespace.Replace(".", "_"); private static IUIService uiService = null;//cached session-wide ui service (for getting environment font) private static Font defaultFont = null; #endregion #region Members and Initialization private static WorkflowTheme currentTheme = null; private static bool enableChangeNotification = true; public static event System.EventHandler ThemeChanged; private ThemeType themeType = ThemeType.UserDefined; private string name = String.Empty; private string version = "1.0"; private string description = DR.GetString(DR.DefaultThemeDescription); private string filePath = String.Empty; private ThemeCollection designerThemes = new ThemeCollection(); private bool readOnly = false; static WorkflowTheme() { WorkflowTheme.currentTheme = LoadThemeSettingFromRegistry(); if (WorkflowTheme.currentTheme != null) WorkflowTheme.currentTheme.ReadOnly = true; } public WorkflowTheme() { this.filePath = WorkflowTheme.GenerateThemeFilePath(); if (this.filePath != null && this.filePath.Length > 0) this.name = Path.GetFileNameWithoutExtension(this.filePath); } ~WorkflowTheme() { Dispose(false); } void IDisposable.Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { //Dispose all the members first before doing anything with the resources foreach (DesignerTheme designerTheme in this.designerThemes) ((IDisposable)designerTheme).Dispose(); this.designerThemes.Clear(); } #endregion #region Static Properties and Methods internal static IUIService UIService { get { return WorkflowTheme.uiService; } set { WorkflowTheme.uiService = value; WorkflowTheme.defaultFont = null;//clear cached font WorkflowTheme.CurrentTheme.AmbientTheme.UpdateFont(); } } internal static Font GetDefaultFont() { if (WorkflowTheme.defaultFont == null) { if (WorkflowTheme.UIService != null) WorkflowTheme.defaultFont = WorkflowTheme.UIService.Styles["DialogFont"] as Font; if (WorkflowTheme.defaultFont == null) WorkflowTheme.defaultFont = Control.DefaultFont; } return defaultFont; } public static string RegistryKeyPath { get { return DesignerHelpers.DesignerPerUserRegistryKey + "\\" + WorkflowThemesSubKey; } } public static WorkflowTheme CurrentTheme { get { if (WorkflowTheme.currentTheme == null) { WorkflowTheme.currentTheme = CreateStandardTheme(ThemeType.Default); WorkflowTheme.currentTheme.ReadOnly = true; } return WorkflowTheme.currentTheme; } set { if (WorkflowTheme.currentTheme == value) return; if (value == null) throw new ArgumentNullException("value"); WorkflowTheme oldTheme = WorkflowTheme.currentTheme; WorkflowTheme.currentTheme = value; WorkflowTheme.currentTheme.ReadOnly = true; if (WorkflowTheme.EnableChangeNotification) { //We dont want to dispose the standard themes here if (oldTheme != null) { ((IDisposable)oldTheme).Dispose(); oldTheme = null; } FireThemeChange(); } } } public static bool EnableChangeNotification { get { return WorkflowTheme.enableChangeNotification; } set { if (WorkflowTheme.enableChangeNotification == value) return; WorkflowTheme.enableChangeNotification = value; } } public static string LookupPath { get { string path = string.Empty; try { path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); if (String.IsNullOrEmpty(path)) { Debug.Assert(false, "Install directory key is missing!"); path = new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath; } path = Path.Combine(path, "Windows Workflow Foundation" + Path.DirectorySeparatorChar + "Themes"); path += Path.DirectorySeparatorChar; } catch { } Debug.Assert(path != null && path.Length > 0); return path; } } public static string GenerateThemeFilePath() { string path = LookupPath; string tempThemePath = Path.Combine(path, DR.GetString(DR.MyFavoriteTheme) + ".wtm"); for (int i = 1; File.Exists(tempThemePath); i++) { tempThemePath = Path.Combine(path, DR.GetString(DR.MyFavoriteTheme) + i.ToString(CultureInfo.InvariantCulture) + ".wtm"); } return tempThemePath; } public static WorkflowTheme LoadThemeSettingFromRegistry() { WorkflowTheme loadedTheme = null; RegistryKey themeKey = Registry.CurrentUser.OpenSubKey(WorkflowTheme.RegistryKeyPath); if (themeKey != null) { ThemeType themeType = ThemeType.Default; try { object registryValue = themeKey.GetValue(WorkflowTheme.ThemeTypeKey); if (registryValue is string) themeType = (ThemeType) Enum.Parse(typeof(ThemeType), (string) registryValue, true); if (themeType == ThemeType.UserDefined) { registryValue = themeKey.GetValue(WorkflowTheme.ThemePathKey); string themePath = (registryValue is string) ? (string)registryValue : String.Empty; if (File.Exists(themePath)) { string extension = Path.GetExtension(themePath); if (extension.Equals(WorkflowTheme.DefaultThemeFileExtension.Replace("*", ""), StringComparison.Ordinal)) loadedTheme = WorkflowTheme.Load(themePath); } } } catch { //We eat the exception } finally { if (loadedTheme == null) { if (themeType == ThemeType.UserDefined) themeType = ThemeType.Default; loadedTheme = CreateStandardTheme(themeType); } themeKey.Close(); } } return loadedTheme; } public static void SaveThemeSettingToRegistry() { RegistryKey themeKey = Registry.CurrentUser.CreateSubKey(WorkflowTheme.RegistryKeyPath); if (themeKey != null) { try { themeKey.SetValue(WorkflowTheme.ThemeTypeKey, WorkflowTheme.CurrentTheme.themeType); if (WorkflowTheme.CurrentTheme.themeType == ThemeType.UserDefined) themeKey.SetValue(WorkflowTheme.ThemePathKey, WorkflowTheme.CurrentTheme.FilePath); else themeKey.SetValue(WorkflowTheme.ThemePathKey, String.Empty); } catch { //We eat the exception } finally { themeKey.Close(); } } } public static WorkflowTheme CreateStandardTheme(ThemeType standardThemeType) { WorkflowTheme theme = null; if (standardThemeType == ThemeType.Default) { theme = new WorkflowTheme(); theme.AmbientTheme.UseDefaultFont(); } else if (standardThemeType == ThemeType.System) { theme = new WorkflowTheme(); theme.AmbientTheme.UseOperatingSystemSettings = true; } else { return null; } string[] standardThemeParams = StandardThemes[standardThemeType] as string[]; Debug.Assert(standardThemeParams != null); if (standardThemeParams != null) { theme.Name = standardThemeParams[0]; theme.themeType = standardThemeType; theme.Description = standardThemeParams[1]; theme.FilePath = LookupPath; } return theme; } public static IDictionaryStandardThemes { get { //DO NOT CHANGE THE ORDER OF THE THEMES ADDED BELOW Dictionary standardThemes = new Dictionary (); standardThemes.Add(ThemeType.Default, new string[] { DR.GetString(DR.DefaultTheme), DR.GetString(DR.DefaultThemeDescription) }); standardThemes.Add(ThemeType.System, new string[] { DR.GetString(DR.OSTheme), DR.GetString(DR.SystemThemeDescription) }); return standardThemes; } } internal static void FireThemeChange() { if (WorkflowTheme.ThemeChanged != null) WorkflowTheme.ThemeChanged(WorkflowTheme.currentTheme, EventArgs.Empty); } #endregion #region Load/Save public static WorkflowTheme Load(string themeFilePath) { DesignerSerializationManager serializationManager = new DesignerSerializationManager(); using (serializationManager.CreateSession()) return WorkflowTheme.Load(serializationManager, themeFilePath); } public static WorkflowTheme Load(IDesignerSerializationManager serializationManager, string themeFilePath) { if (serializationManager == null) throw new ArgumentNullException("serializationManager"); WorkflowTheme theme = null; if (themeFilePath != null && File.Exists(themeFilePath)) { XmlReader xmlReader = XmlReader.Create(themeFilePath); ThemeSerializationProvider themeSerializationProvider = new ThemeSerializationProvider(); try { serializationManager.AddSerializationProvider(themeSerializationProvider); WorkflowMarkupSerializer xomlSerializer = new WorkflowMarkupSerializer(); theme = xomlSerializer.Deserialize(serializationManager, xmlReader) as WorkflowTheme; } finally { serializationManager.RemoveSerializationProvider(themeSerializationProvider); xmlReader.Close(); } if (theme != null) theme.filePath = themeFilePath; } return theme; } public void Save(string themeFilePath) { if (themeFilePath == null || themeFilePath.Length == 0) throw new ArgumentException(DR.GetString(DR.ThemePathNotValid), "themeFilePath"); DesignerSerializationManager dsManager = new DesignerSerializationManager(); using (dsManager.CreateSession()) { WorkflowMarkupSerializationManager serializationManager = new WorkflowMarkupSerializationManager(dsManager); XmlWriter streamWriter = null; ThemeSerializationProvider themeSerializationProvider = new ThemeSerializationProvider(); try { string directory = Path.GetDirectoryName(themeFilePath); if (directory.Length > 0 && !Directory.Exists(directory)) Directory.CreateDirectory(directory); streamWriter = Helpers.CreateXmlWriter(themeFilePath); serializationManager.AddSerializationProvider(themeSerializationProvider); WorkflowMarkupSerializer xomlSerializer = new WorkflowMarkupSerializer(); xomlSerializer.Serialize(serializationManager, streamWriter, this); } finally { serializationManager.RemoveSerializationProvider(themeSerializationProvider); if (streamWriter != null) streamWriter.Close(); } this.filePath = themeFilePath; } } #endregion #region a-la ICloneable Members public WorkflowTheme Clone() { WorkflowTheme theme = null; DesignerSerializationManager serializationManager = new DesignerSerializationManager(); using (serializationManager.CreateSession()) { ThemeSerializationProvider themeSerializationProvider = new ThemeSerializationProvider(); StringWriter stringWriter = new StringWriter(new StringBuilder(), CultureInfo.InvariantCulture); StringReader stringReader = null; try { ((IDesignerSerializationManager)serializationManager).AddSerializationProvider(themeSerializationProvider); WorkflowMarkupSerializer xomlSerializer = new WorkflowMarkupSerializer(); using (XmlWriter xmlWriter = Helpers.CreateXmlWriter(stringWriter)) xomlSerializer.Serialize(serializationManager, xmlWriter, this); stringReader = new StringReader(stringWriter.ToString()); using (XmlReader xmlReader = XmlReader.Create(stringReader)) theme = xomlSerializer.Deserialize(serializationManager, xmlReader) as WorkflowTheme; } finally { ((IDesignerSerializationManager)serializationManager).RemoveSerializationProvider(themeSerializationProvider); stringReader.Close(); stringWriter.Close(); } } if (theme != null) { theme.filePath = this.filePath; //Now we go thru all the designer themes and call Initialize on them foreach (DesignerTheme designerTheme in theme.DesignerThemes) designerTheme.Initialize(); } return theme; } #endregion #region Public Properties and Methods public string Name { get { return this.name; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.name = value; } } public string Version { get { return this.version; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.version = value; } } public string Description { get { return this.description; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.description = value; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public string FilePath { get { return this.filePath; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.filePath = value; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public string ContainingFileDirectory { get { string directory = String.Empty; if (this.filePath.Length > 0) { try { directory = Path.GetDirectoryName(this.filePath) + Path.DirectorySeparatorChar; } catch { } } return directory; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public IList DesignerThemes { get { return this.designerThemes; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public AmbientTheme AmbientTheme { get { return GetTheme(typeof(WorkflowView)) as AmbientTheme; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public ActivityDesignerTheme GetDesignerTheme(ActivityDesigner designer) { if (designer == null) throw new ArgumentNullException("designer"); return GetTheme(designer.GetType()) as ActivityDesignerTheme; } internal DesignerTheme GetTheme(Type designerType) { bool wasReadOnly = ReadOnly; DesignerTheme designerTheme = (this.designerThemes.Contains(designerType.FullName)) ? this.designerThemes[designerType.FullName] : null; try { ReadOnly = false; if (designerTheme == null || (designerTheme.DesignerType != null && !designerType.Equals(designerTheme.DesignerType))) { //This means that the two types are not equal and hence we need to replace the theme bool replaceTheme = (designerTheme != null); AttributeCollection attributeCollection = TypeDescriptor.GetAttributes(designerType); ActivityDesignerThemeAttribute themeAttrib = attributeCollection[typeof(ActivityDesignerThemeAttribute)] as ActivityDesignerThemeAttribute; if (themeAttrib == null) throw new InvalidOperationException(DR.GetString(DR.Error_ThemeAttributeMissing, designerType.FullName)); if (themeAttrib.DesignerThemeType == null) throw new InvalidOperationException(DR.GetString(DR.Error_ThemeTypeMissing, designerType.FullName)); if (themeAttrib.Xml.Length > 0) { //First check if the theme initializer is obtained from resource as a manifest Stream stream = designerType.Assembly.GetManifestResourceStream(designerType, themeAttrib.Xml); if (stream == null) stream = designerType.Assembly.GetManifestResourceStream(WorkflowTheme.ThemeResourceNS + themeAttrib.Xml); //Check if the theme initializer is obtained from file XmlReader textReader = (stream != null) ? XmlReader.Create(stream) : null; if (textReader == null) textReader = XmlReader.Create(new StringReader(themeAttrib.Xml)); if (textReader != null) { DesignerSerializationManager serializationManager = new DesignerSerializationManager(); using (serializationManager.CreateSession()) { ThemeSerializationProvider themeSerializationProvider = new ThemeSerializationProvider(); try { ((IDesignerSerializationManager)serializationManager).AddSerializationProvider(themeSerializationProvider); ((IDesignerSerializationManager)serializationManager).Context.Push(this); WorkflowMarkupSerializer xomlSerializer = new WorkflowMarkupSerializer(); designerTheme = xomlSerializer.Deserialize(serializationManager, textReader) as DesignerTheme; if (designerTheme != null && !themeAttrib.DesignerThemeType.IsAssignableFrom(designerTheme.GetType())) { ((IDesignerSerializationManager)serializationManager).ReportError(new WorkflowMarkupSerializationException(DR.GetString(DR.ThemeTypesMismatch, new object[] { themeAttrib.DesignerThemeType.FullName, designerTheme.GetType().FullName }))); designerTheme = null; } if (serializationManager.Errors.Count > 0) { string errors = String.Empty; foreach (object ex in serializationManager.Errors) errors += ex.ToString() + @"\n"; Debug.WriteLine(errors); } } finally { //In some cases the type resolution throws an exception when we try to create a illegal theme type, //this is the reason we need to catch it and proceed further ((IDesignerSerializationManager)serializationManager).RemoveSerializationProvider(themeSerializationProvider); textReader.Close(); } } } } if (designerTheme == null) { try { designerTheme = Activator.CreateInstance(themeAttrib.DesignerThemeType, new object[] { this }) as DesignerTheme; } catch { //If an exception is thrown here then surely we can not create designerTheme specified by the user so we create a default theme //and give it to the user designerTheme = new ActivityDesignerTheme(this); } } designerTheme.DesignerType = designerType; designerTheme.ApplyTo = designerType.FullName; designerTheme.Initialize(); if (replaceTheme) this.designerThemes.Remove(designerType.FullName); this.designerThemes.Add(designerTheme); } if (designerTheme.DesignerType == null) designerTheme.DesignerType = designerType; } finally { ReadOnly = wasReadOnly; } return designerTheme; } internal void AmbientPropertyChanged(AmbientProperty ambientProperty) { foreach (DesignerTheme theme in this.designerThemes) { bool oldReadOnly = this.ReadOnly; this.ReadOnly = false; theme.OnAmbientPropertyChanged(ambientProperty); this.ReadOnly = oldReadOnly; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public ThemeType Type { get { return this.themeType; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool ReadOnly { get { return this.readOnly; } set { this.readOnly = value; } } #endregion #region Class ThemeCollection private class ThemeCollection: KeyedCollection { protected override string GetKeyForItem(DesignerTheme item) { Debug.Assert(item.ApplyTo != null && item.ApplyTo.Length > 0); return item.ApplyTo; } } #endregion } #endregion #region Class DesignerTheme [DesignerSerializer(typeof(ThemeSerializer), typeof(WorkflowMarkupSerializer))] [TypeConverter(typeof(ThemeTypeConverter))] public abstract class DesignerTheme : IDisposable, IPropertyValueProvider { #region Members and Initialization private WorkflowTheme workflowTheme = null; private Type designerType = null; private string designerTypeName = String.Empty; protected DesignerTheme(WorkflowTheme theme) { this.workflowTheme = theme; } ~DesignerTheme() { Dispose(false); } void IDisposable.Dispose() { Dispose(true); GC.SuppressFinalize(this); } public virtual void Initialize() { } protected virtual void Dispose(bool disposing) { } #endregion #region Properties and Methods [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] protected WorkflowTheme ContainingTheme { get { return this.workflowTheme; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public virtual Type DesignerType { get { return this.designerType; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.designerType = value; } } [Browsable(false)] public virtual string ApplyTo { get { return this.designerTypeName; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.designerTypeName = value; } } public virtual void OnAmbientPropertyChanged(AmbientProperty ambientProperty) { } [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool ReadOnly { get { if (this.workflowTheme != null) return this.workflowTheme.ReadOnly; else return false; } internal set { if (this.workflowTheme != null) this.workflowTheme.ReadOnly = value; } } #endregion #region IPropertyValueProvider Members ICollection IPropertyValueProvider.GetPropertyValues(ITypeDescriptorContext context) { //You can filter the enum values here by using EnumFilterConverter return GetPropertyValues(context); } internal virtual ICollection GetPropertyValues(ITypeDescriptorContext context) { //You can filter the enum values here by using EnumFilterConverter return new object[] { }; } #endregion #region Class ThemeSerializer private class ThemeSerializer : WorkflowMarkupSerializer { protected override object CreateInstance(WorkflowMarkupSerializationManager serializationManager, Type type) { if (typeof(DesignerTheme).IsAssignableFrom(type)) return Activator.CreateInstance(type, new object[] { serializationManager.Context[typeof(WorkflowTheme)] }); else return base.CreateInstance(serializationManager, type); } } #endregion } #endregion #region Class ActivityDesignerTheme public class ActivityDesignerTheme : DesignerTheme { #region Constants private static readonly Size[] DesignerSizes = new Size[] { new Size(90, 40), new Size(130, 41), new Size(110, 50) }; private static readonly Size[] ImageSizes = new Size[] { new Size(16, 16), new Size(16, 16), new Size(24, 24) }; #endregion #region Members and Initialization //Public members private string designerImagePath = String.Empty; private Color foreColor = Color.Black; private Color borderColor = Color.Black; private DashStyle borderStyle = DashStyle.Solid; private Color backColorStart = Color.White; private Color backColorEnd = Color.Empty; private LinearGradientMode backgroundStyle = LinearGradientMode.Horizontal; //Temporary members private Image designerImage; private Pen foregroundPen; private Pen borderPen; private Brush foregroundBrush; private Brush backgroundBrush; private Rectangle backgroundBrushRect; public ActivityDesignerTheme(WorkflowTheme theme) : base(theme) { } protected override void Dispose(bool disposing) { try { if (this.designerImage != null) { this.designerImage.Dispose(); this.designerImage = null; } if (this.foregroundPen != null) { this.foregroundPen.Dispose(); this.foregroundPen = null; } if (this.foregroundBrush != null) { this.foregroundBrush.Dispose(); this.foregroundBrush = null; } if (this.borderPen != null) { this.borderPen.Dispose(); this.borderPen = null; } if (this.backgroundBrush != null) { this.backgroundBrush.Dispose(); this.backgroundBrush = null; } } finally { base.Dispose(disposing); } } public override void Initialize() { base.Initialize(); if (ContainingTheme.AmbientTheme.UseOperatingSystemSettings) ApplySystemColors(); } #endregion #region Publicly browsable Properties [DispId(1)] [SRDescription("ImageDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ImageBrowserEditor), typeof(UITypeEditor))] public virtual string DesignerImagePath { get { return this.designerImagePath; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); if (value != null && value.Length > 0 && value.Contains(Path.DirectorySeparatorChar.ToString()) && Path.IsPathRooted(value)) { value = DesignerHelpers.GetRelativePath(ContainingTheme.ContainingFileDirectory, value); if (!DesignerHelpers.IsValidImageResource(this, ContainingTheme.ContainingFileDirectory, value)) throw new InvalidOperationException(DR.GetString(DR.Error_InvalidImageResource)); } this.designerImagePath = value; if (this.designerImage != null) { this.designerImage.Dispose(); this.designerImage = null; } } } [DispId(2)] [SRDescription("ForeColorDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color ForeColor { get { return this.foreColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.foreColor = value; if (this.foregroundPen != null) { this.foregroundPen.Dispose(); this.foregroundPen = null; } if (this.foregroundBrush != null) { this.foregroundBrush.Dispose(); this.foregroundBrush = null; } } } [DispId(3)] [SRDescription("BorderColorDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color BorderColor { get { return this.borderColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.borderColor = value; if (this.borderPen != null) { this.borderPen.Dispose(); this.borderPen = null; } } } [DispId(4)] [SRDescription("BorderStyleDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [TypeConverter(typeof(FilteredEnumConverter))] public virtual DashStyle BorderStyle { get { return this.borderStyle; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); if (value == DashStyle.Custom) throw new Exception(DR.GetString(DR.CustomStyleNotSupported)); this.borderStyle = value; if (this.borderPen != null) { this.borderPen.Dispose(); this.borderPen = null; } } } [DispId(5)] [SRDescription("BackColorStartDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color BackColorStart { get { return this.backColorStart; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.backColorStart = value; if (this.backgroundBrush != null) { this.backgroundBrush.Dispose(); this.backgroundBrush = null; } } } [DispId(6)] [SRDescription("BackColorEndDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color BackColorEnd { get { return this.backColorEnd; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.backColorEnd = value; if (this.backgroundBrush != null) { this.backgroundBrush.Dispose(); this.backgroundBrush = null; } } } [DispId(7)] [SRDescription("BackgroundStyleDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] public virtual LinearGradientMode BackgroundStyle { get { return this.backgroundStyle; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.backgroundStyle = value; if (this.backgroundBrush != null) { this.backgroundBrush.Dispose(); this.backgroundBrush = null; } } } #endregion #region Helper Properties [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen ForegroundPen { get { if (this.foregroundPen == null) this.foregroundPen = new Pen(this.foreColor, BorderWidth); return this.foregroundPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush ForegroundBrush { get { if (this.foregroundBrush == null) this.foregroundBrush = new SolidBrush(this.foreColor); return this.foregroundBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen BorderPen { get { if (this.borderPen == null) { this.borderPen = new Pen(this.borderColor, BorderWidth); this.borderPen.DashStyle = this.borderStyle; } return this.borderPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush GetBackgroundBrush(Rectangle rectangle) { if (this.backgroundBrush == null || this.backgroundBrushRect != rectangle) { if (this.backgroundBrush != null) this.backgroundBrush.Dispose(); this.backgroundBrushRect = rectangle; if (this.backColorStart == this.backColorEnd) this.backgroundBrush = new SolidBrush(this.backColorStart); else this.backgroundBrush = new LinearGradientBrush(this.backgroundBrushRect, this.backColorStart, this.backColorEnd, this.backgroundStyle); } return this.backgroundBrush; } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Size Size { get { return ActivityDesignerTheme.DesignerSizes[(int)ContainingTheme.AmbientTheme.DesignerSize]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public DesignerGeometry DesignerGeometry { get { if (ContainingTheme.AmbientTheme.DrawRounded) return DesignerGeometry.RoundedRectangle; else return DesignerGeometry.Rectangle; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Image DesignerImage { get { if (this.designerImage == null && this.designerImagePath.Length > 0) this.designerImage = DesignerHelpers.GetImageFromPath(this, ContainingTheme.ContainingFileDirectory, this.designerImagePath); return this.designerImage; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Size ImageSize { get { return ActivityDesignerTheme.ImageSizes[(int)ContainingTheme.AmbientTheme.DesignerSize]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Font Font { get { return ContainingTheme.AmbientTheme.Font; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Font BoldFont { get { return ContainingTheme.AmbientTheme.BoldFont; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public int BorderWidth { get { return ContainingTheme.AmbientTheme.BorderWidth; } } public override void OnAmbientPropertyChanged(AmbientProperty ambientProperty) { if (ambientProperty == AmbientProperty.DesignerSize) { ForeColor = this.foreColor; BorderColor = this.borderColor; } else if (ambientProperty == AmbientProperty.OperatingSystemSetting) { ApplySystemColors(); } } private void ApplySystemColors() { ForeColor = SystemColors.ControlText; BorderColor = SystemColors.ControlDark; BackColorStart = SystemColors.Control; BackColorEnd = SystemColors.ControlLight; } #endregion #region IPropertyValueProvider Implementation internal override ICollection GetPropertyValues(ITypeDescriptorContext context) { object[] values = new object[]{}; if (string.Equals(context.PropertyDescriptor.Name, "BorderStyle", StringComparison.Ordinal)) values = new object[] { DashStyle.Solid, DashStyle.Dash, DashStyle.DashDot, DashStyle.DashDotDot, DashStyle.Dot }; return values; } #endregion } #endregion #region Class CompositeDesignerTheme public class CompositeDesignerTheme : ActivityDesignerTheme { #region Static Members internal static readonly Pen ExpandButtonForegoundPen = new Pen(Color.Black, 1); internal static readonly Pen ExpandButtonBorderPen = new Pen(Color.FromArgb(123, 154, 181), 1); private static readonly Size[] ExpandButtonSizes = new Size[] { new Size(8, 8), new Size(8, 8), new Size(12, 12) }; private static readonly Size[] ConnectorSizes = new Size[] { new Size(15, 30), new Size(15, 19), new Size(25, 50) }; #endregion #region Members and Constructor //Members private DesignerContentAlignment watermar----gnment = DesignerContentAlignment.BottomRight; private string watermarkImagePath = String.Empty; private bool dropShadow = false; private LineAnchor startCap = LineAnchor.None; private LineAnchor endCap = LineAnchor.ArrowAnchor; //Temporary variables private Brush expandButtonBackBrush; private Rectangle expandButtonRectangle = Rectangle.Empty; private Image watermarkImage; public CompositeDesignerTheme(WorkflowTheme theme) : base(theme) { } protected override void Dispose(bool disposing) { try { if (this.expandButtonBackBrush != null) { this.expandButtonBackBrush.Dispose(); this.expandButtonBackBrush = null; } if (this.watermarkImage != null) { this.watermarkImage.Dispose(); this.watermarkImage = null; } } finally { base.Dispose(disposing); } } public override void Initialize() { base.Initialize(); if (ContainingTheme.AmbientTheme.UseOperatingSystemSettings) ApplySystemColors(); } #endregion #region Publicly browsable Properties [DispId(8)] [SRDescription("WatermarkDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] [Editor(typeof(ImageBrowserEditor), typeof(UITypeEditor))] public virtual string WatermarkImagePath { get { return this.watermarkImagePath; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); if (!String.IsNullOrEmpty(value) && value.Contains(Path.DirectorySeparatorChar.ToString()) && Path.IsPathRooted(value)) { value = DesignerHelpers.GetRelativePath(ContainingTheme.ContainingFileDirectory, value); if (!DesignerHelpers.IsValidImageResource(this, ContainingTheme.ContainingFileDirectory, value)) throw new InvalidOperationException(DR.GetString(DR.Error_InvalidImageResource)); } this.watermarkImagePath = value; if (this.watermarkImage != null) { this.watermarkImage.Dispose(); this.watermarkImage = null; } } } [DispId(9)] [DefaultValue(DesignerContentAlignment.BottomRight)] [SRDescription("Watermar----gnmentDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] public virtual DesignerContentAlignment Watermar----gnment { get { return this.watermar----gnment; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.watermar----gnment = value; } } [DefaultValue(false)] [DispId(10)] [SRDescription("DropShadowDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] public virtual bool ShowDropShadow { get { return this.dropShadow; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.dropShadow = value; } } [DefaultValue(LineAnchor.None)] [DispId(11)] [SRDescription("ConnectorStartCapDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] public virtual LineAnchor ConnectorStartCap { get { return this.startCap; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.startCap = value; } } [DefaultValue(LineAnchor.ArrowAnchor)] [DispId(12)] [SRDescription("ConnectorEndCapDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] public virtual LineAnchor ConnectorEndCap { get { return this.endCap; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.endCap = value; } } #endregion #region Helper Methods [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public virtual Size ConnectorSize { get { if (DesignerType != null && typeof(FreeformActivityDesigner).IsAssignableFrom(DesignerType)) { int connectorSize = CompositeDesignerTheme.ConnectorSizes[(int)ContainingTheme.AmbientTheme.DesignerSize].Height; return new Size(connectorSize, connectorSize); } else { return CompositeDesignerTheme.ConnectorSizes[(int)ContainingTheme.AmbientTheme.DesignerSize]; } } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public virtual Size ExpandButtonSize { get { return CompositeDesignerTheme.ExpandButtonSizes[(int)ContainingTheme.AmbientTheme.DesignerSize]; } } public Brush GetExpandButtonBackgroundBrush(Rectangle rectangle) { if (this.expandButtonBackBrush == null || this.expandButtonRectangle != rectangle) { if (this.expandButtonBackBrush != null) this.expandButtonBackBrush.Dispose(); this.expandButtonRectangle = rectangle; this.expandButtonBackBrush = new LinearGradientBrush(this.expandButtonRectangle, Color.White, Color.FromArgb(173, 170, 156), LinearGradientMode.ForwardDiagonal); } return this.expandButtonBackBrush; } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Image WatermarkImage { get { if (this.watermarkImage == null && this.watermarkImagePath.Length > 0) this.watermarkImage = DesignerHelpers.GetImageFromPath(this, ContainingTheme.ContainingFileDirectory, this.watermarkImagePath); return this.watermarkImage; } } public override void OnAmbientPropertyChanged(AmbientProperty ambientProperty) { base.OnAmbientPropertyChanged(ambientProperty); if (ambientProperty == AmbientProperty.OperatingSystemSetting) ApplySystemColors(); } private void ApplySystemColors() { //the root designers should be transparent... BackColorStart = Color.Empty; BackColorEnd = Color.Empty; } #endregion } #endregion #region Class ActivityPreviewDesignerTheme public class ActivityPreviewDesignerTheme: CompositeDesignerTheme { #region Static Members internal static readonly Bitmap LeftScrollImage = DR.GetImage(DR.MoveLeft) as Bitmap; internal static readonly Bitmap LeftScrollImageUp = DR.GetImage(DR.MoveLeftUp) as Bitmap; internal static readonly Bitmap RightScrollImage = DR.GetImage(DR.MoveRight) as Bitmap; internal static readonly Bitmap RightScrollImageUp = DR.GetImage(DR.MoveRightUp) as Bitmap; internal static readonly Bitmap PreviewButtonImage = DR.GetImage(DR.PreviewModeIcon) as Bitmap; internal static readonly Bitmap EditButtonImage = DR.GetImage(DR.EditModeIcon) as Bitmap; internal static readonly Bitmap PreviewImage = DR.GetImage(DR.PreviewIndicator) as Bitmap; private static readonly Size[] ItemSizes = new Size[] { new Size(20, 20), new Size(20, 20), new Size(30, 30) }; private static readonly Size[] PreviewButtonSizes = new Size[] { new Size(16, 16), new Size(16, 16), new Size(20, 20) }; private static readonly Size[] PreviewWindowSizes = new Size[] { new Size(172, 120), new Size(172, 120), new Size(212, 160) }; private const int DefaultItemCount = 5; #endregion #region Members private Color previewForeColor = Color.WhiteSmoke; private Color previewBackColor = Color.White; private Color previewBorderColor = Color.Gray; //Temporary members private Brush previewForegroundBrush; private Brush previewBackgroundBrush; private Pen previewBorderPen; public ActivityPreviewDesignerTheme(WorkflowTheme theme) : base(theme) { } protected override void Dispose(bool disposing) { try { if (this.previewForegroundBrush != null) { this.previewForegroundBrush.Dispose(); this.previewForegroundBrush = null; } if (this.previewBackgroundBrush != null) { this.previewBackgroundBrush.Dispose(); this.previewBackgroundBrush = null; } if (this.previewBorderPen != null) { this.previewBorderPen.Dispose(); this.previewBorderPen = null; } } finally { base.Dispose(disposing); } } public override void Initialize() { base.Initialize(); if (ContainingTheme.AmbientTheme.UseOperatingSystemSettings) ApplySystemColors(); } #endregion #region Publicly browsable Properties [DispId(13)] [SRDescription("PreviewForeColorDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public Color PreviewForeColor { get { return this.previewForeColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.previewForeColor = value; if (this.previewForegroundBrush != null) { this.previewForegroundBrush.Dispose(); this.previewForegroundBrush = null; } } } [DispId(14)] [SRDescription("PreviewBackColorDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public Color PreviewBackColor { get { return this.previewBackColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.previewBackColor = value; if (this.previewBackgroundBrush != null) { this.previewBackgroundBrush.Dispose(); this.previewBackgroundBrush = null; } } } [DispId(15)] [SRDescription("PreviewBorderColorDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public Color PreviewBorderColor { get { return this.previewBorderColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.previewBorderColor = value; if (this.previewBorderPen != null) { this.previewBorderPen.Dispose(); this.previewBorderPen = null; } } } #endregion #region Helper Properties [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Size PreviewItemSize { get { return ActivityPreviewDesignerTheme.ItemSizes[(int)ContainingTheme.AmbientTheme.DesignerSize]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal int PreviewItemCount { get { return ActivityPreviewDesignerTheme.DefaultItemCount; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Size PreviewWindowSize { get { return ActivityPreviewDesignerTheme.PreviewWindowSizes[(int)ContainingTheme.AmbientTheme.DesignerSize]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Size PreviewButtonSize { get { return ActivityPreviewDesignerTheme.PreviewButtonSizes[(int)ContainingTheme.AmbientTheme.DesignerSize]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Pen PreviewBorderPen { get { if (this.previewBorderPen == null) this.previewBorderPen = new Pen(this.previewBorderColor, BorderWidth); return this.previewBorderPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Brush PreviewForegroundBrush { get { if (this.previewForegroundBrush == null) this.previewForegroundBrush = new SolidBrush(this.previewForeColor); return this.previewForegroundBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Brush PreviewBackgroundBrush { get { if (this.previewBackgroundBrush == null) this.previewBackgroundBrush = new SolidBrush(this.previewBackColor); return this.previewBackgroundBrush; } } public override void OnAmbientPropertyChanged(AmbientProperty ambientProperty) { base.OnAmbientPropertyChanged(ambientProperty); if (ambientProperty == AmbientProperty.DesignerSize) PreviewBorderColor = this.previewBorderColor; else if (ambientProperty == AmbientProperty.OperatingSystemSetting) ApplySystemColors(); } private void ApplySystemColors() { PreviewForeColor = SystemColors.ButtonFace; PreviewBackColor = SystemColors.Window; PreviewBorderColor = SystemColors.ControlDarkDark; BorderColor = SystemColors.ControlDarkDark; } #endregion } #endregion #region Class AmbientTheme public class AmbientTheme : DesignerTheme { #region Constants which wont change internal const float WatermarkTransparency = 0.25f; internal const int ArcDiameter = 8; internal const int DropShadowWidth = 4; internal static Color TransparentColor = Color.FromArgb(255, 0, 255); internal static readonly Image ConfigErrorImage = DR.GetImage(DR.ConfigError); internal static readonly Image ScrollIndicatorImage = DR.GetImage(DR.ArrowLeft); internal static readonly Image DropIndicatorImage = DR.GetImage(DR.DropShapeShort); internal static readonly Image LockImage = DR.GetImage(DR.PreviewIndicator); internal static readonly Image ReadOnlyImage = DR.GetImage(DR.ReadOnly); internal static readonly Pen SmartTagBorderPen = new Pen(Color.Black, 1); internal static readonly Pen MagnifierPen = new Pen(Color.Black, 2); internal static readonly Pen WorkflowBorderPen = new Pen(Color.FromArgb(127, 157, 185), 1); internal static readonly Brush WorkspaceBackgroundBrush = new SolidBrush(Color.FromArgb(234, 234, 236)); internal static readonly Brush FadeBrush = new SolidBrush(Color.FromArgb(120, 255, 255, 255)); internal static readonly Brush DisabledBrush = new SolidBrush(Color.FromArgb(40, Color.Gray)); internal static readonly Brush PageShadowBrush = new SolidBrush(Color.FromArgb(75, 75, 75)); internal const float ScrollIndicatorTransparency = 0.7f; internal static readonly Size DragImageMargins = new Size(4, 4); internal static readonly Size DragImageTextSize = new Size(100, 60); internal static readonly Size DragImageIconSize = new Size(16, 16); internal const int MinZoom = 10; internal const int MaxZoom = 400; internal const int ScrollUnit = 25; internal const int MinShadowDepth = 0; internal const int MaxShadowDepth = 8; private static float[] fontSizes = null; private static readonly Size[] GridSizes = new Size[] { new Size(30, 30), new Size(40, 40), new Size(60, 60) }; private static readonly Size[] MarginSizes = new Size[] { new Size(2, 2), new Size(4, 4), new Size(6, 6) }; private static readonly Size[] SelectionSizes = new Size[] { new Size(2, 2), new Size(4, 4), new Size(6, 6) }; private static readonly Size[] GlyphSizes = new Size[] { new Size(10, 10), new Size(14, 14), new Size(18, 18) }; private static readonly Size[] ScrollIndicatorSizes = new Size[] { new Size(24, 24), new Size(32, 32), new Size(40, 40) }; private static readonly Size[] DropIndicatorSizes = new Size[] { new Size(8, 8), new Size(12, 12), new Size(16, 16) }; private static readonly Size[] MagnifierSizes = new Size[] { new Size(50, 50), new Size(100, 100), new Size(150, 150) }; private static readonly int[] BorderWidths = new int[] { 1, 1, 3 }; private const int DefaultShadowDepth = 6; #endregion private static float[] FontSizes { get { if (fontSizes == null) fontSizes = new float[] { WorkflowTheme.GetDefaultFont().SizeInPoints - 2.0f, WorkflowTheme.GetDefaultFont().SizeInPoints, WorkflowTheme.GetDefaultFont().SizeInPoints + 2.0f }; return fontSizes; } } #region Members //General category private bool useOperatingSystemSettings = false; private bool showConfigErrors = true; private bool drawShadow = false; //Advanced private bool drawGrayscale = false; private Color dropIndicatorColor = Color.Green; private Color selectionForeColor = Color.Blue; private Color selectionPatternColor = Color.DarkGray; private Color foreColor = Color.Gray; private Color backColor = Color.White; private Color commentIndicatorColor = Color.FromArgb(49, 198, 105); private Color readonlyIndicatorColor = Color.Gray; private DesignerContentAlignment watermar----gnment = DesignerContentAlignment.BottomRight; private string watermarkImagePath = String.Empty; private bool useDefaultFont = false; //Grid private bool showGrid = false; private DashStyle gridStyle = DashStyle.Dash; private Color gridColor = Color.FromArgb(192, 192, 192); //Font private string fontName = WorkflowTheme.GetDefaultFont().FontFamily.Name; private TextQuality textQuality = TextQuality.Aliased; //Designer private DesignerSize designerStyle = DesignerSize.Medium; private bool drawRounded = true; private bool showDesignerBorder = true; #endregion #region Resource Members private Font font; private Font boldFont; private Pen foregroundPen; private Pen selectionForegroundPen; private Pen selectionPatternPen; private Pen majorGridPen; private Pen minorGridPen; private Pen dropIndicatorPen; private Pen commentIndicatorPen; private Brush backgroundBrush; private Brush foregroundBrush; private Brush selectionForegroundBrush; private Brush dropIndicatorBrush; private Brush commentIndicatorBrush; private Brush readonlyIndicatorBrush; private Brush majorGridBrush; private Brush minorGridBrush; private Image watermarkImage; #endregion public AmbientTheme(WorkflowTheme theme) : base(theme) { } protected override void Dispose(bool disposing) { try { //We stop listening to OS setting events UseOperatingSystemSettings = false; if (this.font != null) { this.font.Dispose(); this.font = null; } if (this.boldFont != null) { this.boldFont.Dispose(); this.boldFont = null; } if (this.watermarkImage != null) { this.watermarkImage.Dispose(); this.watermarkImage = null; } if (this.foregroundPen != null) { this.foregroundPen.Dispose(); this.foregroundPen = null; } if (this.foregroundBrush != null) { this.foregroundBrush.Dispose(); this.foregroundBrush = null; } if (this.backgroundBrush != null) { this.backgroundBrush.Dispose(); this.backgroundBrush = null; } if (this.dropIndicatorPen != null) { this.dropIndicatorPen.Dispose(); this.dropIndicatorPen = null; } if (this.selectionPatternPen != null) { this.selectionPatternPen.Dispose(); this.selectionPatternPen = null; } if (this.selectionForegroundPen != null) { this.selectionForegroundPen.Dispose(); this.selectionForegroundPen = null; } if (this.majorGridPen != null) { this.majorGridPen.Dispose(); this.majorGridPen = null; } if (this.majorGridBrush != null) { this.majorGridBrush.Dispose(); this.majorGridBrush = null; } if (this.minorGridPen != null) { this.minorGridPen.Dispose(); this.minorGridPen = null; } if (this.minorGridBrush != null) { this.minorGridBrush.Dispose(); this.minorGridBrush = null; } if (this.commentIndicatorPen != null) { this.commentIndicatorPen.Dispose(); this.commentIndicatorPen = null; } if (this.commentIndicatorBrush != null) { this.commentIndicatorBrush.Dispose(); this.commentIndicatorBrush = null; } if (this.readonlyIndicatorBrush != null) { this.readonlyIndicatorBrush.Dispose(); this.readonlyIndicatorBrush = null; } if (this.dropIndicatorBrush != null) { this.dropIndicatorBrush.Dispose(); this.dropIndicatorBrush = null; } if (this.selectionForegroundBrush != null) { this.selectionForegroundBrush.Dispose(); this.selectionForegroundBrush = null; } } finally { base.Dispose(disposing); } } public override void Initialize() { base.Initialize(); if (this.useOperatingSystemSettings) ApplySystemColors(); } #region Publicly browsable Properties #region General Properties [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public virtual bool UseOperatingSystemSettings { get { return this.useOperatingSystemSettings; } internal set { this.useOperatingSystemSettings = value; if (this.useOperatingSystemSettings) { SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(OnOperatingSystemSettingsChanged); OnOperatingSystemSettingsChanged(this, new UserPreferenceChangedEventArgs(UserPreferenceCategory.Color)); } else { SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(OnOperatingSystemSettingsChanged); } } } [DispId(1)] [SRDescription("FontDesc", DR.ResourceSet)] [SRCategory("WorkflowAppearanceCategory", DR.ResourceSet)] [TypeConverter(typeof(FontFamilyConverter))] public virtual string FontName { get { return this.fontName; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); if (value == null || value.Length == 0) throw new Exception(DR.GetString(DR.EmptyFontFamilyNotSupported)); try { Font font = new Font(value, FontSize); if (font != null) font.Dispose(); } catch (Exception e) { throw new Exception(DR.GetString(DR.FontFamilyNotSupported, value), e); } this.fontName = value; if (this.font != null) { this.font.Dispose(); this.font = null; } if (this.boldFont != null) { this.boldFont.Dispose(); this.boldFont = null; } } } [DefaultValue(TextQuality.Aliased)] [DispId(2)] [SRDescription("TextQualityDesc", DR.ResourceSet)] [SRCategory("WorkflowAppearanceCategory", DR.ResourceSet)] public virtual TextQuality TextQuality { get { return this.textQuality; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.textQuality = value; } } [DispId(3)] [DefaultValue(true)] [SRDescription("ShowConfigErrorDesc", DR.ResourceSet)] [SRCategory("WorkflowAppearanceCategory", DR.ResourceSet)] public virtual bool ShowConfigErrors { get { return this.showConfigErrors; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.showConfigErrors = value; } } [DefaultValue(false)] [DispId(6)] [SRDescription("GrayscaleWorkflowDesc", DR.ResourceSet)] [SRCategory("WorkflowAppearanceCategory", DR.ResourceSet)] public virtual bool DrawGrayscale { get { return this.drawGrayscale; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.drawGrayscale = value; } } #endregion #region Workflow Foreground Properties [DispId(7)] [SRDescription("DropHiliteDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color DropIndicatorColor { get { return this.dropIndicatorColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.dropIndicatorColor = value; if (this.dropIndicatorPen != null) { this.dropIndicatorPen.Dispose(); this.dropIndicatorPen = null; } if (this.dropIndicatorBrush != null) { this.dropIndicatorBrush.Dispose(); this.dropIndicatorBrush = null; } } } [DispId(8)] [SRDescription("SelectionForegroundDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color SelectionForeColor { get { return this.selectionForeColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.selectionForeColor = value; if (this.selectionForegroundPen != null) { this.selectionForegroundPen.Dispose(); this.selectionForegroundPen = null; } if (this.selectionForegroundBrush != null) { this.selectionForegroundBrush.Dispose(); this.selectionForegroundBrush = null; } } } [DispId(9)] [SRDescription("SelectionPatternDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color SelectionPatternColor { get { return this.selectionPatternColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.selectionPatternColor = value; if (this.selectionPatternPen != null) { this.selectionPatternPen.Dispose(); this.selectionPatternPen = null; } } } [DispId(10)] [SRDescription("WorkflowForegroundDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color ForeColor { get { return this.foreColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.foreColor = value; if (this.foregroundPen != null) { this.foregroundPen.Dispose(); this.foregroundPen = null; } if (this.foregroundBrush != null) { this.foregroundBrush.Dispose(); this.foregroundBrush = null; } } } [DispId(11)] [SRDescription("CommentColorDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color CommentIndicatorColor { get { return this.commentIndicatorColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.commentIndicatorColor = value; if (this.commentIndicatorPen != null) { this.commentIndicatorPen.Dispose(); this.commentIndicatorPen = null; } if (this.commentIndicatorBrush != null) { this.commentIndicatorBrush.Dispose(); this.commentIndicatorBrush = null; } } } [DispId(12)] [SRDescription("LockColorDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color ReadonlyIndicatorColor { get { return this.readonlyIndicatorColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.readonlyIndicatorColor = value; if (this.readonlyIndicatorBrush != null) { this.readonlyIndicatorBrush.Dispose(); this.readonlyIndicatorBrush = null; } } } #endregion #region Workflow Background Properties [DispId(13)] [SRDescription("WorkflowBackgroundDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color BackColor { get { return this.backColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.backColor = value; if (this.backgroundBrush != null) { this.backgroundBrush.Dispose(); this.backgroundBrush = null; } } } [DefaultValue(false)] [DispId(14)] [SRDescription("WorkflowShadowDesc", DR.ResourceSet)] [SRCategory("WorkflowAppearanceCategory", DR.ResourceSet)] public virtual bool DrawShadow { get { return this.drawShadow; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.drawShadow = value; } } [DispId(15)] [SRDescription("WorkflowWatermarkDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] [Editor(typeof(ImageBrowserEditor), typeof(UITypeEditor))] public virtual string WatermarkImagePath { get { return this.watermarkImagePath; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); if (!String.IsNullOrEmpty(value) && value.Contains(Path.DirectorySeparatorChar.ToString()) && Path.IsPathRooted(value)) { value = DesignerHelpers.GetRelativePath(ContainingTheme.ContainingFileDirectory, value); if (!DesignerHelpers.IsValidImageResource(this, ContainingTheme.ContainingFileDirectory, value)) throw new InvalidOperationException(DR.GetString(DR.Error_InvalidImageResource)); } this.watermarkImagePath = value; if (this.watermarkImage != null) { this.watermarkImage.Dispose(); this.watermarkImage = null; } } } [DispId(16)] [DefaultValue(DesignerContentAlignment.BottomRight)] [SRDescription("Watermar----gnmentDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] public virtual DesignerContentAlignment Watermar----gnment { get { return this.watermar----gnment; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.watermar----gnment = value; } } [DefaultValue(false)] [DispId(17)] [SRDescription("ShowGridDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] public virtual bool ShowGrid { get { return this.showGrid; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.showGrid = value; } } [DefaultValue(DashStyle.Dash)] [DispId(18)] [SRDescription("GridStyleDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] public virtual DashStyle GridStyle { get { return this.gridStyle; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.gridStyle = value; if (this.majorGridPen != null) { this.majorGridPen.Dispose(); this.majorGridPen = null; } if (this.minorGridPen != null) { this.minorGridPen.Dispose(); this.minorGridPen = null; } } } [DispId(19)] [SRDescription("GridColorDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color GridColor { get { return this.gridColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.gridColor = value; if (this.majorGridPen != null) { this.majorGridPen.Dispose(); this.majorGridPen = null; } if (this.majorGridBrush != null) { this.majorGridBrush.Dispose(); this.majorGridBrush = null; } if (this.minorGridPen != null) { this.minorGridPen.Dispose(); this.minorGridPen = null; } if (this.minorGridBrush != null) { this.minorGridBrush.Dispose(); this.minorGridBrush = null; } } } #endregion #endregion #region Activity Appearance Properties // [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [DefaultValue(DesignerSize.Medium)] [DispId(20)] [SRDescription("DesignerSizeDesc", DR.ResourceSet)] [SRCategory("ActivityAppearanceCategory", DR.ResourceSet)] public virtual DesignerSize DesignerSize { get { return this.designerStyle; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.designerStyle = value; ContainingTheme.AmbientPropertyChanged(AmbientProperty.DesignerSize); } } [DefaultValue(true)] [DispId(21)] [SRDescription("DrawRoundedDesignersDesc", DR.ResourceSet)] [SRCategory("ActivityAppearanceCategory", DR.ResourceSet)] public virtual bool DrawRounded { get { return this.drawRounded; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.drawRounded = value; } } [DefaultValue(true)] [DispId(24)] [SRDescription("DesignerBorderDesc", DR.ResourceSet)] [SRCategory("ActivityAppearanceCategory", DR.ResourceSet)] public virtual bool ShowDesignerBorder { get { return this.showDesignerBorder; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.showDesignerBorder = value; } } #endregion #region Helper Properties and Methods [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public virtual Size Margin { get { return AmbientTheme.MarginSizes[(int) this.designerStyle]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public virtual Size SelectionSize { get { return AmbientTheme.SelectionSizes[(int) this.designerStyle]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public virtual Size GlyphSize { get { return AmbientTheme.GlyphSizes[(int)this.designerStyle]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Size ScrollIndicatorSize { get { return AmbientTheme.ScrollIndicatorSizes[(int) this.designerStyle]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Size DropIndicatorSize { get { return AmbientTheme.DropIndicatorSizes[(int) this.designerStyle]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Size MagnifierSize { get { return AmbientTheme.MagnifierSizes[(int) this.designerStyle]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal int ShadowDepth { get { return ((this.drawShadow) ? AmbientTheme.DefaultShadowDepth : 0); } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public virtual Size GridSize { get { return AmbientTheme.GridSizes[(int) this.designerStyle]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public virtual int BorderWidth { get { return AmbientTheme.BorderWidths[(int)ContainingTheme.AmbientTheme.DesignerSize]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen MajorGridPen { get { if (this.majorGridPen == null) { this.majorGridPen = new Pen(this.gridColor, 1); this.majorGridPen.DashStyle = DashStyle.Dash; } return this.majorGridPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush MajorGridBrush { get { if (this.majorGridBrush == null) this.majorGridBrush = new SolidBrush(this.gridColor); return this.majorGridBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen MinorGridPen { get { if (this.minorGridPen == null) { Color minorGridColor = Color.FromArgb(this.gridColor.A, Math.Min(this.gridColor.R + 32, 255), Math.Min(this.gridColor.G + 32, 255), Math.Min(this.gridColor.B + 32, 255)); this.minorGridPen = new Pen(minorGridColor, 1); this.minorGridPen.DashStyle = DashStyle.Dot; } return this.minorGridPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Brush MinorGridBrush { get { if (this.minorGridBrush == null) { Color minorGridColor = Color.FromArgb(this.gridColor.A, Math.Min(this.gridColor.R + 32, 255), Math.Min(this.gridColor.G + 32, 255), Math.Min(this.gridColor.B + 32, 255)); this.minorGridBrush = new SolidBrush(minorGridColor); } return this.minorGridBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen SelectionPatternPen { get { if (this.selectionPatternPen == null) { this.selectionPatternPen = new Pen(this.selectionPatternColor, 1); this.selectionPatternPen.DashStyle = DashStyle.Dot; } return this.selectionPatternPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen SelectionForegroundPen { get { if (this.selectionForegroundPen == null) this.selectionForegroundPen = new Pen(this.selectionForeColor, 1); return this.selectionForegroundPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush SelectionForegroundBrush { get { if (this.selectionForegroundBrush == null) this.selectionForegroundBrush = new SolidBrush(this.selectionForeColor); return this.selectionForegroundBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen DropIndicatorPen { get { if (this.dropIndicatorPen == null) this.dropIndicatorPen = new Pen(this.dropIndicatorColor, BorderWidth); return this.dropIndicatorPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush DropIndicatorBrush { get { if (this.dropIndicatorBrush == null) this.dropIndicatorBrush = new SolidBrush(this.dropIndicatorColor); return this.dropIndicatorBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen ForegroundPen { get { if (this.foregroundPen == null) { this.foregroundPen = new Pen(this.foreColor, 1); this.foregroundPen.DashStyle = DashStyle.Dot; } return this.foregroundPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen CommentIndicatorPen { get { if (this.commentIndicatorPen == null) this.commentIndicatorPen = new Pen(this.commentIndicatorColor, 1); return this.commentIndicatorPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush CommentIndicatorBrush { get { if (this.commentIndicatorBrush == null) this.commentIndicatorBrush = new SolidBrush(Color.FromArgb(40, this.commentIndicatorColor)); return this.commentIndicatorBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush ReadonlyIndicatorBrush { get { if (this.readonlyIndicatorBrush == null) this.readonlyIndicatorBrush = new SolidBrush(Color.FromArgb(20, this.readonlyIndicatorColor)); return this.readonlyIndicatorBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush ForegroundBrush { get { if (this.foregroundBrush == null) this.foregroundBrush = new SolidBrush(this.foreColor); return this.foregroundBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush BackgroundBrush { get { if (this.backgroundBrush == null) this.backgroundBrush = new SolidBrush(this.backColor); return this.backgroundBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Image WorkflowWatermarkImage { get { if (this.watermarkImage == null && this.watermarkImagePath.Length > 0) this.watermarkImage = DesignerHelpers.GetImageFromPath(this, ContainingTheme.ContainingFileDirectory, this.watermarkImagePath); return this.watermarkImage; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Font Font { get { if (this.font == null) { Debug.Assert(this.fontName != null && this.fontName.Length > 0); if (this.fontName == null || this.fontName.Length == 0) this.fontName = WorkflowTheme.GetDefaultFont().FontFamily.Name; ArrayList supportedFonts = new ArrayList(AmbientTheme.SupportedFonts); Debug.Assert(supportedFonts.Contains(this.fontName)); if (!supportedFonts.Contains(this.fontName)) this.fontName = WorkflowTheme.GetDefaultFont().FontFamily.Name; this.font = new Font(this.fontName, FontSize); } return this.font; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Font BoldFont { get { if (this.boldFont == null) { Debug.Assert(this.fontName != null && this.fontName.Length > 0); if (this.fontName == null || this.fontName.Length == 0) this.fontName = WorkflowTheme.GetDefaultFont().FontFamily.Name; ArrayList supportedFonts = new ArrayList(AmbientTheme.SupportedFonts); Debug.Assert(supportedFonts.Contains(this.fontName)); if (!supportedFonts.Contains(this.fontName)) this.fontName = WorkflowTheme.GetDefaultFont().FontFamily.Name; this.boldFont = new Font(this.fontName, FontSize, FontStyle.Bold); } return this.boldFont; } } [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] private float FontSize { get { // if (this.useOperatingSystemSettings) return SystemInformation.MenuFont.SizeInPoints; else return AmbientTheme.FontSizes[(int) this.DesignerSize]; } } internal void UseDefaultFont() { this.useDefaultFont = true; } internal void UpdateFont() { if (this.useDefaultFont) { bool oldReadOnly = ReadOnly; ReadOnly = false; this.FontName = WorkflowTheme.GetDefaultFont().FontFamily.Name; ReadOnly = oldReadOnly; } } public override void OnAmbientPropertyChanged(AmbientProperty ambientProperty) { base.OnAmbientPropertyChanged(ambientProperty); if (ambientProperty == AmbientProperty.DesignerSize) { //We set the same properties again so that the pens and brushes are reset to //consider the new designer style for creation DropIndicatorColor = this.dropIndicatorColor; FontName = this.fontName; } else if (ambientProperty == AmbientProperty.OperatingSystemSetting) { //Apply the system colors ApplySystemColors(); } } internal static string[] SupportedFonts { get { ArrayList fontNames = new ArrayList(); foreach (FontFamily family in FontFamily.Families) fontNames.Add(family.Name); fontNames.Sort(CaseInsensitiveComparer.Default); return ((string[])fontNames.ToArray(typeof(string))); } } private void OnOperatingSystemSettingsChanged(object sender, UserPreferenceChangedEventArgs e) { if (e.Category == UserPreferenceCategory.Color || e.Category == UserPreferenceCategory.VisualStyle) { ContainingTheme.AmbientPropertyChanged(AmbientProperty.OperatingSystemSetting); WorkflowTheme.FireThemeChange(); } } private void ApplySystemColors() { DropIndicatorColor = SystemColors.HotTrack; SelectionForeColor = SystemColors.Highlight; SelectionPatternColor = SystemColors.Highlight; ForeColor = SystemColors.WindowText; CommentIndicatorColor = SystemColors.GrayText; ReadonlyIndicatorColor = SystemColors.GrayText; BackColor = SystemColors.Window; GridColor = SystemColors.InactiveBorder; FontName = WorkflowTheme.GetDefaultFont().FontFamily.Name; } #endregion #region IPropertyValueProvider Implementation internal override ICollection GetPropertyValues(ITypeDescriptorContext context) { object[] values = new object[]{}; if (string.Equals(context.PropertyDescriptor.Name, "GridStyle", StringComparison.Ordinal)) values = new object[] { DashStyle.Solid, DashStyle.Dash, DashStyle.Dot }; return values; } #endregion } #endregion #region TypeConverters, TypeDescriptors, PropertyDescriptors, UITypeEditors #region Class ThemeTypeDescriptor internal sealed class ThemeTypeConverter : ExpandableObjectConverter { public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(string) && context.PropertyDescriptor != null) return String.Empty; else return base.ConvertTo(context, culture, value, destinationType); } public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) { PropertyDescriptorCollection srcProperties = base.GetProperties(context, value, attributes); return srcProperties.Sort(new PropertyDescriptorSorter()); } #region Class PropertyDescriptorSorter private sealed class PropertyDescriptorSorter : IComparer { int IComparer.Compare(object obj1, object obj2) { PropertyDescriptor property1 = obj1 as PropertyDescriptor; PropertyDescriptor property2 = obj2 as PropertyDescriptor; DispIdAttribute prop1DispID = property1.Attributes[typeof(DispIdAttribute)] as DispIdAttribute; DispIdAttribute prop2DispID = property2.Attributes[typeof(DispIdAttribute)] as DispIdAttribute; if (prop1DispID == null) return 1; else if (prop2DispID == null) return -1; else return prop1DispID.Value - prop2DispID.Value; } } #endregion } #endregion #region Class ColorPickerConverter internal sealed class ColorPickerConverter : ColorConverter { public override bool GetStandardValuesSupported(ITypeDescriptorContext context) { return false; } } #endregion #region Class FilteredEnumConverter internal sealed class FilteredEnumConverter : PropertyValueProviderTypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { return (sourceType == typeof(string)); } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { return Enum.Parse(context.PropertyDescriptor.PropertyType, (string)value); } } #endregion #region Class FontFamilyConverter internal sealed class FontFamilyConverter : TypeConverter { public override bool GetStandardValuesSupported(ITypeDescriptorContext context) { return true; } public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) { return true; } public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { return new TypeConverter.StandardValuesCollection(AmbientTheme.SupportedFonts); } } #endregion #region Class ImageBrowserEditor internal sealed class ImageBrowserEditor : UITypeEditor { public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) { return UITypeEditorEditStyle.Modal; } public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) { OpenFileDialog fileDialog = new OpenFileDialog(); fileDialog.AddExtension = true; fileDialog.DefaultExt = WorkflowTheme.DefaultThemeFileExtension; fileDialog.CheckFileExists = true; fileDialog.Filter = DR.GetString(DR.ImageFileFilter); if (fileDialog.ShowDialog() == DialogResult.OK) return fileDialog.FileName; else return value; } } #endregion #region Class ColorPickerEditor internal sealed class ColorPickerEditor : UITypeEditor { public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) { return UITypeEditorEditStyle.Modal; } public override bool GetPaintValueSupported(ITypeDescriptorContext context) { return (context != null && context.PropertyDescriptor != null); } public override void PaintValue(PaintValueEventArgs e) { base.PaintValue(e); if (e.Value is Color) { Color selectedColor = (Color)e.Value; if (selectedColor != Color.Empty) { using (Brush fillBrush = new SolidBrush(selectedColor)) e.Graphics.FillRectangle(fillBrush, e.Bounds); } } } public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) { ColorDialog colorDialog = new ColorDialog(); colorDialog.AllowFullOpen = true; colorDialog.FullOpen = true; colorDialog.AnyColor = true; colorDialog.Color = (value is Color) ? (Color)value : Color.White; if (colorDialog.ShowDialog() == DialogResult.OK) return colorDialog.Color; else return value; } } #endregion #endregion #region Serializers #region Class ThemeSerializationProvider internal sealed class ThemeSerializationProvider : WorkflowMarkupSerializationProvider { #region IDesignerSerializationProvider Members public override object GetSerializer(IDesignerSerializationManager manager, object currentSerializer, Type objectType, Type serializerType) { if (serializerType.IsAssignableFrom(typeof(WorkflowMarkupSerializer))) { if (typeof(System.Drawing.Color) == objectType) return new ColorMarkupSerializer(); else if (typeof(Size) == objectType) return new SizeMarkupSerializer(); } return base.GetSerializer(manager, currentSerializer, objectType, serializerType); } #endregion } #endregion #endregion } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. namespace System.Workflow.ComponentModel.Design { using System; using System.IO; using System.Xml; using System.Text; using System.Drawing; using System.Resources; using System.Reflection; using System.Diagnostics; using System.Collections; using System.Drawing.Text; using System.Globalization; using System.Windows.Forms; using System.Drawing.Design; using System.ComponentModel; using System.Drawing.Drawing2D; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel.Design; using System.Collections.Specialized; using System.Runtime.InteropServices; using System.ComponentModel.Design.Serialization; using Microsoft.Win32; using System.Workflow.ComponentModel.Compiler; using System.Workflow.ComponentModel.Serialization; using System.Windows.Forms.Design; // #region WorkflowTheme Enums public enum ThemeType { Default = 0, System = 1, UserDefined = 2 } public enum DesignerGeometry { Rectangle = 0, RoundedRectangle = 1 } public enum TextQuality { Aliased = 0, AntiAliased = 1, } public enum DesignerSize { //Please note that this enum is used to access array and hence we need to //change all the arrays before changing this enum Small = 0, Medium = 1, Large = 2 } public enum DesignerContentAlignment { Left = 1, Top = 2, Right = 4, Bottom = 8, Center = 16, TopLeft = Left + Top, TopCenter = Center + Top, TopRight = Right + Top, CenterLeft = Left + Center, CenterRight = Right + Center, BottomLeft = Left + Bottom, BottomCenter = Center + Bottom, BottomRight = Right + Bottom, Fill = 32 } public enum LineAnchor { None = 0, Arrow = 1, ArrowAnchor = 2, Diamond = 3, DiamondAnchor = 4, Round = 5, RoundAnchor = 6, Rectangle = 7, RectangleAnchor = 8, RoundedRectangle = 9, RoundedRectangleAnchor = 10 } public enum AmbientProperty { DesignerSize = 0, OperatingSystemSetting = 1 } #endregion #region Class ActivityDesignerThemeAttribute [AttributeUsage(AttributeTargets.Class)] public sealed class ActivityDesignerThemeAttribute : Attribute { private Type designerThemeType = null; private string xml = String.Empty; public ActivityDesignerThemeAttribute(Type designerThemeType) { this.designerThemeType = designerThemeType; } public Type DesignerThemeType { get { return this.designerThemeType; } } public string Xml { get { return this.xml; } set { this.xml = value; } } } #endregion #region Class WorkflowTheme public sealed class WorkflowTheme : IDisposable { #region Static Members private static readonly string WorkflowThemesSubKey = "Themes"; private const string ThemeTypeKey = "ThemeType"; private const string ThemePathKey = "ThemeFilePath"; private const string ThemeResourceNS = "System.Workflow.ComponentModel.Design.ActivityDesignerThemes."; internal const string DefaultThemeFileExtension = "*.wtm"; internal static string DefaultNamespace = typeof(WorkflowTheme).Namespace.Replace(".", "_"); private static IUIService uiService = null;//cached session-wide ui service (for getting environment font) private static Font defaultFont = null; #endregion #region Members and Initialization private static WorkflowTheme currentTheme = null; private static bool enableChangeNotification = true; public static event System.EventHandler ThemeChanged; private ThemeType themeType = ThemeType.UserDefined; private string name = String.Empty; private string version = "1.0"; private string description = DR.GetString(DR.DefaultThemeDescription); private string filePath = String.Empty; private ThemeCollection designerThemes = new ThemeCollection(); private bool readOnly = false; static WorkflowTheme() { WorkflowTheme.currentTheme = LoadThemeSettingFromRegistry(); if (WorkflowTheme.currentTheme != null) WorkflowTheme.currentTheme.ReadOnly = true; } public WorkflowTheme() { this.filePath = WorkflowTheme.GenerateThemeFilePath(); if (this.filePath != null && this.filePath.Length > 0) this.name = Path.GetFileNameWithoutExtension(this.filePath); } ~WorkflowTheme() { Dispose(false); } void IDisposable.Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { //Dispose all the members first before doing anything with the resources foreach (DesignerTheme designerTheme in this.designerThemes) ((IDisposable)designerTheme).Dispose(); this.designerThemes.Clear(); } #endregion #region Static Properties and Methods internal static IUIService UIService { get { return WorkflowTheme.uiService; } set { WorkflowTheme.uiService = value; WorkflowTheme.defaultFont = null;//clear cached font WorkflowTheme.CurrentTheme.AmbientTheme.UpdateFont(); } } internal static Font GetDefaultFont() { if (WorkflowTheme.defaultFont == null) { if (WorkflowTheme.UIService != null) WorkflowTheme.defaultFont = WorkflowTheme.UIService.Styles["DialogFont"] as Font; if (WorkflowTheme.defaultFont == null) WorkflowTheme.defaultFont = Control.DefaultFont; } return defaultFont; } public static string RegistryKeyPath { get { return DesignerHelpers.DesignerPerUserRegistryKey + "\\" + WorkflowThemesSubKey; } } public static WorkflowTheme CurrentTheme { get { if (WorkflowTheme.currentTheme == null) { WorkflowTheme.currentTheme = CreateStandardTheme(ThemeType.Default); WorkflowTheme.currentTheme.ReadOnly = true; } return WorkflowTheme.currentTheme; } set { if (WorkflowTheme.currentTheme == value) return; if (value == null) throw new ArgumentNullException("value"); WorkflowTheme oldTheme = WorkflowTheme.currentTheme; WorkflowTheme.currentTheme = value; WorkflowTheme.currentTheme.ReadOnly = true; if (WorkflowTheme.EnableChangeNotification) { //We dont want to dispose the standard themes here if (oldTheme != null) { ((IDisposable)oldTheme).Dispose(); oldTheme = null; } FireThemeChange(); } } } public static bool EnableChangeNotification { get { return WorkflowTheme.enableChangeNotification; } set { if (WorkflowTheme.enableChangeNotification == value) return; WorkflowTheme.enableChangeNotification = value; } } public static string LookupPath { get { string path = string.Empty; try { path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); if (String.IsNullOrEmpty(path)) { Debug.Assert(false, "Install directory key is missing!"); path = new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath; } path = Path.Combine(path, "Windows Workflow Foundation" + Path.DirectorySeparatorChar + "Themes"); path += Path.DirectorySeparatorChar; } catch { } Debug.Assert(path != null && path.Length > 0); return path; } } public static string GenerateThemeFilePath() { string path = LookupPath; string tempThemePath = Path.Combine(path, DR.GetString(DR.MyFavoriteTheme) + ".wtm"); for (int i = 1; File.Exists(tempThemePath); i++) { tempThemePath = Path.Combine(path, DR.GetString(DR.MyFavoriteTheme) + i.ToString(CultureInfo.InvariantCulture) + ".wtm"); } return tempThemePath; } public static WorkflowTheme LoadThemeSettingFromRegistry() { WorkflowTheme loadedTheme = null; RegistryKey themeKey = Registry.CurrentUser.OpenSubKey(WorkflowTheme.RegistryKeyPath); if (themeKey != null) { ThemeType themeType = ThemeType.Default; try { object registryValue = themeKey.GetValue(WorkflowTheme.ThemeTypeKey); if (registryValue is string) themeType = (ThemeType) Enum.Parse(typeof(ThemeType), (string) registryValue, true); if (themeType == ThemeType.UserDefined) { registryValue = themeKey.GetValue(WorkflowTheme.ThemePathKey); string themePath = (registryValue is string) ? (string)registryValue : String.Empty; if (File.Exists(themePath)) { string extension = Path.GetExtension(themePath); if (extension.Equals(WorkflowTheme.DefaultThemeFileExtension.Replace("*", ""), StringComparison.Ordinal)) loadedTheme = WorkflowTheme.Load(themePath); } } } catch { //We eat the exception } finally { if (loadedTheme == null) { if (themeType == ThemeType.UserDefined) themeType = ThemeType.Default; loadedTheme = CreateStandardTheme(themeType); } themeKey.Close(); } } return loadedTheme; } public static void SaveThemeSettingToRegistry() { RegistryKey themeKey = Registry.CurrentUser.CreateSubKey(WorkflowTheme.RegistryKeyPath); if (themeKey != null) { try { themeKey.SetValue(WorkflowTheme.ThemeTypeKey, WorkflowTheme.CurrentTheme.themeType); if (WorkflowTheme.CurrentTheme.themeType == ThemeType.UserDefined) themeKey.SetValue(WorkflowTheme.ThemePathKey, WorkflowTheme.CurrentTheme.FilePath); else themeKey.SetValue(WorkflowTheme.ThemePathKey, String.Empty); } catch { //We eat the exception } finally { themeKey.Close(); } } } public static WorkflowTheme CreateStandardTheme(ThemeType standardThemeType) { WorkflowTheme theme = null; if (standardThemeType == ThemeType.Default) { theme = new WorkflowTheme(); theme.AmbientTheme.UseDefaultFont(); } else if (standardThemeType == ThemeType.System) { theme = new WorkflowTheme(); theme.AmbientTheme.UseOperatingSystemSettings = true; } else { return null; } string[] standardThemeParams = StandardThemes[standardThemeType] as string[]; Debug.Assert(standardThemeParams != null); if (standardThemeParams != null) { theme.Name = standardThemeParams[0]; theme.themeType = standardThemeType; theme.Description = standardThemeParams[1]; theme.FilePath = LookupPath; } return theme; } public static IDictionary StandardThemes { get { //DO NOT CHANGE THE ORDER OF THE THEMES ADDED BELOW Dictionary standardThemes = new Dictionary (); standardThemes.Add(ThemeType.Default, new string[] { DR.GetString(DR.DefaultTheme), DR.GetString(DR.DefaultThemeDescription) }); standardThemes.Add(ThemeType.System, new string[] { DR.GetString(DR.OSTheme), DR.GetString(DR.SystemThemeDescription) }); return standardThemes; } } internal static void FireThemeChange() { if (WorkflowTheme.ThemeChanged != null) WorkflowTheme.ThemeChanged(WorkflowTheme.currentTheme, EventArgs.Empty); } #endregion #region Load/Save public static WorkflowTheme Load(string themeFilePath) { DesignerSerializationManager serializationManager = new DesignerSerializationManager(); using (serializationManager.CreateSession()) return WorkflowTheme.Load(serializationManager, themeFilePath); } public static WorkflowTheme Load(IDesignerSerializationManager serializationManager, string themeFilePath) { if (serializationManager == null) throw new ArgumentNullException("serializationManager"); WorkflowTheme theme = null; if (themeFilePath != null && File.Exists(themeFilePath)) { XmlReader xmlReader = XmlReader.Create(themeFilePath); ThemeSerializationProvider themeSerializationProvider = new ThemeSerializationProvider(); try { serializationManager.AddSerializationProvider(themeSerializationProvider); WorkflowMarkupSerializer xomlSerializer = new WorkflowMarkupSerializer(); theme = xomlSerializer.Deserialize(serializationManager, xmlReader) as WorkflowTheme; } finally { serializationManager.RemoveSerializationProvider(themeSerializationProvider); xmlReader.Close(); } if (theme != null) theme.filePath = themeFilePath; } return theme; } public void Save(string themeFilePath) { if (themeFilePath == null || themeFilePath.Length == 0) throw new ArgumentException(DR.GetString(DR.ThemePathNotValid), "themeFilePath"); DesignerSerializationManager dsManager = new DesignerSerializationManager(); using (dsManager.CreateSession()) { WorkflowMarkupSerializationManager serializationManager = new WorkflowMarkupSerializationManager(dsManager); XmlWriter streamWriter = null; ThemeSerializationProvider themeSerializationProvider = new ThemeSerializationProvider(); try { string directory = Path.GetDirectoryName(themeFilePath); if (directory.Length > 0 && !Directory.Exists(directory)) Directory.CreateDirectory(directory); streamWriter = Helpers.CreateXmlWriter(themeFilePath); serializationManager.AddSerializationProvider(themeSerializationProvider); WorkflowMarkupSerializer xomlSerializer = new WorkflowMarkupSerializer(); xomlSerializer.Serialize(serializationManager, streamWriter, this); } finally { serializationManager.RemoveSerializationProvider(themeSerializationProvider); if (streamWriter != null) streamWriter.Close(); } this.filePath = themeFilePath; } } #endregion #region a-la ICloneable Members public WorkflowTheme Clone() { WorkflowTheme theme = null; DesignerSerializationManager serializationManager = new DesignerSerializationManager(); using (serializationManager.CreateSession()) { ThemeSerializationProvider themeSerializationProvider = new ThemeSerializationProvider(); StringWriter stringWriter = new StringWriter(new StringBuilder(), CultureInfo.InvariantCulture); StringReader stringReader = null; try { ((IDesignerSerializationManager)serializationManager).AddSerializationProvider(themeSerializationProvider); WorkflowMarkupSerializer xomlSerializer = new WorkflowMarkupSerializer(); using (XmlWriter xmlWriter = Helpers.CreateXmlWriter(stringWriter)) xomlSerializer.Serialize(serializationManager, xmlWriter, this); stringReader = new StringReader(stringWriter.ToString()); using (XmlReader xmlReader = XmlReader.Create(stringReader)) theme = xomlSerializer.Deserialize(serializationManager, xmlReader) as WorkflowTheme; } finally { ((IDesignerSerializationManager)serializationManager).RemoveSerializationProvider(themeSerializationProvider); stringReader.Close(); stringWriter.Close(); } } if (theme != null) { theme.filePath = this.filePath; //Now we go thru all the designer themes and call Initialize on them foreach (DesignerTheme designerTheme in theme.DesignerThemes) designerTheme.Initialize(); } return theme; } #endregion #region Public Properties and Methods public string Name { get { return this.name; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.name = value; } } public string Version { get { return this.version; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.version = value; } } public string Description { get { return this.description; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.description = value; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public string FilePath { get { return this.filePath; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.filePath = value; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public string ContainingFileDirectory { get { string directory = String.Empty; if (this.filePath.Length > 0) { try { directory = Path.GetDirectoryName(this.filePath) + Path.DirectorySeparatorChar; } catch { } } return directory; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public IList DesignerThemes { get { return this.designerThemes; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public AmbientTheme AmbientTheme { get { return GetTheme(typeof(WorkflowView)) as AmbientTheme; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public ActivityDesignerTheme GetDesignerTheme(ActivityDesigner designer) { if (designer == null) throw new ArgumentNullException("designer"); return GetTheme(designer.GetType()) as ActivityDesignerTheme; } internal DesignerTheme GetTheme(Type designerType) { bool wasReadOnly = ReadOnly; DesignerTheme designerTheme = (this.designerThemes.Contains(designerType.FullName)) ? this.designerThemes[designerType.FullName] : null; try { ReadOnly = false; if (designerTheme == null || (designerTheme.DesignerType != null && !designerType.Equals(designerTheme.DesignerType))) { //This means that the two types are not equal and hence we need to replace the theme bool replaceTheme = (designerTheme != null); AttributeCollection attributeCollection = TypeDescriptor.GetAttributes(designerType); ActivityDesignerThemeAttribute themeAttrib = attributeCollection[typeof(ActivityDesignerThemeAttribute)] as ActivityDesignerThemeAttribute; if (themeAttrib == null) throw new InvalidOperationException(DR.GetString(DR.Error_ThemeAttributeMissing, designerType.FullName)); if (themeAttrib.DesignerThemeType == null) throw new InvalidOperationException(DR.GetString(DR.Error_ThemeTypeMissing, designerType.FullName)); if (themeAttrib.Xml.Length > 0) { //First check if the theme initializer is obtained from resource as a manifest Stream stream = designerType.Assembly.GetManifestResourceStream(designerType, themeAttrib.Xml); if (stream == null) stream = designerType.Assembly.GetManifestResourceStream(WorkflowTheme.ThemeResourceNS + themeAttrib.Xml); //Check if the theme initializer is obtained from file XmlReader textReader = (stream != null) ? XmlReader.Create(stream) : null; if (textReader == null) textReader = XmlReader.Create(new StringReader(themeAttrib.Xml)); if (textReader != null) { DesignerSerializationManager serializationManager = new DesignerSerializationManager(); using (serializationManager.CreateSession()) { ThemeSerializationProvider themeSerializationProvider = new ThemeSerializationProvider(); try { ((IDesignerSerializationManager)serializationManager).AddSerializationProvider(themeSerializationProvider); ((IDesignerSerializationManager)serializationManager).Context.Push(this); WorkflowMarkupSerializer xomlSerializer = new WorkflowMarkupSerializer(); designerTheme = xomlSerializer.Deserialize(serializationManager, textReader) as DesignerTheme; if (designerTheme != null && !themeAttrib.DesignerThemeType.IsAssignableFrom(designerTheme.GetType())) { ((IDesignerSerializationManager)serializationManager).ReportError(new WorkflowMarkupSerializationException(DR.GetString(DR.ThemeTypesMismatch, new object[] { themeAttrib.DesignerThemeType.FullName, designerTheme.GetType().FullName }))); designerTheme = null; } if (serializationManager.Errors.Count > 0) { string errors = String.Empty; foreach (object ex in serializationManager.Errors) errors += ex.ToString() + @"\n"; Debug.WriteLine(errors); } } finally { //In some cases the type resolution throws an exception when we try to create a illegal theme type, //this is the reason we need to catch it and proceed further ((IDesignerSerializationManager)serializationManager).RemoveSerializationProvider(themeSerializationProvider); textReader.Close(); } } } } if (designerTheme == null) { try { designerTheme = Activator.CreateInstance(themeAttrib.DesignerThemeType, new object[] { this }) as DesignerTheme; } catch { //If an exception is thrown here then surely we can not create designerTheme specified by the user so we create a default theme //and give it to the user designerTheme = new ActivityDesignerTheme(this); } } designerTheme.DesignerType = designerType; designerTheme.ApplyTo = designerType.FullName; designerTheme.Initialize(); if (replaceTheme) this.designerThemes.Remove(designerType.FullName); this.designerThemes.Add(designerTheme); } if (designerTheme.DesignerType == null) designerTheme.DesignerType = designerType; } finally { ReadOnly = wasReadOnly; } return designerTheme; } internal void AmbientPropertyChanged(AmbientProperty ambientProperty) { foreach (DesignerTheme theme in this.designerThemes) { bool oldReadOnly = this.ReadOnly; this.ReadOnly = false; theme.OnAmbientPropertyChanged(ambientProperty); this.ReadOnly = oldReadOnly; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public ThemeType Type { get { return this.themeType; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool ReadOnly { get { return this.readOnly; } set { this.readOnly = value; } } #endregion #region Class ThemeCollection private class ThemeCollection: KeyedCollection { protected override string GetKeyForItem(DesignerTheme item) { Debug.Assert(item.ApplyTo != null && item.ApplyTo.Length > 0); return item.ApplyTo; } } #endregion } #endregion #region Class DesignerTheme [DesignerSerializer(typeof(ThemeSerializer), typeof(WorkflowMarkupSerializer))] [TypeConverter(typeof(ThemeTypeConverter))] public abstract class DesignerTheme : IDisposable, IPropertyValueProvider { #region Members and Initialization private WorkflowTheme workflowTheme = null; private Type designerType = null; private string designerTypeName = String.Empty; protected DesignerTheme(WorkflowTheme theme) { this.workflowTheme = theme; } ~DesignerTheme() { Dispose(false); } void IDisposable.Dispose() { Dispose(true); GC.SuppressFinalize(this); } public virtual void Initialize() { } protected virtual void Dispose(bool disposing) { } #endregion #region Properties and Methods [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] protected WorkflowTheme ContainingTheme { get { return this.workflowTheme; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public virtual Type DesignerType { get { return this.designerType; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.designerType = value; } } [Browsable(false)] public virtual string ApplyTo { get { return this.designerTypeName; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.designerTypeName = value; } } public virtual void OnAmbientPropertyChanged(AmbientProperty ambientProperty) { } [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool ReadOnly { get { if (this.workflowTheme != null) return this.workflowTheme.ReadOnly; else return false; } internal set { if (this.workflowTheme != null) this.workflowTheme.ReadOnly = value; } } #endregion #region IPropertyValueProvider Members ICollection IPropertyValueProvider.GetPropertyValues(ITypeDescriptorContext context) { //You can filter the enum values here by using EnumFilterConverter return GetPropertyValues(context); } internal virtual ICollection GetPropertyValues(ITypeDescriptorContext context) { //You can filter the enum values here by using EnumFilterConverter return new object[] { }; } #endregion #region Class ThemeSerializer private class ThemeSerializer : WorkflowMarkupSerializer { protected override object CreateInstance(WorkflowMarkupSerializationManager serializationManager, Type type) { if (typeof(DesignerTheme).IsAssignableFrom(type)) return Activator.CreateInstance(type, new object[] { serializationManager.Context[typeof(WorkflowTheme)] }); else return base.CreateInstance(serializationManager, type); } } #endregion } #endregion #region Class ActivityDesignerTheme public class ActivityDesignerTheme : DesignerTheme { #region Constants private static readonly Size[] DesignerSizes = new Size[] { new Size(90, 40), new Size(130, 41), new Size(110, 50) }; private static readonly Size[] ImageSizes = new Size[] { new Size(16, 16), new Size(16, 16), new Size(24, 24) }; #endregion #region Members and Initialization //Public members private string designerImagePath = String.Empty; private Color foreColor = Color.Black; private Color borderColor = Color.Black; private DashStyle borderStyle = DashStyle.Solid; private Color backColorStart = Color.White; private Color backColorEnd = Color.Empty; private LinearGradientMode backgroundStyle = LinearGradientMode.Horizontal; //Temporary members private Image designerImage; private Pen foregroundPen; private Pen borderPen; private Brush foregroundBrush; private Brush backgroundBrush; private Rectangle backgroundBrushRect; public ActivityDesignerTheme(WorkflowTheme theme) : base(theme) { } protected override void Dispose(bool disposing) { try { if (this.designerImage != null) { this.designerImage.Dispose(); this.designerImage = null; } if (this.foregroundPen != null) { this.foregroundPen.Dispose(); this.foregroundPen = null; } if (this.foregroundBrush != null) { this.foregroundBrush.Dispose(); this.foregroundBrush = null; } if (this.borderPen != null) { this.borderPen.Dispose(); this.borderPen = null; } if (this.backgroundBrush != null) { this.backgroundBrush.Dispose(); this.backgroundBrush = null; } } finally { base.Dispose(disposing); } } public override void Initialize() { base.Initialize(); if (ContainingTheme.AmbientTheme.UseOperatingSystemSettings) ApplySystemColors(); } #endregion #region Publicly browsable Properties [DispId(1)] [SRDescription("ImageDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ImageBrowserEditor), typeof(UITypeEditor))] public virtual string DesignerImagePath { get { return this.designerImagePath; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); if (value != null && value.Length > 0 && value.Contains(Path.DirectorySeparatorChar.ToString()) && Path.IsPathRooted(value)) { value = DesignerHelpers.GetRelativePath(ContainingTheme.ContainingFileDirectory, value); if (!DesignerHelpers.IsValidImageResource(this, ContainingTheme.ContainingFileDirectory, value)) throw new InvalidOperationException(DR.GetString(DR.Error_InvalidImageResource)); } this.designerImagePath = value; if (this.designerImage != null) { this.designerImage.Dispose(); this.designerImage = null; } } } [DispId(2)] [SRDescription("ForeColorDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color ForeColor { get { return this.foreColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.foreColor = value; if (this.foregroundPen != null) { this.foregroundPen.Dispose(); this.foregroundPen = null; } if (this.foregroundBrush != null) { this.foregroundBrush.Dispose(); this.foregroundBrush = null; } } } [DispId(3)] [SRDescription("BorderColorDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color BorderColor { get { return this.borderColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.borderColor = value; if (this.borderPen != null) { this.borderPen.Dispose(); this.borderPen = null; } } } [DispId(4)] [SRDescription("BorderStyleDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [TypeConverter(typeof(FilteredEnumConverter))] public virtual DashStyle BorderStyle { get { return this.borderStyle; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); if (value == DashStyle.Custom) throw new Exception(DR.GetString(DR.CustomStyleNotSupported)); this.borderStyle = value; if (this.borderPen != null) { this.borderPen.Dispose(); this.borderPen = null; } } } [DispId(5)] [SRDescription("BackColorStartDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color BackColorStart { get { return this.backColorStart; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.backColorStart = value; if (this.backgroundBrush != null) { this.backgroundBrush.Dispose(); this.backgroundBrush = null; } } } [DispId(6)] [SRDescription("BackColorEndDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color BackColorEnd { get { return this.backColorEnd; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.backColorEnd = value; if (this.backgroundBrush != null) { this.backgroundBrush.Dispose(); this.backgroundBrush = null; } } } [DispId(7)] [SRDescription("BackgroundStyleDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] public virtual LinearGradientMode BackgroundStyle { get { return this.backgroundStyle; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.backgroundStyle = value; if (this.backgroundBrush != null) { this.backgroundBrush.Dispose(); this.backgroundBrush = null; } } } #endregion #region Helper Properties [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen ForegroundPen { get { if (this.foregroundPen == null) this.foregroundPen = new Pen(this.foreColor, BorderWidth); return this.foregroundPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush ForegroundBrush { get { if (this.foregroundBrush == null) this.foregroundBrush = new SolidBrush(this.foreColor); return this.foregroundBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen BorderPen { get { if (this.borderPen == null) { this.borderPen = new Pen(this.borderColor, BorderWidth); this.borderPen.DashStyle = this.borderStyle; } return this.borderPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush GetBackgroundBrush(Rectangle rectangle) { if (this.backgroundBrush == null || this.backgroundBrushRect != rectangle) { if (this.backgroundBrush != null) this.backgroundBrush.Dispose(); this.backgroundBrushRect = rectangle; if (this.backColorStart == this.backColorEnd) this.backgroundBrush = new SolidBrush(this.backColorStart); else this.backgroundBrush = new LinearGradientBrush(this.backgroundBrushRect, this.backColorStart, this.backColorEnd, this.backgroundStyle); } return this.backgroundBrush; } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Size Size { get { return ActivityDesignerTheme.DesignerSizes[(int)ContainingTheme.AmbientTheme.DesignerSize]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public DesignerGeometry DesignerGeometry { get { if (ContainingTheme.AmbientTheme.DrawRounded) return DesignerGeometry.RoundedRectangle; else return DesignerGeometry.Rectangle; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Image DesignerImage { get { if (this.designerImage == null && this.designerImagePath.Length > 0) this.designerImage = DesignerHelpers.GetImageFromPath(this, ContainingTheme.ContainingFileDirectory, this.designerImagePath); return this.designerImage; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Size ImageSize { get { return ActivityDesignerTheme.ImageSizes[(int)ContainingTheme.AmbientTheme.DesignerSize]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Font Font { get { return ContainingTheme.AmbientTheme.Font; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Font BoldFont { get { return ContainingTheme.AmbientTheme.BoldFont; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public int BorderWidth { get { return ContainingTheme.AmbientTheme.BorderWidth; } } public override void OnAmbientPropertyChanged(AmbientProperty ambientProperty) { if (ambientProperty == AmbientProperty.DesignerSize) { ForeColor = this.foreColor; BorderColor = this.borderColor; } else if (ambientProperty == AmbientProperty.OperatingSystemSetting) { ApplySystemColors(); } } private void ApplySystemColors() { ForeColor = SystemColors.ControlText; BorderColor = SystemColors.ControlDark; BackColorStart = SystemColors.Control; BackColorEnd = SystemColors.ControlLight; } #endregion #region IPropertyValueProvider Implementation internal override ICollection GetPropertyValues(ITypeDescriptorContext context) { object[] values = new object[]{}; if (string.Equals(context.PropertyDescriptor.Name, "BorderStyle", StringComparison.Ordinal)) values = new object[] { DashStyle.Solid, DashStyle.Dash, DashStyle.DashDot, DashStyle.DashDotDot, DashStyle.Dot }; return values; } #endregion } #endregion #region Class CompositeDesignerTheme public class CompositeDesignerTheme : ActivityDesignerTheme { #region Static Members internal static readonly Pen ExpandButtonForegoundPen = new Pen(Color.Black, 1); internal static readonly Pen ExpandButtonBorderPen = new Pen(Color.FromArgb(123, 154, 181), 1); private static readonly Size[] ExpandButtonSizes = new Size[] { new Size(8, 8), new Size(8, 8), new Size(12, 12) }; private static readonly Size[] ConnectorSizes = new Size[] { new Size(15, 30), new Size(15, 19), new Size(25, 50) }; #endregion #region Members and Constructor //Members private DesignerContentAlignment watermar----gnment = DesignerContentAlignment.BottomRight; private string watermarkImagePath = String.Empty; private bool dropShadow = false; private LineAnchor startCap = LineAnchor.None; private LineAnchor endCap = LineAnchor.ArrowAnchor; //Temporary variables private Brush expandButtonBackBrush; private Rectangle expandButtonRectangle = Rectangle.Empty; private Image watermarkImage; public CompositeDesignerTheme(WorkflowTheme theme) : base(theme) { } protected override void Dispose(bool disposing) { try { if (this.expandButtonBackBrush != null) { this.expandButtonBackBrush.Dispose(); this.expandButtonBackBrush = null; } if (this.watermarkImage != null) { this.watermarkImage.Dispose(); this.watermarkImage = null; } } finally { base.Dispose(disposing); } } public override void Initialize() { base.Initialize(); if (ContainingTheme.AmbientTheme.UseOperatingSystemSettings) ApplySystemColors(); } #endregion #region Publicly browsable Properties [DispId(8)] [SRDescription("WatermarkDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] [Editor(typeof(ImageBrowserEditor), typeof(UITypeEditor))] public virtual string WatermarkImagePath { get { return this.watermarkImagePath; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); if (!String.IsNullOrEmpty(value) && value.Contains(Path.DirectorySeparatorChar.ToString()) && Path.IsPathRooted(value)) { value = DesignerHelpers.GetRelativePath(ContainingTheme.ContainingFileDirectory, value); if (!DesignerHelpers.IsValidImageResource(this, ContainingTheme.ContainingFileDirectory, value)) throw new InvalidOperationException(DR.GetString(DR.Error_InvalidImageResource)); } this.watermarkImagePath = value; if (this.watermarkImage != null) { this.watermarkImage.Dispose(); this.watermarkImage = null; } } } [DispId(9)] [DefaultValue(DesignerContentAlignment.BottomRight)] [SRDescription("Watermar----gnmentDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] public virtual DesignerContentAlignment Watermar----gnment { get { return this.watermar----gnment; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.watermar----gnment = value; } } [DefaultValue(false)] [DispId(10)] [SRDescription("DropShadowDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] public virtual bool ShowDropShadow { get { return this.dropShadow; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.dropShadow = value; } } [DefaultValue(LineAnchor.None)] [DispId(11)] [SRDescription("ConnectorStartCapDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] public virtual LineAnchor ConnectorStartCap { get { return this.startCap; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.startCap = value; } } [DefaultValue(LineAnchor.ArrowAnchor)] [DispId(12)] [SRDescription("ConnectorEndCapDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] public virtual LineAnchor ConnectorEndCap { get { return this.endCap; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.endCap = value; } } #endregion #region Helper Methods [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public virtual Size ConnectorSize { get { if (DesignerType != null && typeof(FreeformActivityDesigner).IsAssignableFrom(DesignerType)) { int connectorSize = CompositeDesignerTheme.ConnectorSizes[(int)ContainingTheme.AmbientTheme.DesignerSize].Height; return new Size(connectorSize, connectorSize); } else { return CompositeDesignerTheme.ConnectorSizes[(int)ContainingTheme.AmbientTheme.DesignerSize]; } } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public virtual Size ExpandButtonSize { get { return CompositeDesignerTheme.ExpandButtonSizes[(int)ContainingTheme.AmbientTheme.DesignerSize]; } } public Brush GetExpandButtonBackgroundBrush(Rectangle rectangle) { if (this.expandButtonBackBrush == null || this.expandButtonRectangle != rectangle) { if (this.expandButtonBackBrush != null) this.expandButtonBackBrush.Dispose(); this.expandButtonRectangle = rectangle; this.expandButtonBackBrush = new LinearGradientBrush(this.expandButtonRectangle, Color.White, Color.FromArgb(173, 170, 156), LinearGradientMode.ForwardDiagonal); } return this.expandButtonBackBrush; } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Image WatermarkImage { get { if (this.watermarkImage == null && this.watermarkImagePath.Length > 0) this.watermarkImage = DesignerHelpers.GetImageFromPath(this, ContainingTheme.ContainingFileDirectory, this.watermarkImagePath); return this.watermarkImage; } } public override void OnAmbientPropertyChanged(AmbientProperty ambientProperty) { base.OnAmbientPropertyChanged(ambientProperty); if (ambientProperty == AmbientProperty.OperatingSystemSetting) ApplySystemColors(); } private void ApplySystemColors() { //the root designers should be transparent... BackColorStart = Color.Empty; BackColorEnd = Color.Empty; } #endregion } #endregion #region Class ActivityPreviewDesignerTheme public class ActivityPreviewDesignerTheme: CompositeDesignerTheme { #region Static Members internal static readonly Bitmap LeftScrollImage = DR.GetImage(DR.MoveLeft) as Bitmap; internal static readonly Bitmap LeftScrollImageUp = DR.GetImage(DR.MoveLeftUp) as Bitmap; internal static readonly Bitmap RightScrollImage = DR.GetImage(DR.MoveRight) as Bitmap; internal static readonly Bitmap RightScrollImageUp = DR.GetImage(DR.MoveRightUp) as Bitmap; internal static readonly Bitmap PreviewButtonImage = DR.GetImage(DR.PreviewModeIcon) as Bitmap; internal static readonly Bitmap EditButtonImage = DR.GetImage(DR.EditModeIcon) as Bitmap; internal static readonly Bitmap PreviewImage = DR.GetImage(DR.PreviewIndicator) as Bitmap; private static readonly Size[] ItemSizes = new Size[] { new Size(20, 20), new Size(20, 20), new Size(30, 30) }; private static readonly Size[] PreviewButtonSizes = new Size[] { new Size(16, 16), new Size(16, 16), new Size(20, 20) }; private static readonly Size[] PreviewWindowSizes = new Size[] { new Size(172, 120), new Size(172, 120), new Size(212, 160) }; private const int DefaultItemCount = 5; #endregion #region Members private Color previewForeColor = Color.WhiteSmoke; private Color previewBackColor = Color.White; private Color previewBorderColor = Color.Gray; //Temporary members private Brush previewForegroundBrush; private Brush previewBackgroundBrush; private Pen previewBorderPen; public ActivityPreviewDesignerTheme(WorkflowTheme theme) : base(theme) { } protected override void Dispose(bool disposing) { try { if (this.previewForegroundBrush != null) { this.previewForegroundBrush.Dispose(); this.previewForegroundBrush = null; } if (this.previewBackgroundBrush != null) { this.previewBackgroundBrush.Dispose(); this.previewBackgroundBrush = null; } if (this.previewBorderPen != null) { this.previewBorderPen.Dispose(); this.previewBorderPen = null; } } finally { base.Dispose(disposing); } } public override void Initialize() { base.Initialize(); if (ContainingTheme.AmbientTheme.UseOperatingSystemSettings) ApplySystemColors(); } #endregion #region Publicly browsable Properties [DispId(13)] [SRDescription("PreviewForeColorDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public Color PreviewForeColor { get { return this.previewForeColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.previewForeColor = value; if (this.previewForegroundBrush != null) { this.previewForegroundBrush.Dispose(); this.previewForegroundBrush = null; } } } [DispId(14)] [SRDescription("PreviewBackColorDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public Color PreviewBackColor { get { return this.previewBackColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.previewBackColor = value; if (this.previewBackgroundBrush != null) { this.previewBackgroundBrush.Dispose(); this.previewBackgroundBrush = null; } } } [DispId(15)] [SRDescription("PreviewBorderColorDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public Color PreviewBorderColor { get { return this.previewBorderColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.previewBorderColor = value; if (this.previewBorderPen != null) { this.previewBorderPen.Dispose(); this.previewBorderPen = null; } } } #endregion #region Helper Properties [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Size PreviewItemSize { get { return ActivityPreviewDesignerTheme.ItemSizes[(int)ContainingTheme.AmbientTheme.DesignerSize]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal int PreviewItemCount { get { return ActivityPreviewDesignerTheme.DefaultItemCount; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Size PreviewWindowSize { get { return ActivityPreviewDesignerTheme.PreviewWindowSizes[(int)ContainingTheme.AmbientTheme.DesignerSize]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Size PreviewButtonSize { get { return ActivityPreviewDesignerTheme.PreviewButtonSizes[(int)ContainingTheme.AmbientTheme.DesignerSize]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Pen PreviewBorderPen { get { if (this.previewBorderPen == null) this.previewBorderPen = new Pen(this.previewBorderColor, BorderWidth); return this.previewBorderPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Brush PreviewForegroundBrush { get { if (this.previewForegroundBrush == null) this.previewForegroundBrush = new SolidBrush(this.previewForeColor); return this.previewForegroundBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Brush PreviewBackgroundBrush { get { if (this.previewBackgroundBrush == null) this.previewBackgroundBrush = new SolidBrush(this.previewBackColor); return this.previewBackgroundBrush; } } public override void OnAmbientPropertyChanged(AmbientProperty ambientProperty) { base.OnAmbientPropertyChanged(ambientProperty); if (ambientProperty == AmbientProperty.DesignerSize) PreviewBorderColor = this.previewBorderColor; else if (ambientProperty == AmbientProperty.OperatingSystemSetting) ApplySystemColors(); } private void ApplySystemColors() { PreviewForeColor = SystemColors.ButtonFace; PreviewBackColor = SystemColors.Window; PreviewBorderColor = SystemColors.ControlDarkDark; BorderColor = SystemColors.ControlDarkDark; } #endregion } #endregion #region Class AmbientTheme public class AmbientTheme : DesignerTheme { #region Constants which wont change internal const float WatermarkTransparency = 0.25f; internal const int ArcDiameter = 8; internal const int DropShadowWidth = 4; internal static Color TransparentColor = Color.FromArgb(255, 0, 255); internal static readonly Image ConfigErrorImage = DR.GetImage(DR.ConfigError); internal static readonly Image ScrollIndicatorImage = DR.GetImage(DR.ArrowLeft); internal static readonly Image DropIndicatorImage = DR.GetImage(DR.DropShapeShort); internal static readonly Image LockImage = DR.GetImage(DR.PreviewIndicator); internal static readonly Image ReadOnlyImage = DR.GetImage(DR.ReadOnly); internal static readonly Pen SmartTagBorderPen = new Pen(Color.Black, 1); internal static readonly Pen MagnifierPen = new Pen(Color.Black, 2); internal static readonly Pen WorkflowBorderPen = new Pen(Color.FromArgb(127, 157, 185), 1); internal static readonly Brush WorkspaceBackgroundBrush = new SolidBrush(Color.FromArgb(234, 234, 236)); internal static readonly Brush FadeBrush = new SolidBrush(Color.FromArgb(120, 255, 255, 255)); internal static readonly Brush DisabledBrush = new SolidBrush(Color.FromArgb(40, Color.Gray)); internal static readonly Brush PageShadowBrush = new SolidBrush(Color.FromArgb(75, 75, 75)); internal const float ScrollIndicatorTransparency = 0.7f; internal static readonly Size DragImageMargins = new Size(4, 4); internal static readonly Size DragImageTextSize = new Size(100, 60); internal static readonly Size DragImageIconSize = new Size(16, 16); internal const int MinZoom = 10; internal const int MaxZoom = 400; internal const int ScrollUnit = 25; internal const int MinShadowDepth = 0; internal const int MaxShadowDepth = 8; private static float[] fontSizes = null; private static readonly Size[] GridSizes = new Size[] { new Size(30, 30), new Size(40, 40), new Size(60, 60) }; private static readonly Size[] MarginSizes = new Size[] { new Size(2, 2), new Size(4, 4), new Size(6, 6) }; private static readonly Size[] SelectionSizes = new Size[] { new Size(2, 2), new Size(4, 4), new Size(6, 6) }; private static readonly Size[] GlyphSizes = new Size[] { new Size(10, 10), new Size(14, 14), new Size(18, 18) }; private static readonly Size[] ScrollIndicatorSizes = new Size[] { new Size(24, 24), new Size(32, 32), new Size(40, 40) }; private static readonly Size[] DropIndicatorSizes = new Size[] { new Size(8, 8), new Size(12, 12), new Size(16, 16) }; private static readonly Size[] MagnifierSizes = new Size[] { new Size(50, 50), new Size(100, 100), new Size(150, 150) }; private static readonly int[] BorderWidths = new int[] { 1, 1, 3 }; private const int DefaultShadowDepth = 6; #endregion private static float[] FontSizes { get { if (fontSizes == null) fontSizes = new float[] { WorkflowTheme.GetDefaultFont().SizeInPoints - 2.0f, WorkflowTheme.GetDefaultFont().SizeInPoints, WorkflowTheme.GetDefaultFont().SizeInPoints + 2.0f }; return fontSizes; } } #region Members //General category private bool useOperatingSystemSettings = false; private bool showConfigErrors = true; private bool drawShadow = false; //Advanced private bool drawGrayscale = false; private Color dropIndicatorColor = Color.Green; private Color selectionForeColor = Color.Blue; private Color selectionPatternColor = Color.DarkGray; private Color foreColor = Color.Gray; private Color backColor = Color.White; private Color commentIndicatorColor = Color.FromArgb(49, 198, 105); private Color readonlyIndicatorColor = Color.Gray; private DesignerContentAlignment watermar----gnment = DesignerContentAlignment.BottomRight; private string watermarkImagePath = String.Empty; private bool useDefaultFont = false; //Grid private bool showGrid = false; private DashStyle gridStyle = DashStyle.Dash; private Color gridColor = Color.FromArgb(192, 192, 192); //Font private string fontName = WorkflowTheme.GetDefaultFont().FontFamily.Name; private TextQuality textQuality = TextQuality.Aliased; //Designer private DesignerSize designerStyle = DesignerSize.Medium; private bool drawRounded = true; private bool showDesignerBorder = true; #endregion #region Resource Members private Font font; private Font boldFont; private Pen foregroundPen; private Pen selectionForegroundPen; private Pen selectionPatternPen; private Pen majorGridPen; private Pen minorGridPen; private Pen dropIndicatorPen; private Pen commentIndicatorPen; private Brush backgroundBrush; private Brush foregroundBrush; private Brush selectionForegroundBrush; private Brush dropIndicatorBrush; private Brush commentIndicatorBrush; private Brush readonlyIndicatorBrush; private Brush majorGridBrush; private Brush minorGridBrush; private Image watermarkImage; #endregion public AmbientTheme(WorkflowTheme theme) : base(theme) { } protected override void Dispose(bool disposing) { try { //We stop listening to OS setting events UseOperatingSystemSettings = false; if (this.font != null) { this.font.Dispose(); this.font = null; } if (this.boldFont != null) { this.boldFont.Dispose(); this.boldFont = null; } if (this.watermarkImage != null) { this.watermarkImage.Dispose(); this.watermarkImage = null; } if (this.foregroundPen != null) { this.foregroundPen.Dispose(); this.foregroundPen = null; } if (this.foregroundBrush != null) { this.foregroundBrush.Dispose(); this.foregroundBrush = null; } if (this.backgroundBrush != null) { this.backgroundBrush.Dispose(); this.backgroundBrush = null; } if (this.dropIndicatorPen != null) { this.dropIndicatorPen.Dispose(); this.dropIndicatorPen = null; } if (this.selectionPatternPen != null) { this.selectionPatternPen.Dispose(); this.selectionPatternPen = null; } if (this.selectionForegroundPen != null) { this.selectionForegroundPen.Dispose(); this.selectionForegroundPen = null; } if (this.majorGridPen != null) { this.majorGridPen.Dispose(); this.majorGridPen = null; } if (this.majorGridBrush != null) { this.majorGridBrush.Dispose(); this.majorGridBrush = null; } if (this.minorGridPen != null) { this.minorGridPen.Dispose(); this.minorGridPen = null; } if (this.minorGridBrush != null) { this.minorGridBrush.Dispose(); this.minorGridBrush = null; } if (this.commentIndicatorPen != null) { this.commentIndicatorPen.Dispose(); this.commentIndicatorPen = null; } if (this.commentIndicatorBrush != null) { this.commentIndicatorBrush.Dispose(); this.commentIndicatorBrush = null; } if (this.readonlyIndicatorBrush != null) { this.readonlyIndicatorBrush.Dispose(); this.readonlyIndicatorBrush = null; } if (this.dropIndicatorBrush != null) { this.dropIndicatorBrush.Dispose(); this.dropIndicatorBrush = null; } if (this.selectionForegroundBrush != null) { this.selectionForegroundBrush.Dispose(); this.selectionForegroundBrush = null; } } finally { base.Dispose(disposing); } } public override void Initialize() { base.Initialize(); if (this.useOperatingSystemSettings) ApplySystemColors(); } #region Publicly browsable Properties #region General Properties [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public virtual bool UseOperatingSystemSettings { get { return this.useOperatingSystemSettings; } internal set { this.useOperatingSystemSettings = value; if (this.useOperatingSystemSettings) { SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(OnOperatingSystemSettingsChanged); OnOperatingSystemSettingsChanged(this, new UserPreferenceChangedEventArgs(UserPreferenceCategory.Color)); } else { SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(OnOperatingSystemSettingsChanged); } } } [DispId(1)] [SRDescription("FontDesc", DR.ResourceSet)] [SRCategory("WorkflowAppearanceCategory", DR.ResourceSet)] [TypeConverter(typeof(FontFamilyConverter))] public virtual string FontName { get { return this.fontName; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); if (value == null || value.Length == 0) throw new Exception(DR.GetString(DR.EmptyFontFamilyNotSupported)); try { Font font = new Font(value, FontSize); if (font != null) font.Dispose(); } catch (Exception e) { throw new Exception(DR.GetString(DR.FontFamilyNotSupported, value), e); } this.fontName = value; if (this.font != null) { this.font.Dispose(); this.font = null; } if (this.boldFont != null) { this.boldFont.Dispose(); this.boldFont = null; } } } [DefaultValue(TextQuality.Aliased)] [DispId(2)] [SRDescription("TextQualityDesc", DR.ResourceSet)] [SRCategory("WorkflowAppearanceCategory", DR.ResourceSet)] public virtual TextQuality TextQuality { get { return this.textQuality; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.textQuality = value; } } [DispId(3)] [DefaultValue(true)] [SRDescription("ShowConfigErrorDesc", DR.ResourceSet)] [SRCategory("WorkflowAppearanceCategory", DR.ResourceSet)] public virtual bool ShowConfigErrors { get { return this.showConfigErrors; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.showConfigErrors = value; } } [DefaultValue(false)] [DispId(6)] [SRDescription("GrayscaleWorkflowDesc", DR.ResourceSet)] [SRCategory("WorkflowAppearanceCategory", DR.ResourceSet)] public virtual bool DrawGrayscale { get { return this.drawGrayscale; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.drawGrayscale = value; } } #endregion #region Workflow Foreground Properties [DispId(7)] [SRDescription("DropHiliteDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color DropIndicatorColor { get { return this.dropIndicatorColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.dropIndicatorColor = value; if (this.dropIndicatorPen != null) { this.dropIndicatorPen.Dispose(); this.dropIndicatorPen = null; } if (this.dropIndicatorBrush != null) { this.dropIndicatorBrush.Dispose(); this.dropIndicatorBrush = null; } } } [DispId(8)] [SRDescription("SelectionForegroundDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color SelectionForeColor { get { return this.selectionForeColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.selectionForeColor = value; if (this.selectionForegroundPen != null) { this.selectionForegroundPen.Dispose(); this.selectionForegroundPen = null; } if (this.selectionForegroundBrush != null) { this.selectionForegroundBrush.Dispose(); this.selectionForegroundBrush = null; } } } [DispId(9)] [SRDescription("SelectionPatternDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color SelectionPatternColor { get { return this.selectionPatternColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.selectionPatternColor = value; if (this.selectionPatternPen != null) { this.selectionPatternPen.Dispose(); this.selectionPatternPen = null; } } } [DispId(10)] [SRDescription("WorkflowForegroundDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color ForeColor { get { return this.foreColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.foreColor = value; if (this.foregroundPen != null) { this.foregroundPen.Dispose(); this.foregroundPen = null; } if (this.foregroundBrush != null) { this.foregroundBrush.Dispose(); this.foregroundBrush = null; } } } [DispId(11)] [SRDescription("CommentColorDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color CommentIndicatorColor { get { return this.commentIndicatorColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.commentIndicatorColor = value; if (this.commentIndicatorPen != null) { this.commentIndicatorPen.Dispose(); this.commentIndicatorPen = null; } if (this.commentIndicatorBrush != null) { this.commentIndicatorBrush.Dispose(); this.commentIndicatorBrush = null; } } } [DispId(12)] [SRDescription("LockColorDesc", DR.ResourceSet)] [SRCategory("ForegroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color ReadonlyIndicatorColor { get { return this.readonlyIndicatorColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.readonlyIndicatorColor = value; if (this.readonlyIndicatorBrush != null) { this.readonlyIndicatorBrush.Dispose(); this.readonlyIndicatorBrush = null; } } } #endregion #region Workflow Background Properties [DispId(13)] [SRDescription("WorkflowBackgroundDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color BackColor { get { return this.backColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.backColor = value; if (this.backgroundBrush != null) { this.backgroundBrush.Dispose(); this.backgroundBrush = null; } } } [DefaultValue(false)] [DispId(14)] [SRDescription("WorkflowShadowDesc", DR.ResourceSet)] [SRCategory("WorkflowAppearanceCategory", DR.ResourceSet)] public virtual bool DrawShadow { get { return this.drawShadow; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.drawShadow = value; } } [DispId(15)] [SRDescription("WorkflowWatermarkDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] [Editor(typeof(ImageBrowserEditor), typeof(UITypeEditor))] public virtual string WatermarkImagePath { get { return this.watermarkImagePath; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); if (!String.IsNullOrEmpty(value) && value.Contains(Path.DirectorySeparatorChar.ToString()) && Path.IsPathRooted(value)) { value = DesignerHelpers.GetRelativePath(ContainingTheme.ContainingFileDirectory, value); if (!DesignerHelpers.IsValidImageResource(this, ContainingTheme.ContainingFileDirectory, value)) throw new InvalidOperationException(DR.GetString(DR.Error_InvalidImageResource)); } this.watermarkImagePath = value; if (this.watermarkImage != null) { this.watermarkImage.Dispose(); this.watermarkImage = null; } } } [DispId(16)] [DefaultValue(DesignerContentAlignment.BottomRight)] [SRDescription("Watermar----gnmentDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] public virtual DesignerContentAlignment Watermar----gnment { get { return this.watermar----gnment; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.watermar----gnment = value; } } [DefaultValue(false)] [DispId(17)] [SRDescription("ShowGridDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] public virtual bool ShowGrid { get { return this.showGrid; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.showGrid = value; } } [DefaultValue(DashStyle.Dash)] [DispId(18)] [SRDescription("GridStyleDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] public virtual DashStyle GridStyle { get { return this.gridStyle; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.gridStyle = value; if (this.majorGridPen != null) { this.majorGridPen.Dispose(); this.majorGridPen = null; } if (this.minorGridPen != null) { this.minorGridPen.Dispose(); this.minorGridPen = null; } } } [DispId(19)] [SRDescription("GridColorDesc", DR.ResourceSet)] [SRCategory("BackgroundCategory", DR.ResourceSet)] [Editor(typeof(ColorPickerEditor), typeof(UITypeEditor))] [TypeConverter(typeof(ColorPickerConverter))] public virtual Color GridColor { get { return this.gridColor; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.gridColor = value; if (this.majorGridPen != null) { this.majorGridPen.Dispose(); this.majorGridPen = null; } if (this.majorGridBrush != null) { this.majorGridBrush.Dispose(); this.majorGridBrush = null; } if (this.minorGridPen != null) { this.minorGridPen.Dispose(); this.minorGridPen = null; } if (this.minorGridBrush != null) { this.minorGridBrush.Dispose(); this.minorGridBrush = null; } } } #endregion #endregion #region Activity Appearance Properties // [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [DefaultValue(DesignerSize.Medium)] [DispId(20)] [SRDescription("DesignerSizeDesc", DR.ResourceSet)] [SRCategory("ActivityAppearanceCategory", DR.ResourceSet)] public virtual DesignerSize DesignerSize { get { return this.designerStyle; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.designerStyle = value; ContainingTheme.AmbientPropertyChanged(AmbientProperty.DesignerSize); } } [DefaultValue(true)] [DispId(21)] [SRDescription("DrawRoundedDesignersDesc", DR.ResourceSet)] [SRCategory("ActivityAppearanceCategory", DR.ResourceSet)] public virtual bool DrawRounded { get { return this.drawRounded; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.drawRounded = value; } } [DefaultValue(true)] [DispId(24)] [SRDescription("DesignerBorderDesc", DR.ResourceSet)] [SRCategory("ActivityAppearanceCategory", DR.ResourceSet)] public virtual bool ShowDesignerBorder { get { return this.showDesignerBorder; } set { if (ReadOnly) throw new InvalidOperationException(DR.GetString(DR.ThemePropertyReadOnly)); this.showDesignerBorder = value; } } #endregion #region Helper Properties and Methods [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public virtual Size Margin { get { return AmbientTheme.MarginSizes[(int) this.designerStyle]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public virtual Size SelectionSize { get { return AmbientTheme.SelectionSizes[(int) this.designerStyle]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public virtual Size GlyphSize { get { return AmbientTheme.GlyphSizes[(int)this.designerStyle]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Size ScrollIndicatorSize { get { return AmbientTheme.ScrollIndicatorSizes[(int) this.designerStyle]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Size DropIndicatorSize { get { return AmbientTheme.DropIndicatorSizes[(int) this.designerStyle]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Size MagnifierSize { get { return AmbientTheme.MagnifierSizes[(int) this.designerStyle]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal int ShadowDepth { get { return ((this.drawShadow) ? AmbientTheme.DefaultShadowDepth : 0); } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public virtual Size GridSize { get { return AmbientTheme.GridSizes[(int) this.designerStyle]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public virtual int BorderWidth { get { return AmbientTheme.BorderWidths[(int)ContainingTheme.AmbientTheme.DesignerSize]; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen MajorGridPen { get { if (this.majorGridPen == null) { this.majorGridPen = new Pen(this.gridColor, 1); this.majorGridPen.DashStyle = DashStyle.Dash; } return this.majorGridPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush MajorGridBrush { get { if (this.majorGridBrush == null) this.majorGridBrush = new SolidBrush(this.gridColor); return this.majorGridBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen MinorGridPen { get { if (this.minorGridPen == null) { Color minorGridColor = Color.FromArgb(this.gridColor.A, Math.Min(this.gridColor.R + 32, 255), Math.Min(this.gridColor.G + 32, 255), Math.Min(this.gridColor.B + 32, 255)); this.minorGridPen = new Pen(minorGridColor, 1); this.minorGridPen.DashStyle = DashStyle.Dot; } return this.minorGridPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] internal Brush MinorGridBrush { get { if (this.minorGridBrush == null) { Color minorGridColor = Color.FromArgb(this.gridColor.A, Math.Min(this.gridColor.R + 32, 255), Math.Min(this.gridColor.G + 32, 255), Math.Min(this.gridColor.B + 32, 255)); this.minorGridBrush = new SolidBrush(minorGridColor); } return this.minorGridBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen SelectionPatternPen { get { if (this.selectionPatternPen == null) { this.selectionPatternPen = new Pen(this.selectionPatternColor, 1); this.selectionPatternPen.DashStyle = DashStyle.Dot; } return this.selectionPatternPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen SelectionForegroundPen { get { if (this.selectionForegroundPen == null) this.selectionForegroundPen = new Pen(this.selectionForeColor, 1); return this.selectionForegroundPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush SelectionForegroundBrush { get { if (this.selectionForegroundBrush == null) this.selectionForegroundBrush = new SolidBrush(this.selectionForeColor); return this.selectionForegroundBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen DropIndicatorPen { get { if (this.dropIndicatorPen == null) this.dropIndicatorPen = new Pen(this.dropIndicatorColor, BorderWidth); return this.dropIndicatorPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush DropIndicatorBrush { get { if (this.dropIndicatorBrush == null) this.dropIndicatorBrush = new SolidBrush(this.dropIndicatorColor); return this.dropIndicatorBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen ForegroundPen { get { if (this.foregroundPen == null) { this.foregroundPen = new Pen(this.foreColor, 1); this.foregroundPen.DashStyle = DashStyle.Dot; } return this.foregroundPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Pen CommentIndicatorPen { get { if (this.commentIndicatorPen == null) this.commentIndicatorPen = new Pen(this.commentIndicatorColor, 1); return this.commentIndicatorPen; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush CommentIndicatorBrush { get { if (this.commentIndicatorBrush == null) this.commentIndicatorBrush = new SolidBrush(Color.FromArgb(40, this.commentIndicatorColor)); return this.commentIndicatorBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush ReadonlyIndicatorBrush { get { if (this.readonlyIndicatorBrush == null) this.readonlyIndicatorBrush = new SolidBrush(Color.FromArgb(20, this.readonlyIndicatorColor)); return this.readonlyIndicatorBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush ForegroundBrush { get { if (this.foregroundBrush == null) this.foregroundBrush = new SolidBrush(this.foreColor); return this.foregroundBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Brush BackgroundBrush { get { if (this.backgroundBrush == null) this.backgroundBrush = new SolidBrush(this.backColor); return this.backgroundBrush; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Image WorkflowWatermarkImage { get { if (this.watermarkImage == null && this.watermarkImagePath.Length > 0) this.watermarkImage = DesignerHelpers.GetImageFromPath(this, ContainingTheme.ContainingFileDirectory, this.watermarkImagePath); return this.watermarkImage; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Font Font { get { if (this.font == null) { Debug.Assert(this.fontName != null && this.fontName.Length > 0); if (this.fontName == null || this.fontName.Length == 0) this.fontName = WorkflowTheme.GetDefaultFont().FontFamily.Name; ArrayList supportedFonts = new ArrayList(AmbientTheme.SupportedFonts); Debug.Assert(supportedFonts.Contains(this.fontName)); if (!supportedFonts.Contains(this.fontName)) this.fontName = WorkflowTheme.GetDefaultFont().FontFamily.Name; this.font = new Font(this.fontName, FontSize); } return this.font; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Browsable(false)] public Font BoldFont { get { if (this.boldFont == null) { Debug.Assert(this.fontName != null && this.fontName.Length > 0); if (this.fontName == null || this.fontName.Length == 0) this.fontName = WorkflowTheme.GetDefaultFont().FontFamily.Name; ArrayList supportedFonts = new ArrayList(AmbientTheme.SupportedFonts); Debug.Assert(supportedFonts.Contains(this.fontName)); if (!supportedFonts.Contains(this.fontName)) this.fontName = WorkflowTheme.GetDefaultFont().FontFamily.Name; this.boldFont = new Font(this.fontName, FontSize, FontStyle.Bold); } return this.boldFont; } } [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] private float FontSize { get { // if (this.useOperatingSystemSettings) return SystemInformation.MenuFont.SizeInPoints; else return AmbientTheme.FontSizes[(int) this.DesignerSize]; } } internal void UseDefaultFont() { this.useDefaultFont = true; } internal void UpdateFont() { if (this.useDefaultFont) { bool oldReadOnly = ReadOnly; ReadOnly = false; this.FontName = WorkflowTheme.GetDefaultFont().FontFamily.Name; ReadOnly = oldReadOnly; } } public override void OnAmbientPropertyChanged(AmbientProperty ambientProperty) { base.OnAmbientPropertyChanged(ambientProperty); if (ambientProperty == AmbientProperty.DesignerSize) { //We set the same properties again so that the pens and brushes are reset to //consider the new designer style for creation DropIndicatorColor = this.dropIndicatorColor; FontName = this.fontName; } else if (ambientProperty == AmbientProperty.OperatingSystemSetting) { //Apply the system colors ApplySystemColors(); } } internal static string[] SupportedFonts { get { ArrayList fontNames = new ArrayList(); foreach (FontFamily family in FontFamily.Families) fontNames.Add(family.Name); fontNames.Sort(CaseInsensitiveComparer.Default); return ((string[])fontNames.ToArray(typeof(string))); } } private void OnOperatingSystemSettingsChanged(object sender, UserPreferenceChangedEventArgs e) { if (e.Category == UserPreferenceCategory.Color || e.Category == UserPreferenceCategory.VisualStyle) { ContainingTheme.AmbientPropertyChanged(AmbientProperty.OperatingSystemSetting); WorkflowTheme.FireThemeChange(); } } private void ApplySystemColors() { DropIndicatorColor = SystemColors.HotTrack; SelectionForeColor = SystemColors.Highlight; SelectionPatternColor = SystemColors.Highlight; ForeColor = SystemColors.WindowText; CommentIndicatorColor = SystemColors.GrayText; ReadonlyIndicatorColor = SystemColors.GrayText; BackColor = SystemColors.Window; GridColor = SystemColors.InactiveBorder; FontName = WorkflowTheme.GetDefaultFont().FontFamily.Name; } #endregion #region IPropertyValueProvider Implementation internal override ICollection GetPropertyValues(ITypeDescriptorContext context) { object[] values = new object[]{}; if (string.Equals(context.PropertyDescriptor.Name, "GridStyle", StringComparison.Ordinal)) values = new object[] { DashStyle.Solid, DashStyle.Dash, DashStyle.Dot }; return values; } #endregion } #endregion #region TypeConverters, TypeDescriptors, PropertyDescriptors, UITypeEditors #region Class ThemeTypeDescriptor internal sealed class ThemeTypeConverter : ExpandableObjectConverter { public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(string) && context.PropertyDescriptor != null) return String.Empty; else return base.ConvertTo(context, culture, value, destinationType); } public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) { PropertyDescriptorCollection srcProperties = base.GetProperties(context, value, attributes); return srcProperties.Sort(new PropertyDescriptorSorter()); } #region Class PropertyDescriptorSorter private sealed class PropertyDescriptorSorter : IComparer { int IComparer.Compare(object obj1, object obj2) { PropertyDescriptor property1 = obj1 as PropertyDescriptor; PropertyDescriptor property2 = obj2 as PropertyDescriptor; DispIdAttribute prop1DispID = property1.Attributes[typeof(DispIdAttribute)] as DispIdAttribute; DispIdAttribute prop2DispID = property2.Attributes[typeof(DispIdAttribute)] as DispIdAttribute; if (prop1DispID == null) return 1; else if (prop2DispID == null) return -1; else return prop1DispID.Value - prop2DispID.Value; } } #endregion } #endregion #region Class ColorPickerConverter internal sealed class ColorPickerConverter : ColorConverter { public override bool GetStandardValuesSupported(ITypeDescriptorContext context) { return false; } } #endregion #region Class FilteredEnumConverter internal sealed class FilteredEnumConverter : PropertyValueProviderTypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { return (sourceType == typeof(string)); } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { return Enum.Parse(context.PropertyDescriptor.PropertyType, (string)value); } } #endregion #region Class FontFamilyConverter internal sealed class FontFamilyConverter : TypeConverter { public override bool GetStandardValuesSupported(ITypeDescriptorContext context) { return true; } public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) { return true; } public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { return new TypeConverter.StandardValuesCollection(AmbientTheme.SupportedFonts); } } #endregion #region Class ImageBrowserEditor internal sealed class ImageBrowserEditor : UITypeEditor { public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) { return UITypeEditorEditStyle.Modal; } public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) { OpenFileDialog fileDialog = new OpenFileDialog(); fileDialog.AddExtension = true; fileDialog.DefaultExt = WorkflowTheme.DefaultThemeFileExtension; fileDialog.CheckFileExists = true; fileDialog.Filter = DR.GetString(DR.ImageFileFilter); if (fileDialog.ShowDialog() == DialogResult.OK) return fileDialog.FileName; else return value; } } #endregion #region Class ColorPickerEditor internal sealed class ColorPickerEditor : UITypeEditor { public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) { return UITypeEditorEditStyle.Modal; } public override bool GetPaintValueSupported(ITypeDescriptorContext context) { return (context != null && context.PropertyDescriptor != null); } public override void PaintValue(PaintValueEventArgs e) { base.PaintValue(e); if (e.Value is Color) { Color selectedColor = (Color)e.Value; if (selectedColor != Color.Empty) { using (Brush fillBrush = new SolidBrush(selectedColor)) e.Graphics.FillRectangle(fillBrush, e.Bounds); } } } public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) { ColorDialog colorDialog = new ColorDialog(); colorDialog.AllowFullOpen = true; colorDialog.FullOpen = true; colorDialog.AnyColor = true; colorDialog.Color = (value is Color) ? (Color)value : Color.White; if (colorDialog.ShowDialog() == DialogResult.OK) return colorDialog.Color; else return value; } } #endregion #endregion #region Serializers #region Class ThemeSerializationProvider internal sealed class ThemeSerializationProvider : WorkflowMarkupSerializationProvider { #region IDesignerSerializationProvider Members public override object GetSerializer(IDesignerSerializationManager manager, object currentSerializer, Type objectType, Type serializerType) { if (serializerType.IsAssignableFrom(typeof(WorkflowMarkupSerializer))) { if (typeof(System.Drawing.Color) == objectType) return new ColorMarkupSerializer(); else if (typeof(Size) == objectType) return new SizeMarkupSerializer(); } return base.GetSerializer(manager, currentSerializer, objectType, serializerType); } #endregion } #endregion #endregion } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SqlGenericUtil.cs
- FontStyleConverter.cs
- IdentityReference.cs
- InvalidCommandTreeException.cs
- MatrixCamera.cs
- ControlType.cs
- ValidationRule.cs
- TypeContext.cs
- SelectionItemPattern.cs
- PathFigureCollection.cs
- ExternalCalls.cs
- SpeakInfo.cs
- DataReceivedEventArgs.cs
- DataServiceQueryContinuation.cs
- CorrelationResolver.cs
- AutoGeneratedFieldProperties.cs
- DataSvcMapFile.cs
- AutomationProperties.cs
- AppDomain.cs
- MetafileHeader.cs
- XmlBufferedByteStreamReader.cs
- BufferedStream.cs
- ComponentCollection.cs
- Identifier.cs
- Environment.cs
- BamlRecords.cs
- DiagnosticsConfigurationHandler.cs
- FamilyTypeface.cs
- CreateUserWizardStep.cs
- CryptoKeySecurity.cs
- ChineseLunisolarCalendar.cs
- HTMLTagNameToTypeMapper.cs
- RectangleF.cs
- BulletedList.cs
- CssClassPropertyAttribute.cs
- TabItemWrapperAutomationPeer.cs
- IISMapPath.cs
- UIElementAutomationPeer.cs
- ValueType.cs
- ExternalException.cs
- ThreadLocal.cs
- Rotation3DAnimationBase.cs
- PathFigureCollectionConverter.cs
- OpCellTreeNode.cs
- ProviderMetadata.cs
- ScriptResourceHandler.cs
- QilName.cs
- versioninfo.cs
- ParserStreamGeometryContext.cs
- TableLayoutPanelCellPosition.cs
- DataServiceHost.cs
- VersionedStream.cs
- DocumentViewerBase.cs
- PanelStyle.cs
- AutoGeneratedField.cs
- CombinedGeometry.cs
- CqlWriter.cs
- SerializationInfo.cs
- ProfileParameter.cs
- SoapSchemaImporter.cs
- XPathArrayIterator.cs
- InvalidComObjectException.cs
- EntityCollection.cs
- HtmlContainerControl.cs
- ResourceDefaultValueAttribute.cs
- CompilerScope.cs
- WindowsAltTab.cs
- WinEventHandler.cs
- MatrixTransform3D.cs
- AuthenticationConfig.cs
- PriorityBinding.cs
- RootProfilePropertySettingsCollection.cs
- ForeignKeyConstraint.cs
- SupportsPreviewControlAttribute.cs
- documentation.cs
- TriggerCollection.cs
- ModelPerspective.cs
- listitem.cs
- XmlBaseReader.cs
- HwndHostAutomationPeer.cs
- Encoder.cs
- SQlBooleanStorage.cs
- WebSysDescriptionAttribute.cs
- UrlMapping.cs
- ServerValidateEventArgs.cs
- NativeMethods.cs
- StickyNoteContentControl.cs
- RouteItem.cs
- _AuthenticationState.cs
- HttpBrowserCapabilitiesWrapper.cs
- AssociationType.cs
- WindowInteractionStateTracker.cs
- ConfigurationValues.cs
- DSASignatureFormatter.cs
- HtmlInputPassword.cs
- Rule.cs
- MessageTransmitTraceRecord.cs
- ProfileSettings.cs
- _SafeNetHandles.cs
- DataControlCommands.cs