ToolbarButtonWrapper: Added IButton.Important.
ToolbarButtonWrapper: Added IButton.Important.

--- a/ToolbarButtonWrapper.cs
+++ b/ToolbarButtonWrapper.cs
@@ -30,99 +30,9 @@
 	/// </summary>
 	internal class ToolbarButtonWrapper
 	{
-		protected static System.Type ToolbarManager;
-		protected static object TBManagerInstance;
-		protected static MethodInfo TBManagerAdd;
-
-		/// <summary>
-		/// Wraps the ToolbarManager class, if present.
-		/// </summary>
-		/// <returns><c>true</c>, if ToolbarManager is wrapped, <c>false</c> otherwise.</returns>
-		protected static bool TryWrapToolbarManager()
-		{
-			if (ToolbarManager == null)
-			{
-				Tools.PostDebugMessage(string.Format(
-					"{0}: Loading ToolbarManager.",
-					"ToolbarButtonWrapper"
-					));
-
-				ToolbarManager = AssemblyLoader.loadedAssemblies
-					.Select(a => a.assembly.GetExportedTypes())
-						.SelectMany(t => t)
-						.FirstOrDefault(t => t.FullName == "Toolbar.ToolbarManager");
-
-				Tools.PostDebugMessage(string.Format(
-					"{0}: Loaded ToolbarManager.  Getting Instance.",
-					"ToolbarButtonWrapper"
-					));
-
-				if (ToolbarManager == null)
-				{
-					return false;
-				}
-
-				TBManagerInstance = ToolbarManager.GetProperty(
-					"Instance",
-					System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static
-					)
-					.GetValue(null, null);
-
-				Tools.PostDebugMessage(string.Format(
-					"{0}: Got ToolbarManager Instance '{1}'.  Getting 'add' method.",
-					"ToolbarButtonWrapper",
-					TBManagerInstance
-					));
-
-				TBManagerAdd = ToolbarManager.GetMethod("add");
-
-				Tools.PostDebugMessage(string.Format(
-					"{0}: Got ToolbarManager Instance 'add' method.  Loading IButton.",
-					"ToolbarButtonWrapper"
-					));
-			}
-
-			return true;
-		}
-
-		/// <summary>
-		/// Gets a value indicating whether <see cref="Toolbar.ToolbarManager"/> is present.
-		/// </summary>
-		/// <value><c>true</c>, if ToolbarManager is wrapped, <c>false</c> otherwise.</value>
-		public static bool ToolbarManagerPresent
-		{
-			get
-			{
-				return TryWrapToolbarManager();
-			}
-		}
-
-		/// <summary>
-		/// If ToolbarManager is present, initializes a new instance of the <see cref="VOID.ToolbarButtonWrapper"/> class.
-		/// </summary>
-		/// <param name="ns">Namespace, usually the plugin name.</param>
-		/// <param name="id">Identifier, unique per namespace.</param>
-		/// <returns>If ToolbarManager is present, a new <see cref="Toolbar.IButton"/> object, <c>null</c> otherwise.</returns>
-		public static ToolbarButtonWrapper TryWrapToolbarButton(string ns, string id)
-		{
-			if (ToolbarManagerPresent)
-			{
-				object button = TBManagerAdd.Invoke(TBManagerInstance, new object[] { ns, id });
-
-				Tools.PostDebugMessage(string.Format(
-					"{0}: Added Button '{1}' with ToolbarManager.  Getting 'Text' property",
-					"ToolbarButtonWrapper",
-					button.ToString()
-				));
-
-				return new ToolbarButtonWrapper(button);
-			}
-			else
-			{
-				return null;
-			}
-		}
-
+		protected System.Type ToolbarManager;
+		protected object TBManagerInstance;
+		protected MethodInfo TBManagerAdd;
 		protected System.Type IButton;
 		protected object Button;
 		protected PropertyInfo ButtonText;
@@ -132,6 +42,7 @@
 		protected PropertyInfo ButtonVisible;
 		protected PropertyInfo ButtonVisibility;
 		protected PropertyInfo ButtonEnalbed;
+		protected PropertyInfo ButtonImportant;
 		protected EventInfo ButtonOnClick;
 		protected System.Type ClickHandlerType;
 		protected MethodInfo ButtonDestroy;
@@ -256,16 +167,81 @@
 			}
 		}
 
-		private ToolbarButtonWrapper() {}
+		/// <summary>
+		/// Whether this button is currently "important."  Set to false to return to normal button behaviour.
+		/// </summary>
+		/// <remarks>
+		/// <para>
+		/// This can be used to temporarily force the button to be shown on the screen regardless of the toolbar being
+		/// currently in auto-hidden mode.  For example, a button that signals the arrival of a private message in a
+		/// chat room could mark itself as "important" as long as the message has not been read.
+		/// </para>
+		/// <para>
+		/// Setting this property does not change the appearance of the button.  use <see cref="TexturePath"/>  to
+		/// change the button's icon.
+		/// </para>
+		/// <para>
+		/// This feature should be used only sparingly, if at all, since it forces the button to be displayed on screen
+		/// even when it normally wouldn't.
+		/// </para>
+		/// </remarks>
+		/// <value><c>true</c> if important; otherwise, <c>false</c>.</value>
+		public bool Important
+		{
+			get
+			{
+				return (bool)this.ButtonImportant.GetValue(this.Button, null);
+			}
+			set
+			{
+				this.ButtonImportant.SetValue(this.Button, value, null);
+			}
+		}
+
+		private ToolbarButtonWrapper()
+		{
+		}
 
 		/// <summary>
 		/// Initializes a new instance of the <see cref="VOID.ToolbarButtonWrapper"/> class.
 		/// </summary>
 		/// <param name="ns">Namespace, usually the plugin name.</param>
 		/// <param name="id">Identifier, unique per namespace.</param>
-		protected ToolbarButtonWrapper(object button)
-		{
-			this.Button = button;
+		public ToolbarButtonWrapper(string ns, string id)
+		{
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Loading ToolbarManager.",
+				this.GetType().Name
+			));
+
+			this.ToolbarManager = AssemblyLoader.loadedAssemblies
+				.Select(a => a.assembly.GetExportedTypes())
+				.SelectMany(t => t)
+				.FirstOrDefault(t => t.FullName == "Toolbar.ToolbarManager");
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Loaded ToolbarManager.  Getting Instance.",
+				this.GetType().Name
+			));
+
+			this.TBManagerInstance = this.ToolbarManager.GetProperty(
+				"Instance",
+				System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static
+			)
+				.GetValue(null, null);
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Got ToolbarManager Instance '{1}'.  Getting 'add' method.",
+				this.GetType().Name,
+				this.TBManagerInstance
+			));
+
+			this.TBManagerAdd = this.ToolbarManager.GetMethod("add");
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Got ToolbarManager Instance 'add' method.  Loading IButton.",
+				this.GetType().Name
+			));
 
 			this.IButton = AssemblyLoader.loadedAssemblies
 				.Select(a => a.assembly.GetExportedTypes())
@@ -275,56 +251,71 @@
 			Tools.PostDebugMessage(string.Format(
 				"{0}: Loaded IButton.  Adding Button with ToolbarManager.",
 				this.GetType().Name
-				));
+			));
+
+			this.Button = this.TBManagerAdd.Invoke(this.TBManagerInstance, new object[] { ns, id });
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Added Button '{1}' with ToolbarManager.  Getting 'Text' property",
+				this.GetType().Name,
+				this.Button.ToString()
+			));
 
 			this.ButtonText = this.IButton.GetProperty("Text");
 
 			Tools.PostDebugMessage(string.Format(
 				"{0}: Got 'Text' property.  Getting 'TextColor' property.",
 				this.GetType().Name
-				));
+			));
 
 			this.ButtonTextColor = this.IButton.GetProperty("TextColor");
 
 			Tools.PostDebugMessage(string.Format(
 				"{0}: Got 'TextColor' property.  Getting 'TexturePath' property.",
 				this.GetType().Name
-				));
+			));
 
 			this.ButtonTexturePath = this.IButton.GetProperty("TexturePath");
 			
 			Tools.PostDebugMessage(string.Format(
 				"{0}: Got 'TexturePath' property.  Getting 'ToolTip' property.",
 				this.GetType().Name
-				));
+			));
 
 			this.ButtonToolTip = this.IButton.GetProperty("ToolTip");
 
 			Tools.PostDebugMessage(string.Format(
 				"{0}: Got 'ToolTip' property.  Getting 'Visible' property.",
 				this.GetType().Name
-				));
+			));
 
 			this.ButtonVisible = this.IButton.GetProperty("Visible");
 
 			Tools.PostDebugMessage(string.Format(
 				"{0}: Got 'Visible' property.  Getting 'Visibility' property.",
 				this.GetType().Name
-				));
+			));
 
 			this.ButtonVisibility = this.IButton.GetProperty("Visibility");
 
 			Tools.PostDebugMessage(string.Format(
 				"{0}: Got 'Visibility' property.  Getting 'Enabled' property.",
 				this.GetType().Name
-				));
+			));
 
 			this.ButtonEnalbed = this.IButton.GetProperty("Enabled");
 
 			Tools.PostDebugMessage(string.Format(
 				"{0}: Got 'Enabled' property.  Getting 'OnClick' event.",
 				this.GetType().Name
-				));
+			));
+
+			this.ButtonImportant = this.IButton.GetProperty("Important");
+
+			Tools.PostDebugMessage(string.Format(
+				"{0}: Got 'Enabled' property.  Getting 'OnClick' event.",
+				this.GetType().Name
+			));
 
 			this.ButtonOnClick = this.IButton.GetEvent("OnClick");
 			this.ClickHandlerType = this.ButtonOnClick.EventHandlerType;
@@ -333,7 +324,7 @@
 				"{0}: Got 'OnClick' event '{1}'.  Getting 'Destroy' method.",
 				this.GetType().Name,
 				this.ButtonOnClick.ToString()
-				));
+			));
 
 			this.ButtonDestroy = this.IButton.GetMethod("Destroy");
 
@@ -341,7 +332,7 @@
 				"{0}: Got 'Destroy' property '{1}'.  Loading GameScenesVisibility class.",
 				this.GetType().Name,
 				this.ButtonDestroy.ToString()
-				));
+			));
 
 			this.GameScenesVisibilityType = AssemblyLoader.loadedAssemblies
 				.Select(a => a.assembly.GetExportedTypes())
@@ -352,7 +343,7 @@
 				"{0}: Got 'GameScenesVisibility' class '{1}'.",
 				this.GetType().Name,
 				this.GameScenesVisibilityType.ToString()
-				));
+			));
 
 			Tools.PostDebugMessage("ToolbarButtonWrapper built!");
 		}

--- a/VOID_Core.cs
+++ b/VOID_Core.cs
@@ -157,7 +157,7 @@
 
 		[AVOID_SaveValue("UseBlizzyToolbar")]
 		protected VOID_SaveValue<bool> _UseToolbarManager;
-		protected bool ToolbarManagerLoaded;
+		protected bool ToolbarManagerLoaded = false;
 		internal ToolbarButtonWrapper ToolbarButton;
 
 		/*
@@ -280,7 +280,6 @@
 			this._skinName = this.defaultSkin;
 
 			this.UseToolbarManager = false;
-			this.ToolbarManagerLoaded = false;
 
 			this.LoadConfig ();
 		}
@@ -446,17 +445,29 @@
 
 		protected void LoadToolbarManager()
 		{
-			this.ToolbarManagerLoaded = ToolbarButtonWrapper.ToolbarManagerPresent;
-
-			if (this.ToolbarManagerLoaded)
-			{
-				this.InitializeToolbarButton();
-			}
+			Type ToolbarManager = AssemblyLoader.loadedAssemblies
+				.Select(a => a.assembly.GetExportedTypes())
+					.SelectMany(t => t)
+					.FirstOrDefault(t => t.FullName == "Toolbar.ToolbarManager");
+
+			if (ToolbarManager == null)
+			{
+				Tools.PostDebugMessage(string.Format(
+					"{0}: Could not load ToolbarManager.",
+					this.GetType().Name
+				));
+
+				return;
+			}
+
+			this.InitializeToolbarButton();
+
+			this.ToolbarManagerLoaded = true;
 		}
 
 		protected void InitializeToolbarButton()
 		{
-			this.ToolbarButton = ToolbarButtonWrapper.TryWrapToolbarButton(this.GetType().Name, "coreToggle");
+			this.ToolbarButton = new ToolbarButtonWrapper(this.GetType().Name, "coreToggle");
 			this.ToolbarButton.Text = this.VoidName;
 			this.ToolbarButton.TexturePath = this.VOIDIconOffPath + "_24x24";
 			if (this is VOID_EditorCore)