Contents
Cinchoo is the application framework for .NET. One of the main functionalities it provides to the users is application configuration management. Application configuration is the information that application reads and/or writes at run-time from the source.
One another important feature it offers to the developers community is the unified, generic application host to build and run application in different modes. Code once, run the application as either Console, Windows, WPF, Windows Service or Windows Tray application.
In this article, I'm going to illustrate how to use this library to create Windows Systems Tray application. It is a simpler, fluent model for configuring everything about your tray application in one place. Making it as library letting you to concentrate yourself on the core development tasks. Cinchoo provides a clean and easy API to develop and run Windows systems tray applications.
The application host library is written in C# for the .NET 4.0 Framework. It is part of Cinchoo framework, which is a great library with lot of features like Configuration Management, common ApplicationHost, Shell features etc.
Lets begin by looking into a simple example of a windows systems tray application displaying 'Hello World!' tooltip text.
Download the latest Cinchoo binary here. (Nuget Command: Install-Package Cinchoo)
- Open VS.NET 2010 or higher
- Create a sample VS.NET (.NET Framework 4) Console Application project
- Add reference to Cinchoo.Core.dll
- Use the
Cinchoo.Core
namespace - Copy and paste the below application host object
Listing 3.1 Defining ApplicationHost object
[ChoApplicationHost]
public class HelloWorldAppHost : ChoApplicationHost
{
protected override void ApplyGlobalApplicationSettingsOverrides(ChoGlobalApplicationSettings obj)
{
obj.TrayApplicationBehaviourSettings.TurnOn = true;
obj.TrayApplicationBehaviourSettings.TooltipText = "Hello World!";
}
}
The code above illustrates about defining ApplicationHost object. First thing define a ApplicationHost (ex. HelloWorldAppHost) class from ChoApplicationHost, it indicates that this object is an ApplicationHost object. And it must be decorated with ChoApplicationHostAttribute to complete the definition.
In this example, we override ApplyGlobalApplicationSettingsOverrides method. In there, we instruct the application to run as Tray Application by setting TurnOn member of TrayApplicationBehaviourSettings object to true. Set the TooltipText value to "Hello World!", this will display the message when you mouse over the tray icon.
Listing 3.2 Main Method
class Program
{
static void Main(string[] args)
{
ChoApplication.Run(args);
}
}
We start by calling ChoApplication.Run() method in the main entry of the application. That all. All the heavy lifting of configuring, running the application as tray application is done by the library under the hood. Now your application is tray application enabled application. Lets try for yourself.
All application host objects must be decorated by ChoApplicationHostAttribute. An application must have atleast one application host object defined. Cinchoo framework will discover them at the application startup.
All application host objects must be derived from ChoApplicationHost class. By default, it provides basic wire frame of running tray application without making any customization. Some cases, you may want to customize the way you want. In such cases, override nessasary overrides in them. An application must have one application host object defined either in the entry assembly or referenced assemblies. In this object, you can override number of methods for your needs to customize the tray application.
When implemented in a derived class, executes when a application is launched. In here, you have option to override tray application configuration parameters to customize it. Please refer section TrayApplicationBehaviourSettings for more information.
When implemented in a derived class, executes when a application runs in Tray application mode. In this method, you can change the tray icon properies. Please refer section ChoNotifyIcon section for more information.
When implemented in a derived class, executes when user clicks the 'About' menu item from the context menu. In here, you can display the product information of your application.
When implemented in a derived class, executes when user clicks the 'Exit' menu item from the context menu. In here, you can perform any cleanup action of your application.
When implemented in a derived class, executes when user clicks the 'Help' menu item from the context menu. In here, you can display help information for your application.
When implemented in a derived class, executes when user clicks the 'Open' menu item from the context menu. By default, Cinchoo framework will open the main window of your application, if any specified. This default behaviour can be overriable to perform any custom actions.
It is a property returns the main window of your application. Default is null. In this case, your application is windowless tray application. This property can be overridable to return either System.Windows.Forms.Form or System.Windows.Window object.
This property mainly used for WPF application. It returns an object of System.Windows.Application object.
This is easiest way to customize your tray application. Either override the ApplyGlobalApplicationSettingsOverrides() method in your Application Host object or open the ChoCoreFrx.xml configuration file to manipulate this object properties. Cinchoo framework uses them to customize the tray application before launching them.
Gets or sets the turn on switch the Tray Application.
Listing 5.1.1.1 Set TurnOn programmatically
[ChoApplicationHost]
public class ChoAppHost : ChoApplicationHost
{
protected override void ApplyGlobalApplicationSettingsOverrides(ChoGlobalApplicationSettings obj)
{
obj.TrayApplicationBehaviourSettings.TurnOn = true;
obj.TrayApplicationBehaviourSettings.BalloontipText = "Hello World!";
}
}
Listing 5.1.1.2 Set TurnOn via ChoCoreFrx.xml file
Open ChoCoreFrx.xml file, specify the boolean value in 'turnOn' attribute under 'trayApplicationBehaviourSettings' element.
="1.0"="utf-8"
<configuration>
<globalApplicationSettings applicationId="WindowlessTrayApp.exe" eventLogSourceName="WindowlessTrayApp.exe">
<behaviourSettings hideWindow="false" bringWindowToTop="false" alwaysOnTop="false" runAtStartup="false" runOnceAtStartup="false" singleInstanceApp="true" activateFirstInstance="false" showEnvironmentSelectionWnd="true" />
<trayApplicationBehaviourSettings turnOn="true" showInTaskbar="true" hideMainWindowAtStartup="false" tooltipText="" balloonTipText="Hello World!" hideTrayIconWhenMainWindowShown="false" turnOnMode="OnMinimize">
<trayIcon />
<fontSettings fontName="Helvetica" fontSize="8">
<fontColor />
</fontSettings>
</trayApplicationBehaviourSettings>
</globalApplicationSettings>
</configuration>
Gets or sets the text to display on the balloon tip associated with the NotifyIcon.
Listing 5.1.2.1 Set BalloonTipText programmatically
[ChoApplicationHost]
public class ChoAppHost : ChoApplicationHost
{
protected override void ApplyGlobalApplicationSettingsOverrides(ChoGlobalApplicationSettings obj)
{
obj.TrayApplicationBehaviourSettings.TurnOn = true;
obj.TrayApplicationBehaviourSettings.BalloontipText = "Hello World!";
}
}
Listing 5.1.2.2 Set BalloontipText via ChoCoreFrx.xml file
Open ChoCoreFrx.xml file, specify the text in 'balloonTipText' attribute under 'trayApplicationBehaviourSettings' element.
="1.0"="utf-8"
<configuration>
<globalApplicationSettings applicationId="WindowlessTrayApp.exe" eventLogSourceName="WindowlessTrayApp.exe">
<behaviourSettings hideWindow="false" bringWindowToTop="false" alwaysOnTop="false" runAtStartup="false" runOnceAtStartup="false" singleInstanceApp="true" activateFirstInstance="false" showEnvironmentSelectionWnd="true" />
<trayApplicationBehaviourSettings turnOn="false" showInTaskbar="true" hideMainWindowAtStartup="false" tooltipText="" balloonTipText="Hello World!" hideTrayIconWhenMainWindowShown="false" turnOnMode="OnMinimize">
<trayIcon />
<fontSettings fontName="Helvetica" fontSize="8">
<fontColor />
</fontSettings>
</trayApplicationBehaviourSettings>
</globalApplicationSettings>
</configuration>
Gets or sets the ToolTip text displayed when the mouse pointer rests on a notification area icon.
Listing 5.1.3.1 Set TooltipText programmatically
[ChoApplicationHost]
public class ChoAppHost : ChoApplicationHost
{
protected override void ApplyGlobalApplicationSettingsOverrides(ChoGlobalApplicationSettings obj)
{
obj.TrayApplicationBehaviourSettings.TurnOn = true;
obj.TrayApplicationBehaviourSettings.BalloontipText = "Hello World!";
}
}
Listing 5.1.3.2 Set TooltipText via ChoCoreFrx.xml file
Open ChoCoreFrx.xml file, specify the text in 'tooltipText' attribute under 'trayApplicationBehaviourSettings' element.
="1.0"="utf-8"
<configuration>
<globalApplicationSettings applicationId="WindowlessTrayApp.exe" eventLogSourceName="WindowlessTrayApp.exe">
<behaviourSettings hideWindow="false" bringWindowToTop="false" alwaysOnTop="false" runAtStartup="false" runOnceAtStartup="false" singleInstanceApp="true" activateFirstInstance="false" showEnvironmentSelectionWnd="true" />
<trayApplicationBehaviourSettings turnOn="false" showInTaskbar="true" hideMainWindowAtStartup="false" tooltipText="" balloonTipText="Hello World!" hideTrayIconWhenMainWindowShown="false" turnOnMode="OnMinimize">
<trayIcon />
<fontSettings fontName="Helvetica" fontSize="8">
<fontColor />
</fontSettings>
</trayApplicationBehaviourSettings>
</globalApplicationSettings>
</configuration>
Gets or sets the current icon. It will display an icon for an application in the notification area.
Listing 5.1.4.1 Set TrayIcon programmatically
[ChoApplicationHost]
public class ChoAppHost : ChoApplicationHost
{
protected override void ApplyGlobalApplicationSettingsOverrides(ChoGlobalApplicationSettings obj)
{
obj.TrayApplicationBehaviourSettings.TurnOn = true;
obj.TrayApplicationBehaviourSettings.TrayIcon = @"C:\Sample.ico";
}
}
Listing 5.1.4.2 Set TrayIcon via ChoCoreFrx.xml file
Open ChoCoreFrx.xml file, specify the path to icon file in 'trayIcon' element under 'trayApplicationBehaviourSettings' element.
="1.0"="utf-8"
<configuration>
<globalApplicationSettings applicationId="WindowlessTrayApp.exe" eventLogSourceName="WindowlessTrayApp.exe">
<behaviourSettings hideWindow="false" bringWindowToTop="false" alwaysOnTop="false" runAtStartup="false" runOnceAtStartup="false" singleInstanceApp="true" activateFirstInstance="false" showEnvironmentSelectionWnd="true" />
<trayApplicationBehaviourSettings turnOn="false" showInTaskbar="true" hideMainWindowAtStartup="false" tooltipText="" balloonTipText="Hello World!" hideTrayIconWhenMainWindowShown="false" turnOnMode="OnMinimize">
<trayIcon>C:\Sample.ico</trayIcon>
<fontSettings fontName="Helvetica" fontSize="8">
<fontColor />
</fontSettings>
</trayApplicationBehaviourSettings>
</globalApplicationSettings>
</configuration>
Gets or sets a value indicating whether the main window is displayed in the Windows taskbar.
Listing 5.1.5.1 Set ShowInTaskbar programmatically
[ChoApplicationHost]
public class ChoAppHost : ChoApplicationHost
{
protected override void ApplyGlobalApplicationSettingsOverrides(ChoGlobalApplicationSettings obj)
{
obj.TrayApplicationBehaviourSettings.TurnOn = true;
obj.TrayApplicationBehaviourSettings.ShowInTaskbar = true;
}
}
Listing 5.1.5.2 Set ShowInTaskbar via ChoCoreFrx.xml file
Open ChoCoreFrx.xml file, specify boolean value in 'showInTaskbar' attribute under 'trayApplicationBehaviourSettings' element.
="1.0"="utf-8"
<configuration>
<globalApplicationSettings applicationId="WindowlessTrayApp.exe" eventLogSourceName="WindowlessTrayApp.exe">
<behaviourSettings hideWindow="false" bringWindowToTop="false" alwaysOnTop="false" runAtStartup="false" runOnceAtStartup="false" singleInstanceApp="true" activateFirstInstance="false" showEnvironmentSelectionWnd="true" />
<trayApplicationBehaviourSettings turnOn="false" showInTaskbar="true" hideMainWindowAtStartup="false" tooltipText="" balloonTipText="Hello World!" hideTrayIconWhenMainWindowShown="false" turnOnMode="OnMinimize">
<trayIcon>C:\Sample.ico</trayIcon>
<fontSettings fontName="Helvetica" fontSize="8">
<fontColor />
</fontSettings>
</trayApplicationBehaviourSettings>
</globalApplicationSettings>
</configuration>
Gets or sets a value indicating whether the main window should be displayed or not at the application startup.
Listing 5.1.6.1 Set ShowInTaskbar programmatically
[ChoApplicationHost]
public class ChoAppHost : ChoApplicationHost
{
protected override void ApplyGlobalApplicationSettingsOverrides(ChoGlobalApplicationSettings obj)
{
obj.TrayApplicationBehaviourSettings.TurnOn = true;
obj.TrayApplicationBehaviourSettings.HideMainWindowAtStartup = true;
}
}
Listing 5.1.6.2 Set ShowInTaskbar via ChoCoreFrx.xml file
Open ChoCoreFrx.xml file, specify boolean value in 'hideMainWindowAtStartup' attribute under 'trayApplicationBehaviourSettings' element.
="1.0"="utf-8"
<configuration>
<globalApplicationSettings applicationId="WindowlessTrayApp.exe" eventLogSourceName="WindowlessTrayApp.exe">
<behaviourSettings hideWindow="false" bringWindowToTop="false" alwaysOnTop="false" runAtStartup="false" runOnceAtStartup="false" singleInstanceApp="true" activateFirstInstance="false" showEnvironmentSelectionWnd="true" />
<trayApplicationBehaviourSettings turnOn="false" showInTaskbar="true" hideMainWindowAtStartup="false" tooltipText="" balloonTipText="Hello World!" hideTrayIconWhenMainWindowShown="false" turnOnMode="OnMinimize">
<trayIcon>C:\Sample.ico</trayIcon>
<fontSettings fontName="Helvetica" fontSize="8">
<fontColor />
</fontSettings>
</trayApplicationBehaviourSettings>
</globalApplicationSettings>
</configuration>
Gets or sets a value indicating whether the tray icon should be hidden when main window is displayed.
Listing 5.1.7.1 Set HideTrayIconWhenMainWindowShown programmatically
[ChoApplicationHost]
public class ChoAppHost : ChoApplicationHost
{
protected override void ApplyGlobalApplicationSettingsOverrides(ChoGlobalApplicationSettings obj)
{
obj.TrayApplicationBehaviourSettings.TurnOn = true;
obj.TrayApplicationBehaviourSettings.HideTrayIconWhenMainWindowShown = true;
}
}
Listing 5.1.7.2 Set HideTrayIconWhenMainWindowShown via ChoCoreFrx.xml file
Open ChoCoreFrx.xml file, specify boolean value in 'hideTrayIconWhenMainWindowShown' attribute under 'trayApplicationBehaviourSettings' element.
="1.0"="utf-8"
<configuration>
<globalApplicationSettings applicationId="WindowlessTrayApp.exe" eventLogSourceName="WindowlessTrayApp.exe">
<behaviourSettings hideWindow="false" bringWindowToTop="false" alwaysOnTop="false" runAtStartup="false" runOnceAtStartup="false" singleInstanceApp="true" activateFirstInstance="false" showEnvironmentSelectionWnd="true" />
<trayApplicationBehaviourSettings turnOn="false" showInTaskbar="true" hideMainWindowAtStartup="false" tooltipText="" balloonTipText="Hello World!" hideTrayIconWhenMainWindowShown="false" turnOnMode="OnMinimize">
<trayIcon>C:\Sample.ico</trayIcon>
<fontSettings fontName="Helvetica" fontSize="8">
<fontColor />
</fontSettings>
</trayApplicationBehaviourSettings>
</globalApplicationSettings>
</configuration>
Gets or sets a value indicating when the application is turned on to tray application mode. There are 3 modes to choose from
- OnMinimize (Default)
- OnClose
- OnMinimizeOrClose
Listing 5.1.8.1 Set TurnOnMode programmatically
[ChoApplicationHost]
public class ChoAppHost : ChoApplicationHost
{
protected override void ApplyGlobalApplicationSettingsOverrides(ChoGlobalApplicationSettings obj)
{
obj.TrayApplicationBehaviourSettings.TurnOn = true;
obj.TrayApplicationBehaviourSettings.TurnOnMode = ChoTrayAppTurnOnMode.OnMinimize;
}
}
Listing 5.1.8.2 Set TurnOnMode via ChoCoreFrx.xml file
Open ChoCoreFrx.xml file, specify the ChoTrayAppTurnOnMode value in 'turnOnMode' attribute under 'trayApplicationBehaviourSettings' element.
="1.0"="utf-8"
<configuration>
<globalApplicationSettings applicationId="WindowlessTrayApp.exe" eventLogSourceName="WindowlessTrayApp.exe">
<behaviourSettings hideWindow="false" bringWindowToTop="false" alwaysOnTop="false" runAtStartup="false" runOnceAtStartup="false" singleInstanceApp="true" activateFirstInstance="false" showEnvironmentSelectionWnd="true" />
<trayApplicationBehaviourSettings turnOn="false" showInTaskbar="true" hideMainWindowAtStartup="false" tooltipText="" balloonTipText="Hello World!" hideTrayIconWhenMainWindowShown="false" turnOnMode="OnMinimize">
<trayIcon>C:\Sample.ico</trayIcon>
<fontSettings fontName="Helvetica" fontSize="8">
<fontColor />
</fontSettings>
</trayApplicationBehaviourSettings>
</globalApplicationSettings>
</configuration>
Gets or Sets the visibility of each of menu items in the default context menu displayed in the tray icon. Below are menu items can be controled via this settings object
- About
- Help
- Exit
- AlwaysOnTop
- RunAtSystemsStartup
- ShowInTaskbar
Listing 5.1.9.1 Set ContextMenuSettings programmatically
[ChoApplicationHost]
public class ChoAppHost : ChoApplicationHost
{
protected override void ApplyGlobalApplicationSettingsOverrides(ChoGlobalApplicationSettings obj)
{
obj.TrayApplicationBehaviourSettings.TurnOn = true;
obj.TrayApplicationBehaviourSettings.ContextMenuSettings.DisplayShowInTaskbarMenuItem = false;
}
}
Listing 5.1.9.2 Set ContextMenuSettings via ChoCoreFrx.xml file
Open ChoCoreFrx.xml file, specify the boolean values to each attributes in 'contextMenuSettings' element under 'trayApplicationBehaviourSettings' element.
="1.0"="utf-8"
<configuration>
<globalApplicationSettings applicationId="WindowlessTrayApp.exe" eventLogSourceName="WindowlessTrayApp.exe">
<behaviourSettings hideWindow="false" bringWindowToTop="false" alwaysOnTop="false" runAtStartup="false" runOnceAtStartup="false" singleInstanceApp="true" activateFirstInstance="false" showEnvironmentSelectionWnd="true" />
<trayApplicationBehaviourSettings turnOn="false" showInTaskbar="true" hideMainWindowAtStartup="false" tooltipText="" balloonTipText="Hello World!" hideTrayIconWhenMainWindowShown="false" turnOnMode="OnMinimize">
<trayIcon>C:\Sample.ico</trayIcon>
<fontSettings fontName="Helvetica" fontSize="8">
<fontColor />
</fontSettings>
<contextMenuSettings displayAlwaysOnTopMenuItem="true" displayRunAtSystemsStartupMenuItem="true" displayShowInTaskbarMenuItem="true" displayAboutMenuItem="true" displayHelpMenuItem="true" displayExitMenuItem="true" />
</trayApplicationBehaviourSettings>
</globalApplicationSettings>
</configuration>
Gets or Sets the fonts propeties to display text instead of icon in the task tray. Using one of the ShowText() overloads to set this text. These are default application wide settings, can be overriable via one of the ShowText() overloads.
Available properties are
- FontColor
- FontName
- FontSize
Listing 5.1.10.1 Set FontSettings programmatically
[ChoApplicationHost]
public class ChoAppHost : ChoApplicationHost
{
protected override void ApplyGlobalApplicationSettingsOverrides(ChoGlobalApplicationSettings obj)
{
obj.TrayApplicationBehaviourSettings.TurnOn = true;
obj.TrayApplicationBehaviourSettings.ContextMenuSettings.DisplayShowInTaskbarMenuItem = false;
obj.TrayApplicationBehaviourSettings.FontSettings.FontSize = 9;
}
}
Listing 5.1.10.2 Set FontSettings via ChoCoreFrx.xml file
Open ChoCoreFrx.xml file, specify the values to each applicable attributes in 'fontSettings' element under 'trayApplicationBehaviourSettings' element.
="1.0"="utf-8"
<configuration>
<globalApplicationSettings applicationId="WindowlessTrayApp.exe" eventLogSourceName="WindowlessTrayApp.exe">
<behaviourSettings hideWindow="false" bringWindowToTop="false" alwaysOnTop="false" runAtStartup="false" runOnceAtStartup="false" singleInstanceApp="true" activateFirstInstance="false" showEnvironmentSelectionWnd="true" />
<trayApplicationBehaviourSettings turnOn="false" showInTaskbar="true" hideMainWindowAtStartup="false" tooltipText="" balloonTipText="Hello World!" hideTrayIconWhenMainWindowShown="false" turnOnMode="OnMinimize">
<trayIcon>C:\Sample.ico</trayIcon>
<fontSettings fontName="Helvetica" fontSize="8">
<fontColor />
</fontSettings>
<contextMenuSettings displayAlwaysOnTopMenuItem="true" displayRunAtSystemsStartupMenuItem="true" displayShowInTaskbarMenuItem="true" displayAboutMenuItem="true" displayHelpMenuItem="true" displayExitMenuItem="true" />
</trayApplicationBehaviourSettings>
</globalApplicationSettings>
</configuration>
Now that we learned about configuraring tray application via programmatically as well as configuration file. In this section we dive into more advanced approach to customize your tray application programatically, something seldom used.
When implemented in a derived class, executes after the ChoNotifyIcon object constructed by the framework. In this method, you can manipulate most of the ChoNotifyIcon properties based on your neeeds. Please refer ChoNotidyIcon class help for more information. Besides standard properties exposed via this object, it also provides some additional helper methods to use.
Listing 6.1.1 AfterNotifyIconContructed() sample
[ChoApplicationHost]
public class ChoAppHost : ChoApplicationHost
{
protected override void ApplyGlobalApplicationSettingsOverrides(ChoGlobalApplicationSettings obj)
{
obj.TrayApplicationBehaviourSettings.TurnOn = true;
}
public override object MainWindowObject
{
get
{
return new MainWindow();
}
}
protected override void AfterNotifyIconConstructed(Cinchoo.Core.Windows.Forms.ChoNotifyIcon ni)
{
ni.Text = "AfterConstruct";
ni.ShowText("R");
}
}
The applications created using Cinchoo framework can be run as either Console, Windows, Tray or Service applications. Unified interface to switch application from one mode to another. After successful development of tray application, pass /#AM:Console command line argument in order to run your tray application as console mode.
Listing 6.2.1 Run tray application in console mode
>HelloWorldTrayApp /#AM:Console
Specifies a component that creates an icon in the notification area. This class cannot be inherited. Icons in the notification area are shortcuts to processes that are running in the background of a computer, such as a virus protection program or a volume control. These processes do not come with their own user interfaces. The NotifyIcon class provides a way to program in this functionality. The Icon property defines the icon that appears in the notification area. Pop-up menus for an icon are addressed with the ContextMenu property. ChoNotifyIcon provides property notification to all changes.
Showing text instead of icon in the tray.
Sets the animation clip that will be displayed in the tray. After setting the clips, you can control the animation by calling StartAnimation and StopAnimation methods.
Displays a balloon tip with the specified title, text, and icon in the taskbar for the specified time period.
Start showing the animation. This needs to be called after setting the clip using SetAnimationClip() methods.
Stop animation started with StartAnimation method.
Gets or sets the text to display on the balloon tip associated with the ChoNotifyIcon.
Gets or sets the title of the balloon tip displayed on theChoNotifyIcon.
Gets or sets the shortcut menu associated with the theChoNotifyIcon.
Gets or sets the shortcut menu for the icon.
Gets or sets the shortcut menu associated with the ChoNotifyIcon.
Gets or sets the current icon..
Gets or sets an object that contains data about the ChoNotifyIcon.
Gets or sets the ToolTip text displayed when the mouse pointer rests on a notification area icon.
Gets or sets a value indicating whether the icon is visible in the notification area of the taskbar..
Occurs when the balloon tip is clicked.
Occurs when the balloon tip is closed by the user.
Occurs when the balloon tip is displayed on the screen.
Occurs when the user clicks the icon in the notification area.
Occurs when the user double-clicks the icon in the notification area of the taskbar.
Occurs when the user clicks a System.Windows.Forms.NotifyIcon with the mouse.
Occurs when the user double-clicks the System.Windows.Forms.NotifyIcon with the mouse.
Occurs when the user presses the mouse button while the pointer is over the icon in the notification area of the taskbar.
Occurs when the user moves the mouse while the pointer is over the icon in the notification area of the taskbar.
Occurs when the user releases the mouse button while the pointer is over the icon in the notification area of the taskbar.
Please bookmark this article, more updates will come shortly