using Client.Config; using Client.Utils; using System; using System.Drawing; using System.Linq; using System.Windows.Forms; using Chromium; using Chromium.WebBrowser; using Chromium.Event; using Chromium.WebBrowser.Event; using System.Diagnostics; using CMS_Client.Browser_Tools; using Chromium.Remote; using Chromium.Remote.Event; using System.IO; namespace CMS_Client.View { public partial class MainForm : Form { //Struct of PageError private struct PageError { public Boolean Error; public String ErrorInfo; } Random rnd = new Random(); //Internal Variables private PageError LoadingError; private NcForm NcFrm; private LoadingForm LdFrm; private static IntPtr MainHandle; private static IntPtr NcHandle; private int X = 0, Y = 0; private string BrokenUrl; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #region WINDOW_START_&_BEHAVIOUR_METHOD //Instance Method public MainForm() { LdFrm = new LoadingForm(); LdFrm.Owner = this; //Set the Loading window ShowLoading("Setup Main View..."); //Initialize the Windows InitializeComponent(); //Start Client Setting InitializeClientSettings(); //Initialize the Browser-Components InitializeBrowser(); //Set the client property this.Text = Application.ProductName + " " + Application.ProductVersion; this.Opacity = 0.0; //Initialize the Nc-Form InitializeNcForm(); //Load the page Browser.LoadUrl(Config.ConnectionConfig.StartingUrl); //Set the title of the window in "Loading" SetWindowTitle("Loading..."); ShowLoading("Loading Main View..."); NcWindow.mainFrm = this; } //On windows-Load Method private void MainForm_Load(object sender, EventArgs e) { this.DesktopLocation = new Point(X, Y); } //On Resize Form private void MainForm_Resize(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized) { NcWindow.ShowTaskBar(); if (Config.VendorHmiConfig.Enabled) NcFrm.Hide(); } else { NcWindow.ShowNcWindow(); if (Config.VendorHmiConfig.Enabled) NcFrm.Show(); } //Refresh Browser Paint Browser.Refresh(); this.Refresh(); } //Before closing the Window -> Remove the Browser (Increase the speed of closing window) private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { //Invoke method if is needed or call the method in STD mode if (!this.IsDisposed) { //Show Taskbar NcWindow.ShowTaskBar(); //Hide Window this.Hide(); //Close Virtual Keyboard Runtime if (Config.ClientConfig.ShowVirtualKeyboard && Environment.OSVersion.Version.Major < 10) NcWindow.closeVirtualKeyboard(); //Close the NC HMI && Stop Following Nc if (Config.VendorHmiConfig.Enabled) NcWindow.CloseNcWindow(false); //Close Chromium Runtime CfxRuntime.Shutdown(); } } #endregion /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #region SETUP_METHODS //Initialize CMS-Client Settings private void InitializeClientSettings() { //Set the Transparency Key TransparencyKey = Config.ClientConfig.TranspColor; //Calculate Window Position CalcWindowPosition(); } //Initialize CMS-Client Settings private void InitializeNcForm() { //Create the Nc-Form if (Config.VendorHmiConfig.Enabled) { NcFrm = new NcForm(TransparencyKey, X, Y); NcHandle = NcFrm.Handle; NcFrm.Show(); } //Steup the Step variables MainHandle = this.Handle; } //Initialize the Browser-Component private void InitializeBrowser() { //Add Custom object to browser Browser.GlobalObject.Add(Constants.BROWSER_JS_OBJ_NAME, new BrowserJSObject(this)); //Add all Handlers Browser.DisplayHandler.OnTitleChange += BrowserTitleChanged; Browser.LoadHandler.OnLoadingStateChange += BrowserLoadsChanged; Browser.LoadHandler.OnLoadError += BrowserLoadsError; Browser.KeyboardHandler.OnKeyEvent += BrowserKeyPress; Browser.ContextMenuHandler.OnBeforeContextMenu += BrowserContextMenu; Browser.DisplayHandler.OnConsoleMessage += BrowserConsoleMessage; //Filter only < Win_10 Platform if (Config.ClientConfig.ShowVirtualKeyboard && Environment.OSVersion.Version.Major < 10) ChromiumWebBrowser.RemoteProcessCreated += (e) => { e.RenderProcessHandler.OnFocusedNodeChanged += BrowserNodeChanged; }; } #endregion /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #region BROWSER_EVENT_HANDLERS_METHODS //On browser Load-Error. Event Handler called by Browser private void BrowserLoadsError(object sender, CfxOnLoadErrorEventArgs e) { //Set the Load-Error global variable to TRUE LoadingError.Error = true; LoadingError.ErrorInfo = e.ErrorCode.GetHashCode() + " - " + e.ErrorText; if (e.FailedUrl != Constants.errorPageUrl) this.BrokenUrl = e.FailedUrl; //write the error in the Title Bar SetWindowTitle(LoadingError.ErrorInfo); } //On browser Load-Changed. Event Handler called by Browser private void BrowserLoadsChanged(object sender, CfxOnLoadingStateChangeEventArgs e) { //if the State is NOT "loading" if (!e.Browser.IsLoading) { //Hide Loading Window HideLoadingWindow(); //Show the Main Window, when the page is loaded ShowWindow(); //If is an Error Show the Error page if (LoadingError.Error && !LoadingError.ErrorInfo.Contains("ERR_ABORTED")) { Browser.LoadString(Config.ConnectionConfig.ErrorPage, Constants.errorPageUrl); } //Set focus on the page BrowserFocus(); } //if the State is "loading" else { //Hide NC Window NcWindow.SetState(0); HideNCWindow(); //Set the title of the window in "Loading" SetWindowTitle("Loading..."); //Set the Load-Error global variable to FALSE LoadingError.Error = false; } } //On browser Title-Changed. Event Handler called by Browser private void BrowserTitleChanged(object sender, CfxOnTitleChangeEventArgs e) { if (!LoadingError.Error) SetWindowTitle(e.Title); } // on Key-Press Browser private void BrowserKeyPress(object sender, CfxOnKeyEventEventArgs e) { } //Show Dev Tools Window private void ShowDevTools() { //Setup Dev Window CfxWindowInfo windowInfo = new CfxWindowInfo(); windowInfo.Style = (WindowStyle.WS_OVERLAPPEDWINDOW | WindowStyle.WS_POPUP | WindowStyle.WS_CLIPCHILDREN | WindowStyle.WS_CLIPSIBLINGS | WindowStyle.WS_VISIBLE); windowInfo.ParentWindow = MainHandle; windowInfo.WindowName = Application.ProductName + " | CEF Dev Tools"; windowInfo.X = 1120; windowInfo.Y = 0; windowInfo.Width = 800; windowInfo.Height = 1080; //Show Dev Window Browser.BrowserHost.ShowDevTools(windowInfo, new CfxClient(), new CfxBrowserSettings(), null); } //Show Chrome GPU Window private void ShowChromeGPU() { int w = 1600, h = 800; //Setup Window CfxWindowInfo windowInfo = new CfxWindowInfo(); windowInfo.Style = (WindowStyle.WS_OVERLAPPEDWINDOW | WindowStyle.WS_POPUP | WindowStyle.WS_CLIPCHILDREN | WindowStyle.WS_CLIPSIBLINGS | WindowStyle.WS_VISIBLE); windowInfo.ParentWindow = MainHandle; windowInfo.WindowName = Application.ProductName + " | CEF Graphic Tools"; windowInfo.X = (Screen.PrimaryScreen.Bounds.Width / 2) - (w / 2); windowInfo.Y = (Screen.PrimaryScreen.Bounds.Height / 2) - (h / 2); windowInfo.Width = w; windowInfo.Height = h; //Show Window CfxBrowserHost.CreateBrowser(windowInfo, new CfxClient(), "chrome://gpu/", ChromiumWebBrowser.DefaultBrowserSettings, null); } //Show Chrome Version Window private void ShowChromeVersion() { int w = 1600, h = 800; //Setup Window CfxWindowInfo windowInfo = new CfxWindowInfo(); windowInfo.Style = (WindowStyle.WS_OVERLAPPEDWINDOW | WindowStyle.WS_POPUP | WindowStyle.WS_CLIPCHILDREN | WindowStyle.WS_CLIPSIBLINGS | WindowStyle.WS_VISIBLE); windowInfo.ParentWindow = MainHandle; windowInfo.WindowName = Application.ProductName + " | CEF Chromium-Version Tools"; windowInfo.X = (Screen.PrimaryScreen.Bounds.Width / 2) - (w / 2); windowInfo.Y = (Screen.PrimaryScreen.Bounds.Height / 2) - (h / 2); windowInfo.Width = w; windowInfo.Height = h; //Show Window CfxBrowserHost.CreateBrowser(windowInfo, new CfxClient(), "chrome://version/", ChromiumWebBrowser.DefaultBrowserSettings, null); } //Override default Browser Context Menu private void BrowserContextMenu(object sender, CfxOnBeforeContextMenuEventArgs e) { e.Model.Clear(); } //Override Javascript Console Message private void BrowserConsoleMessage(object sender, CfxOnConsoleMessageEventArgs e) { e.SetReturnValue(true); } //Node Changed Handler private void BrowserNodeChanged(object sender, CfrOnFocusedNodeChangedEventArgs ev) { if (ev.Node != null) { String NodeName = ev.Node.ElementTagName.ToLower(); //Filter if this node is an INPUT Node if (NodeName != null && NodeName.Equals("input")) { String dom = ev.Node.GetElementAttribute("type").ToLower(); //Filter if the node Type is TEXT or PASSWORD if (dom != null && (dom.Equals("text") || dom.Equals("password"))) NcWindow.openVirtualKeyboard(ev.Node.ElementBounds, ev.Browser.Identifier > 1, false); } //Filter if this node is TEXTAREA Node else if (NodeName != null && NodeName.Equals("textarea")) NcWindow.openVirtualKeyboard(ev.Node.ElementBounds, ev.Browser.Identifier > 1, false); else NcWindow.hideVirtualKeyboard(); } else NcWindow.hideVirtualKeyboard(); } #endregion /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #region INVOKES_&_OTHER_METHODS //Reload Broken Url public void reloadBrokenPage() { if (!this.IsDisposed) { if (this.InvokeRequired) this.Invoke((MethodInvoker)delegate () { if (!String.IsNullOrWhiteSpace(this.BrokenUrl)) Browser.LoadUrl(this.BrokenUrl); }); else { if (!String.IsNullOrWhiteSpace(this.BrokenUrl)) Browser.LoadUrl(this.BrokenUrl); } } } //Show MainWindow Method private void ShowWindow() { //Invoke method if is needed or call the method in STD mode if (!this.IsDisposed) { if (this.InvokeRequired) this.Invoke((MethodInvoker)delegate () { this.WindowState = FormWindowState.Maximized; this.Opacity = 1.0; }); else { this.WindowState = FormWindowState.Maximized; this.Opacity = 1.0; } } if (!NcWindow.isFollowing) { //Start following NC Window if (Config.VendorHmiConfig.Enabled) NcWindow.StartNcFollowing(MainHandle, NcHandle, NcFrm.Width, NcFrm.Height); else NcWindow.StartStepFollowing(MainHandle); } } //Show Hide window private void HideLoadingWindow() { //Invoke method if is needed or call the method in STD mode if (!this.IsDisposed) { if (this.InvokeRequired) this.Invoke((MethodInvoker)delegate () { LdFrm.Hide(); }); else { LdFrm.Hide(); } } } //Show Message window private void ShowLoading(String Message) { //Invoke method if is needed or call the method in STD mode if (!this.IsDisposed) { if (this.InvokeRequired) this.Invoke((MethodInvoker)delegate () { //Set Message Status LdFrm.Show(Message); LdFrm.Focus(); }); else { //Set Message Status LdFrm.Show(Message); } } } //Show MainWindow Method private void BrowserFocus() { //Invoke method if is needed or call the method in STD mode if (Browser.InvokeRequired) Browser.Invoke((MethodInvoker)delegate () { Browser.Focus(); }); else Browser.Focus(); } //Set Window Title private void SetWindowTitle(String Title) { //Setup product label if (Environment.Is64BitProcess) Title = Application.ProductName + " x64 | " + Title; else Title = Application.ProductName + " x86 | " + Title; //Invoke method if is needed or call the method in STD mode if (!this.IsDisposed) { if (this.InvokeRequired) this.Invoke((MethodInvoker)delegate () { this.Text = Title; }); else this.Text = Title; } } //Show NC Method public void ShowNCWindow() { if (!Config.VendorHmiConfig.Enabled) return; //Invoke method if is needed or call the method in STD mode if (!this.IsDisposed) { if (this.InvokeRequired) this.Invoke((MethodInvoker)delegate () { if (this.NcFrm.Owner == null) { this.Owner = null; this.NcFrm.Owner = this; this.NcFrm.TopMost = true; this.NcFrm.TopMost = false; } }); else { if (this.NcFrm.Owner == null) { this.Owner = null; this.NcFrm.Owner = this; this.NcFrm.TopMost = true; this.NcFrm.TopMost = false; } } } } //Hide NC Method public void HideNCWindow() { if (!Config.VendorHmiConfig.Enabled) return; //Invoke method if is needed or call the method in STD mode if (!this.IsDisposed) { if (this.InvokeRequired) this.Invoke((MethodInvoker)delegate () { if (this.NcFrm.Owner != null) { this.NcFrm.Owner = null; this.TopMost = true; this.TopMost = false; } }); else { if (this.NcFrm.Owner != null) { this.NcFrm.Owner = null; this.TopMost = true; this.TopMost = false; } } } } //CAlculate Window Position private void CalcWindowPosition() { //Position of the Window if (Screen.AllScreens.Length > 1 && Config.ClientConfig.RunningOnSecondaryScreen) { Screen ps = Screen.AllScreens.FirstOrDefault(S => S.Primary == true); Screen ss = Screen.AllScreens.FirstOrDefault(S => S.Primary == false); X = ps.Bounds.Width; if (ss.Bounds.Top != 0) Y = ss.Bounds.Top; } } //Windows Keys Handler public void keyPressedHandler(bool altPressed, bool ctrlPressed, bool shiftPressed, int key) { //Work only if is a Developer mode if (Config.ClientConfig.DeveloperMode) { if (key == (int)Keys.F1) Browser.GoBack(); if (key == (int)Keys.F2) Browser.GoForward(); if (key == (int)Keys.F5) { if (Browser.Url.AbsoluteUri != Constants.errorPageUrl) Browser.Browser.ReloadIgnoreCache(); else Browser.LoadUrl(this.BrokenUrl); } if (key == (int)Keys.F10) ShowChromeVersion(); if (key == (int)Keys.F11) ShowChromeGPU(); if (key == (int)Keys.F12) ShowDevTools(); } } #endregion } }