From 4880d62d1a7b396a3a98c25af9b679c358c952f1 Mon Sep 17 00:00:00 2001 From: Allen Wolf <63997543+aaw3@users.noreply.github.com> Date: Tue, 9 Jan 2024 23:31:49 -0600 Subject: [PATCH] Add project --- .gitignore | 227 ++++++++ src/.gitignore | 227 ++++++++ src/App.config | 6 + src/Form1.Designer.cs | 139 +++++ src/Form1.cs | 497 ++++++++++++++++ src/Form1.resx | 120 ++++ src/Form2.Designer.cs | 143 +++++ src/Form2.cs | 842 +++++++++++++++++++++++++++ src/Form2.resx | 120 ++++ src/InputBox.Designer.cs | 98 ++++ src/InputBox.cs | 81 +++ src/InputBox.resx | 120 ++++ src/Program.cs | 34 ++ src/Properties/AssemblyInfo.cs | 36 ++ src/Properties/Resources.Designer.cs | 71 +++ src/Properties/Resources.resx | 117 ++++ src/Properties/Settings.Designer.cs | 30 + src/Properties/Settings.settings | 7 + src/WidgetEmbed.csproj | 159 +++++ src/WidgetEmbed.sln | 31 + src/packages.config | 7 + 21 files changed, 3112 insertions(+) create mode 100644 .gitignore create mode 100644 src/.gitignore create mode 100755 src/App.config create mode 100755 src/Form1.Designer.cs create mode 100755 src/Form1.cs create mode 100755 src/Form1.resx create mode 100755 src/Form2.Designer.cs create mode 100755 src/Form2.cs create mode 100755 src/Form2.resx create mode 100755 src/InputBox.Designer.cs create mode 100755 src/InputBox.cs create mode 100755 src/InputBox.resx create mode 100755 src/Program.cs create mode 100755 src/Properties/AssemblyInfo.cs create mode 100755 src/Properties/Resources.Designer.cs create mode 100755 src/Properties/Resources.resx create mode 100755 src/Properties/Settings.Designer.cs create mode 100755 src/Properties/Settings.settings create mode 100755 src/WidgetEmbed.csproj create mode 100755 src/WidgetEmbed.sln create mode 100755 src/packages.config diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e0dfc29 --- /dev/null +++ b/.gitignore @@ -0,0 +1,227 @@ +# The following command works for downloading when using Git for Windows: +# curl -LOf http://gist.githubusercontent.com/kmorcinek/2710267/raw/.gitignore +# +# Download this file using PowerShell v3 under Windows with the following comand: +# Invoke-WebRequest https://gist.githubusercontent.com/kmorcinek/2710267/raw/ -OutFile .gitignore +# +# or wget: +# wget --no-check-certificate http://gist.githubusercontent.com/kmorcinek/2710267/raw/.gitignore + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +x64/ +[Bb]in/ +[Oo]bj/ +# build folder is nowadays used for build scripts and should not be ignored +#build/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings +modulesbin/ +tempbin/ + +# EPiServer Site file (VPP) +AppData/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# vim +*.txt~ +*.swp +*.swo + +# Temp files when opening LibreOffice on ubuntu +.~lock.* + +# svn +.svn + +# CVS - Source Control +**/CVS/ + +# Remainings from resolving conflicts in Source Control +*.orig + +# SQL Server files +**/App_Data/*.mdf +**/App_Data/*.ldf +**/App_Data/*.sdf + + +#LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml + +# ========================= +# Windows detritus +# ========================= + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# OS generated files # +Icon? + +# Mac desktop service store files +.DS_Store + +# SASS Compiler cache +.sass-cache + +# Visual Studio 2014 CTP +**/*.sln.ide + +# Visual Studio temp something +.vs/ + +# dotnet stuff +project.lock.json + +# VS 2015+ +*.vc.vc.opendb +*.vc.db + +# Rider +.idea/ + +# Visual Studio Code +.vscode/ + +# Output folder used by Webpack or other FE stuff +**/node_modules/* +**/wwwroot/* + +# SpecFlow specific +*.feature.cs +*.feature.xlsx.* +*.Specs_*.html + +# UWP Projects +AppPackages/ + +##### +# End of core ignore list, below put you custom 'per project' settings (patterns or path) +##### + diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..e0dfc29 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,227 @@ +# The following command works for downloading when using Git for Windows: +# curl -LOf http://gist.githubusercontent.com/kmorcinek/2710267/raw/.gitignore +# +# Download this file using PowerShell v3 under Windows with the following comand: +# Invoke-WebRequest https://gist.githubusercontent.com/kmorcinek/2710267/raw/ -OutFile .gitignore +# +# or wget: +# wget --no-check-certificate http://gist.githubusercontent.com/kmorcinek/2710267/raw/.gitignore + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +x64/ +[Bb]in/ +[Oo]bj/ +# build folder is nowadays used for build scripts and should not be ignored +#build/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings +modulesbin/ +tempbin/ + +# EPiServer Site file (VPP) +AppData/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# vim +*.txt~ +*.swp +*.swo + +# Temp files when opening LibreOffice on ubuntu +.~lock.* + +# svn +.svn + +# CVS - Source Control +**/CVS/ + +# Remainings from resolving conflicts in Source Control +*.orig + +# SQL Server files +**/App_Data/*.mdf +**/App_Data/*.ldf +**/App_Data/*.sdf + + +#LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml + +# ========================= +# Windows detritus +# ========================= + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# OS generated files # +Icon? + +# Mac desktop service store files +.DS_Store + +# SASS Compiler cache +.sass-cache + +# Visual Studio 2014 CTP +**/*.sln.ide + +# Visual Studio temp something +.vs/ + +# dotnet stuff +project.lock.json + +# VS 2015+ +*.vc.vc.opendb +*.vc.db + +# Rider +.idea/ + +# Visual Studio Code +.vscode/ + +# Output folder used by Webpack or other FE stuff +**/node_modules/* +**/wwwroot/* + +# SpecFlow specific +*.feature.cs +*.feature.xlsx.* +*.Specs_*.html + +# UWP Projects +AppPackages/ + +##### +# End of core ignore list, below put you custom 'per project' settings (patterns or path) +##### + diff --git a/src/App.config b/src/App.config new file mode 100755 index 0000000..5754728 --- /dev/null +++ b/src/App.config @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" ?> +<configuration> + <startup> + <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> + </startup> +</configuration> \ No newline at end of file diff --git a/src/Form1.Designer.cs b/src/Form1.Designer.cs new file mode 100755 index 0000000..7786925 --- /dev/null +++ b/src/Form1.Designer.cs @@ -0,0 +1,139 @@ +namespace WidgetEmbed +{ + partial class Form1 + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + this.textBox1 = new System.Windows.Forms.TextBox(); + this.button1 = new System.Windows.Forms.Button(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.SaveEmbedsCheckbox = new System.Windows.Forms.CheckBox(); + this.SaveButton = new System.Windows.Forms.Button(); + this.BoundsDetectionCheckbox = new System.Windows.Forms.CheckBox(); + this.CheckBoundsButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.BackColor = System.Drawing.SystemColors.Menu; + this.textBox1.Location = new System.Drawing.Point(197, 112); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(362, 143); + this.textBox1.TabIndex = 1; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(591, 166); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(84, 44); + this.button1.TabIndex = 2; + this.button1.Text = "Create Embed"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // comboBox1 + // + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(565, 112); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(129, 21); + this.comboBox1.TabIndex = 3; + this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); + // + // SaveEmbedsCheckbox + // + this.SaveEmbedsCheckbox.AutoSize = true; + this.SaveEmbedsCheckbox.Location = new System.Drawing.Point(1, 23); + this.SaveEmbedsCheckbox.Name = "SaveEmbedsCheckbox"; + this.SaveEmbedsCheckbox.Size = new System.Drawing.Size(138, 17); + this.SaveEmbedsCheckbox.TabIndex = 4; + this.SaveEmbedsCheckbox.Text = "Save Embeds On Close"; + this.SaveEmbedsCheckbox.UseVisualStyleBackColor = true; + // + // SaveButton + // + this.SaveButton.Location = new System.Drawing.Point(708, 1); + this.SaveButton.Name = "SaveButton"; + this.SaveButton.Size = new System.Drawing.Size(91, 26); + this.SaveButton.TabIndex = 5; + this.SaveButton.Text = "Save Now"; + this.SaveButton.UseVisualStyleBackColor = true; + this.SaveButton.Click += new System.EventHandler(this.button2_Click); + // + // BoundsDetectionCheckbox + // + this.BoundsDetectionCheckbox.AutoSize = true; + this.BoundsDetectionCheckbox.Location = new System.Drawing.Point(1, 1); + this.BoundsDetectionCheckbox.Name = "BoundsDetectionCheckbox"; + this.BoundsDetectionCheckbox.Size = new System.Drawing.Size(138, 17); + this.BoundsDetectionCheckbox.TabIndex = 6; + this.BoundsDetectionCheckbox.Text = "Check Bounds On Start"; + this.BoundsDetectionCheckbox.UseVisualStyleBackColor = true; + // + // CheckBoundsButton + // + this.CheckBoundsButton.Location = new System.Drawing.Point(708, 33); + this.CheckBoundsButton.Name = "CheckBoundsButton"; + this.CheckBoundsButton.Size = new System.Drawing.Size(91, 26); + this.CheckBoundsButton.TabIndex = 7; + this.CheckBoundsButton.Text = "Check Bounds"; + this.CheckBoundsButton.UseVisualStyleBackColor = true; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.ButtonHighlight; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.CheckBoundsButton); + this.Controls.Add(this.BoundsDetectionCheckbox); + this.Controls.Add(this.SaveButton); + this.Controls.Add(this.SaveEmbedsCheckbox); + this.Controls.Add(this.comboBox1); + this.Controls.Add(this.button1); + this.Controls.Add(this.textBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Name = "Form1"; + this.Text = "WidgetEmbed"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.CheckBox SaveEmbedsCheckbox; + private System.Windows.Forms.Button SaveButton; + private System.Windows.Forms.CheckBox BoundsDetectionCheckbox; + private System.Windows.Forms.Button CheckBoundsButton; + } +} + diff --git a/src/Form1.cs b/src/Form1.cs new file mode 100755 index 0000000..0db9f9e --- /dev/null +++ b/src/Form1.cs @@ -0,0 +1,497 @@ +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Xml.Serialization; + +namespace WidgetEmbed +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + public static List<Form2> WidgetWindows = new List<Form2>(); + public static List<Widget> Widgets = new List<Widget>(); + public static bool BeginningShutdown = false; + + string directoryLocation = Environment.ExpandEnvironmentVariables(@"%Public%\Documents\WidgetEmbed\"); + string widgetFileName = "SavedWidgets.wgt"; + + bool widgetsVisible = true; + bool isAnimatingWidgets; + bool isAnimatingForm; + bool formVisible = true; + + + public ContextMenuStrip contextMenu1 = new ContextMenuStrip(); + public ToolStripMenuItem MenuItem1 = new ToolStripMenuItem("HideWidgets"); + public ToolStripMenuItem MenuItem2 = new ToolStripMenuItem("HideAddWidgetsMenu"); + public ToolStripMenuItem MenuItem3 = new ToolStripMenuItem("CloseApplication"); + NotifyIcon ni = new NotifyIcon(); + + public static bool ScreenBoundsDetection = true; + + protected override void WndProc(ref Message m) + { + if (m.Msg == WM_QUERYENDSESSION || m.Msg == WM_ENDSESSION) + { + BeginningShutdown = true; + ShuttingDown(); + } + base.WndProc(ref m); + + } + + private void Form1_Load(object sender, EventArgs e) + { + SystemEvents.SessionEnding += (s, eargs) => + { + ShuttingDown(); + eargs.Cancel = true; + }; + + InputBox.Instance = new InputBox(); + + this.MaximizeBox = false; + this.MinimizeBox = false; + + this.Visible = false; + this.Opacity = 0; + + this.Location = new Point((Screen.PrimaryScreen.WorkingArea.Width - this.Size.Width) / 2, (Screen.PrimaryScreen.WorkingArea.Height - this.Size.Height) / 2); + + + button1.Enabled = false; + + comboBox1.DropDownStyle = ComboBoxStyle.DropDownList; + comboBox1.Items.Add("Website URL"); + comboBox1.Items.Add("HTML Embed Widget"); + + ni.Visible = true; + ni.Icon = SystemIcons.Application; + ni.Text = "WidgetEmbed (Visible)"; + ni.ContextMenuStrip = contextMenu1; + + contextMenu1.Items.Add(MenuItem1); + contextMenu1.Items.Add(MenuItem2); + contextMenu1.Items.Add(MenuItem3); + + MenuItem1.Text = "Hide Widgets"; + MenuItem2.Text = "Hide Add Widgets Menu"; + MenuItem3.Text = "Exit Application"; + + MenuItem1.Image = SystemIcons.Application.ToBitmap(); + MenuItem2.Image = SystemIcons.Question.ToBitmap(); + MenuItem3.Image = SystemIcons.Error.ToBitmap(); + + MenuItem1.Click += (s, eargs) => + { + ChangeWidgetVisibility(); + }; + + MenuItem2.Click += (s, eargs) => + { + if (isAnimatingForm) + return; + + formVisible = (this.Opacity == 1 ? true : false); + + MenuItem2.Text = (formVisible ? "Show" : "Hide") + " Add Widgets Menu"; + + Fade(this, (formVisible ? "FadeOut" : "FadeIn"), 10); + }; + + MenuItem3.Click += (s, eargs) => + { + TryClose(); + }; + + this.FormClosing += (s, fcea) => + { + if (!BeginningShutdown) + { + fcea.Cancel = TryClose(); + } + else + { + ShuttingDown(); + fcea.Cancel = true; + } + }; + + ni.MouseDoubleClick += (s, mea) => + { + ChangeWidgetVisibility(); + }; + + CheckBoundsButton.Click += (s, eargs) => + { + CheckBounds(); + }; + + + //Serialiation + if (!Directory.Exists(directoryLocation)) + { + Directory.CreateDirectory(directoryLocation); + } + + if (!File.Exists(directoryLocation + widgetFileName)) + { + File.Create(directoryLocation + widgetFileName).Close(); + } + else if (new FileInfo(directoryLocation + widgetFileName).Length == 0) + { + //file exists, but is empty! + } + else + { + LoadWidgets(); + } + + this.Visible = true; + this.Opacity = 1; + } + + const int WM_QUERYENDSESSION = 0x0011; + const int WM_ENDSESSION = 0x0016; + + + public void ShuttingDown() + { + if (SaveEmbedsCheckbox.Checked) + { + SaveWidgets(); + } + + for (int i = 0; i < WidgetWindows.Count; i++) + { + WidgetWindows[i].Close(); + } + + + Environment.Exit(0); + } + + + + + public bool TryClose() + { + + DialogResult dr = MessageBox.Show(new Form { TopMost = true }, "Are you sure you want to exit?", "Program Exiting Prompt", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + + if (dr == DialogResult.Yes) + { + if (SaveEmbedsCheckbox.Checked) + SaveWidgets(); + + + ni.Visible = false; + ni.Icon = null; + + Environment.Exit(0); + } + return true; + } + + public void CheckBounds() + { + for (int i = 0; i < WidgetWindows.Count; i++) + { + if (!IsOnScreen(WidgetWindows[i])) + if (MessageBox.Show(new Form { TopMost = true }, "Widget: \"" + Widgets[i].WidgetTitle + "\" was not detected within the safe bounds area.\nWould you like to relocate it to the center of the main screen?", "Safe Bounds Detection", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + WidgetWindows[i].Location = new Point((Screen.PrimaryScreen.WorkingArea.Width - WidgetWindows[i].Size.Width) / 2, (Screen.PrimaryScreen.WorkingArea.Height - WidgetWindows[i].Size.Height) / 2); + } + } + + MessageBox.Show(new Form { TopMost = true }, "Bound Check Complete!", "Safe Bounds Detection", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + public void ChangeWidgetVisibility() + { + if (isAnimatingWidgets) + return; + + widgetsVisible = !widgetsVisible; + + ni.Text = "WidgetEmbed " + (widgetsVisible ? "(Visible)" : "(Hidden)"); + MenuItem1.Text = (widgetsVisible ? "Hide" : "Show") + " Widgets"; + + if (widgetsVisible) + { + for (int i = 0; i < WidgetWindows.Count; i++) + { + Fade(WidgetWindows[i], "FadeIn", 10); + + } + } + else + { + for (int i = 0; i < WidgetWindows.Count; i++) + { + //WidgetWindows[i].Enabled = false; + Fade(WidgetWindows[i], "FadeOut", 10); + + } + } + } + + SerializedWidgetData sd; + + + + + + public static bool IsOnScreen(Form form) + { + Screen[] screens = Screen.AllScreens; + foreach (Screen screen in screens) + { + Rectangle formRectangle = new Rectangle(form.Left, form.Top, 60, 60); + + if (screen.WorkingArea.Contains(formRectangle)) + { + return true; + } + } + + return false; + } + + + + + + + private async void Fade(Form o, string FadeType, int interval = 80) + { + bool AnimatingForm = (o == this); + + if (AnimatingForm) + isAnimatingForm = true; + else + isAnimatingWidgets = true; + + if (FadeType == "FadeIn") + { + if (AnimatingForm) + { + + this.ShowInTaskbar = true; + this.Visible = true; + } + + //Object is not fully invisible. Fade it in + while (o.Opacity < 1.0) + { + await Task.Delay(interval); + o.Opacity += 0.05; + } + o.Opacity = 1; //make fully visible + + if (AnimatingForm) + isAnimatingForm = false; + else + isAnimatingWidgets = false; + } + else if (FadeType == "FadeOut") + { + //Object is fully visible. Fade it out + while (o.Opacity > 0.0) + { + await Task.Delay(interval); + o.Opacity -= 0.05; + } + o.Opacity = 0; //make fully invisible + + if (AnimatingForm) + { + isAnimatingForm = false; + { + this.ShowInTaskbar = false; + this.Visible = false; + } + } + else + isAnimatingWidgets = false; + } + } + + + public async void SaveWidgets() + { + if (sd == null) + sd = new SerializedWidgetData(); + + sd.SaveOnClose = SaveEmbedsCheckbox.Checked; + sd.PrimaryScreenDetection = BoundsDetectionCheckbox.Checked; + + if (isAnimatingForm) + { + double check1 = this.Opacity; + await Task.Delay(1000); + double check2 = this.Opacity; + + sd.WidgetMenuShown = check1 < check2 ? true : false; + } + else + { + sd.WidgetMenuShown = this.Opacity == 1 ? true : false; + } + + sd.Widgets = Widgets; + + SerializeXml<SerializedWidgetData>(sd, directoryLocation + widgetFileName); + } + + public void LoadWidgets() + { + sd = DeserializeXml<SerializedWidgetData>(directoryLocation + widgetFileName); + + if (sd == null) + return; + + SaveEmbedsCheckbox.Checked = sd.SaveOnClose; + BoundsDetectionCheckbox.Checked = sd.PrimaryScreenDetection; + + if (sd.WidgetMenuShown) + { + this.Visible = true; + this.Opacity = 1; + } + else + { + this.Opacity = 0; + this.ShowInTaskbar = false; + formVisible = false; + MenuItem2.Text = "Show Add Widgets Menu"; + } + + + for (int i = 0; i < sd.Widgets.Count; i++) + { + Form f2 = new Form2(sd.Widgets[i].WidgetWebData, sd.Widgets[i].WidgetLoadType, sd.Widgets[i].WidgetWindowSize, sd.Widgets[i].WidgetLocation, sd.Widgets[i].WidgetZoomScale, sd.Widgets[i].WidgetTitle); + f2.Show(); + + SetWindowPos(f2.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS); + } + + if (BoundsDetectionCheckbox.Checked) + { + this.Shown += (s, eargs) => + { + CheckBounds(); + }; + + } + } + + public T SerializeXml<T>(T objToSerialize, string outputFile) + { + try + { + + XmlSerializer s = new XmlSerializer(typeof(SerializedWidgetData)); + + using (TextWriter tw = new StreamWriter(outputFile)) + { + s.Serialize(tw, objToSerialize); + tw.Close(); + } + + } + catch (Exception ex) + { + MessageBox.Show(new Form { TopMost = true }, "Error while saving data!\nError:" + ex.Message, "Error Has Occurred", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + return default(T); + } + + public T DeserializeXml<T>(string inputFile) + { + try + { + + XmlSerializer s = new XmlSerializer(typeof(T)); + T deserializedObject = default(T); + + using (TextReader tr = new StreamReader(inputFile)) + { + deserializedObject = (T)s.Deserialize(tr); + tr.Close(); + } + + return deserializedObject; + } + catch (Exception ex) + { + MessageBox.Show(new Form { TopMost = true }, "Save file corrupted!\nGenerating New File\nError:" + ex.Message, "Error Has Occured", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + return default(T); + } + + + + private void button1_Click(object sender, EventArgs e) + { + Form2 f2 = new Form2(textBox1.Text, (Form2.LoadType)comboBox1.SelectedIndex); + f2.Show(); + + SetWindowPos(f2.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS); + + } + + private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) + { + if (comboBox1.SelectedIndex > -1) + button1.Enabled = true; + } + + private void button2_Click(object sender, EventArgs e) + { + SaveWidgets(); + } + + public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); + public const UInt32 SWP_NOSIZE = 0x0001; + public const UInt32 SWP_NOMOVE = 0x0002; + public const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE; + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); + + [DllImport("user32.dll")] + static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); + const int SW_MAXIMIZE = 3; + const int SW_MINIMIZE = 6; + const int SW_SHOW = 5; + const int SW_HIDE = 0; + const int SW_SHOWNORMAL = 1; + const int SW_RESTORE = 9; + } + + + + public class SerializedWidgetData + { + public List<Widget> Widgets = new List<Widget>(); + public bool SaveOnClose; + public bool WidgetMenuShown; + public bool PrimaryScreenDetection; + } +} diff --git a/src/Form1.resx b/src/Form1.resx new file mode 100755 index 0000000..29dcb1b --- /dev/null +++ b/src/Form1.resx @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root> \ No newline at end of file diff --git a/src/Form2.Designer.cs b/src/Form2.Designer.cs new file mode 100755 index 0000000..604889d --- /dev/null +++ b/src/Form2.Designer.cs @@ -0,0 +1,143 @@ +namespace WidgetEmbed +{ + + partial class Form2 + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + this.Exit = new System.Windows.Forms.Button(); + this.Reload = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.ZoomOut = new System.Windows.Forms.Button(); + this.ZoomIn = new System.Windows.Forms.Button(); + this.WindowTitle = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // Exit + // + this.Exit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.Exit.ForeColor = System.Drawing.Color.White; + this.Exit.Location = new System.Drawing.Point(780, 0); + this.Exit.Name = "Exit"; + this.Exit.Size = new System.Drawing.Size(25, 25); + this.Exit.TabIndex = 1; + this.Exit.TabStop = false; + this.Exit.Text = "X"; + this.Exit.UseVisualStyleBackColor = true; + this.Exit.Click += new System.EventHandler(this.Exit_Click); + // + // Reload + // + this.Reload.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.Reload.ForeColor = System.Drawing.Color.White; + this.Reload.Location = new System.Drawing.Point(756, 0); + this.Reload.Name = "Reload"; + this.Reload.Size = new System.Drawing.Size(25, 25); + this.Reload.TabIndex = 2; + this.Reload.TabStop = false; + this.Reload.Text = "↻"; + this.Reload.UseVisualStyleBackColor = true; + this.Reload.Click += new System.EventHandler(this.Reload_Click); + // + // panel1 + // + this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panel1.BackColor = System.Drawing.SystemColors.ActiveCaption; + this.panel1.Location = new System.Drawing.Point(12, 29); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(782, 473); + this.panel1.TabIndex = 3; + // + // ZoomOut + // + this.ZoomOut.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.ZoomOut.ForeColor = System.Drawing.Color.White; + this.ZoomOut.Location = new System.Drawing.Point(708, 0); + this.ZoomOut.Name = "ZoomOut"; + this.ZoomOut.Size = new System.Drawing.Size(25, 25); + this.ZoomOut.TabIndex = 5; + this.ZoomOut.TabStop = false; + this.ZoomOut.Text = "-"; + this.ZoomOut.UseVisualStyleBackColor = true; + this.ZoomOut.Click += new System.EventHandler(this.ZoomOut_Click); + // + // ZoomIn + // + this.ZoomIn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.ZoomIn.ForeColor = System.Drawing.Color.White; + this.ZoomIn.Location = new System.Drawing.Point(732, 0); + this.ZoomIn.Name = "ZoomIn"; + this.ZoomIn.Size = new System.Drawing.Size(25, 25); + this.ZoomIn.TabIndex = 4; + this.ZoomIn.TabStop = false; + this.ZoomIn.Text = "+"; + this.ZoomIn.UseVisualStyleBackColor = true; + this.ZoomIn.Click += new System.EventHandler(this.ZoomIn_Click); + // + // WindowTitle + // + this.WindowTitle.AutoSize = true; + this.WindowTitle.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.WindowTitle.ForeColor = System.Drawing.Color.White; + this.WindowTitle.Location = new System.Drawing.Point(12, 6); + this.WindowTitle.Name = "WindowTitle"; + this.WindowTitle.Size = new System.Drawing.Size(94, 19); + this.WindowTitle.TabIndex = 6; + this.WindowTitle.Text = "Default title"; + this.WindowTitle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // Form2 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.ControlText; + this.ClientSize = new System.Drawing.Size(806, 514); + this.Controls.Add(this.ZoomOut); + this.Controls.Add(this.ZoomIn); + this.Controls.Add(this.panel1); + this.Controls.Add(this.Reload); + this.Controls.Add(this.Exit); + this.Controls.Add(this.WindowTitle); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Form2"; + this.Load += new System.EventHandler(this.Form2_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Button Exit; + private System.Windows.Forms.Button Reload; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Button ZoomOut; + private System.Windows.Forms.Button ZoomIn; + private System.Windows.Forms.Label WindowTitle; + } +} \ No newline at end of file diff --git a/src/Form2.cs b/src/Form2.cs new file mode 100755 index 0000000..d1229fc --- /dev/null +++ b/src/Form2.cs @@ -0,0 +1,842 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using CefSharp; +using CefSharp.Handler; +using CefSharp.WinForms; +using Microsoft.VisualBasic; + +namespace WidgetEmbed +{ + public partial class Form2 : Form + { + ReSize resize = new ReSize(); + + //public static Form2 f2Instance; + + public ChromiumWebBrowser browser; + + string defaultTitle = "Title (Middle Click)"; + public Form2(string websiteData, LoadType loadType) + { + //f2Instance = this; + + widget.WidgetWebData = websiteData; + widget.WidgetLoadType = loadType; + + InitializeComponent(); + //this.SetStyle(ControlStyles.ResizeRedraw, true); + InitBrowser(); + //CefSharpSettings.SubprocessExitIfParentProcessClosed = true; //look into this + + this.Load += (s, eargs) => + { + widget.WidgetLocation = new Point((Screen.PrimaryScreen.WorkingArea.Width - this.Size.Width) / 2, (Screen.PrimaryScreen.WorkingArea.Height - this.Size.Height) / 2); + + SetWidgetTitle(defaultTitle); + }; + + + //this.HandleCreated += (s, eargs) => { widget.Title = defaultTitle; }; + + + + + //this.FormBorderStyle = FormBorderStyle.None; // no borders + //this.DoubleBuffered = true; + //this.SetStyle(ControlStyles.ResizeRedraw, true); // this is to avoid visual artifacts + } + + public Form2(string websiteData, LoadType loadType, Size widgetSize, Point widgetLocation, double zoomScale, string widgetTitle) + { + //f2Instance = this; + + widget.WidgetWebData = websiteData; + widget.WidgetLoadType = loadType; + widget.WidgetWindowSize = widgetSize; + widget.WidgetLocation = widgetLocation; + widget.WidgetZoomScale = zoomScale; + + InitializeComponent(); + InitBrowser(); + + SetWidgetTitle(widgetTitle); + + //this.HandleCreated += (s, eargs) => + //{ + + // if (!(widgetTitle.Length == 0)) + // widget.Title = widgetTitle; + // else + // widget.Title = defaultTitle; + //}; + + + + } + + public enum LoadType + { + WebsiteURL, + HTMLEmbed + } + + + public static bool cefInit = false; + public static bool ignoreLinkLoadingStateChanged; + + public Widget widget = new Widget(); + + bool waitingToSetZoom = true; + + public void InitBrowser() + { + if (!cefInit) + { + Cef.Initialize(new CefSettings()); + cefInit = true; + } + + browser = new ChromiumWebBrowser(); + browser.RequestHandler = new BrowserRequestHandler(); + browser.LifeSpanHandler = new BrowserLifeSpanHandler(); + + + browser.IsBrowserInitializedChanged += (s, e) => + { + if (!browser.IsBrowserInitialized) + return; + + + if (widget.WidgetLoadType == LoadType.HTMLEmbed) + browser.LoadHtml(widget.WidgetWebData, false); + else if (widget.WidgetLoadType == LoadType.WebsiteURL) + browser.Load(widget.WidgetWebData); + + //this.WindowState = FormWindowState.Normal; + //this.StartPosition = FormStartPosition.Manual; + //if (!(widget.WidgetLocation == default)) //(interferes at 0,0 + + //if (Form1.ScreenBoundsDetection) + //{ + // if (!((widget.WidgetLocation.X < 0 || widget.WidgetLocation.Y < 0) /*|| (widget.WidgetLocation.X > Form1.PrimaryScreen.Bounds.X - 25 || widget.WidgetLocation.Y > Form1.PrimaryScreen.Bounds.Y - 25)*/)) + // this.Invoke(new Action(() => this.Location = widget.WidgetLocation)); + // else + // { + // widget.WidgetLocation.X = widget.WidgetLocation.X < 0 ? 0 : widget.WidgetLocation.X; + // widget.WidgetLocation.Y = widget.WidgetLocation.Y < 0 ? 0 : widget.WidgetLocation.Y; + // this.Invoke(new Action(() => this.Location = widget.WidgetLocation)); + // } + //} + + this.Invoke(new Action(() => this.Location = widget.WidgetLocation)); + + if (!(widget.WidgetWindowSize == default)) + this.Invoke(new Action(() => this.Size = widget.WidgetWindowSize)); + + + this.Move += (sender, eargs) => + { + //MessageBox.Show("LOCATION CHANGED"); + widget.WidgetLocation = this.Location; + }; + + this.SizeChanged += (sender, eargs) => + { + //MessageBox.Show("SIZE CHANGED"); + widget.WidgetWindowSize = this.Size; + }; + + if (!(widget.WidgetZoomScale == 0)) + browser.LoadingStateChanged += (sender, eargs) => + { + //MessageBox.Show("IS LOADED"); + if (!eargs.IsLoading) + if (waitingToSetZoom) + { + browser.SetZoomLevel(widget.WidgetZoomScale); + waitingToSetZoom = false; + } + }; + }; + + + + + #region garbage + //browser.Load(Embed); + //browser.LoadingStateChanged += async (s, e) => + //{ + // //MessageBox.Show("Loading State Changed is current disabled for development purposes. (by dev)"); + // //MessageBox.Show("MAINFRAME URL: " + e.Browser.MainFrame.Url); + + + // //e.Browser.StopLoad + + // if (!e.IsLoading) + // { + // if (ignoreLinkLoadingStateChanged) + // { + // ignoreLinkLoadingStateChanged = false; + // return; + // } + + // string script = "(function() { var body = document.body, html = document.documentElement; return Math.max( body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight ); })();"; + // await Task.Delay(5000); + + // var taskResult = browser.EvaluateScriptAsync(script); + + + // //Task t = new Task(() => browser.EvaluateScriptAsync(script)); + // //t.ContinueWith((task) => + // //{ + // // //MessageBox.Show("asdf"); + // // if (!task.IsFaulted) + // // { + // // var response = task as Task<JavascriptResponse>; + // // var result = response.Result; + + // // if (result.Success && response.Result != null) + // // { + // // taskResult = response.Result.ToString(); + // // } + // // } + // //}); + // //var height = t as Task<JavascriptResponse>; + // //MessageBox.Show(height.Result.Result.ToString()); + // MessageBox.Show((dynamic)taskResult.Result.Message); //finish this tomorrow. trying to get height so then i can get width and make the sizes be predefined! (use:https://stackoverflow.com/questions/60435891/how-to-get-html-document-height-using-cefsharp) + // } + //}; + + //browser.Click += (s, e) => + //{ + + //}; + + #endregion + + this.panel1.Controls.Add(browser); + browser.Dock = DockStyle.Fill; + + this.ShowInTaskbar = false; + //browser.Dock = DockStyle.Fill; + } + + public async void UpdateTitle() + { + string Title = await InputBox.Instance.Show("Enter new widget title:", "Rename Widget", widget.WidgetTitle == defaultTitle ? "" : widget.WidgetTitle, 32); //Interaction.InputBox("Enter new widget title:\n(16 characters max)", "Rename Widget"); + + if (Title == widget.WidgetTitle) + return; + + if (Title.Length == 0) + MessageBox.Show(new Form { TopMost = true }, "Title rename has been cancelled", "Rename Cancelled", MessageBoxButtons.OK, MessageBoxIcon.Information); + //else if (Title.Length > 32) + // MessageBox.Show(new Form { TopMost = true }, "Title is too long!", "Title Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + else + { + SetWidgetTitle(Title); + + MessageBox.Show(new Form { TopMost = true }, "Title has been renamed to: \"" + Title + "\"", "Rename Successful", MessageBoxButtons.OK, MessageBoxIcon.Information); + + return; + } + + //UpdateTitle(); + } + + public void SetWidgetTitle(string Title) + { + widget.WidgetTitle = Title; + WindowTitle.Text = Title; + } + + + #region WndProc stuff + private const int cGrip = 16; // Grip size + private const int cCaption = 32; // Caption bar height; + private const int WM_NCLBUTTONDBLCLK = 0x00A3; //double click on a title bar a.k.a. non-client area of the form + + int Mx; + int My; + int Sw; + int Sh; + + bool mov; + + void SizerMouseDown(object sender, MouseEventArgs e) + { + mov = true; + My = MousePosition.Y; + Mx = MousePosition.X; + Sw = Width; + Sh = Height; + } + + void SizerMouseMove(object sender, MouseEventArgs e) + { + if (mov == true) + { + Width = MousePosition.X - Mx + Sw; + Height = MousePosition.Y - My + Sh; + } + } + + void SizerMouseUp(object sender, MouseEventArgs e) + { + mov = false; + } + + public override Size MinimumSize + { + get + { + return base.MinimumSize; + } + set + { + base.MinimumSize = new Size(179, 51); + } + } + + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + // turn on WS_EX_TOOLWINDOW style bit + cp.ExStyle |= 0x80; + return cp; + } + } + + protected override void WndProc(ref Message m) + { + //if (m.Msg == 0x84) + //{ // Trap WM_NCHITTEST + // Point pos = new Point(m.LParam.ToInt32()); + // pos = this.PointToClient(pos); + // if (pos.Y < cCaption) + // { + // m.Result = (IntPtr)2; // HTCAPTION + // return; + // } + // if (pos.X >= this.ClientSize.Width - cGrip && pos.Y >= this.ClientSize.Height - cGrip) + // { + // m.Result = (IntPtr)17; // HTBOTTOMRIGHT + // return; + // } + //} + + int x = (int)(m.LParam.ToInt64() & 0xFFFF); //get x mouse position + int y = (int)((m.LParam.ToInt64() & 0xFFFF0000) >> 16); //get y mouse position you can gave (x,y) it from "MouseEventArgs" too + Point pt = PointToClient(new Point(x, y)); + + if (m.Msg == 0x84) + { + switch (resize.getMosuePosition(pt, this)) + { + case "l": m.Result = (IntPtr)10; return; // the Mouse on Left Form + case "r": m.Result = (IntPtr)11; return; // the Mouse on Right Form + case "a": m.Result = (IntPtr)12; return; + case "la": m.Result = (IntPtr)13; return; + case "ra": m.Result = (IntPtr)14; return; + case "u": m.Result = (IntPtr)15; return; + case "lu": m.Result = (IntPtr)16; return; + case "ru": m.Result = (IntPtr)17; return; // the Mouse on Right_Under Form + case "": m.Result = pt.Y < 32 /*mouse on title Bar*/ ? (IntPtr)2 : (IntPtr)1; return; + + } + } + else if (m.Msg == WM_NCLBUTTONDBLCLK) + { + m.Result = IntPtr.Zero; + return; + } + + base.WndProc(ref m); + } + #endregion + + public const int WM_NCLBUTTONDOWN = 0xA1; + public const int HT_CAPTION = 0x2; + + [DllImport("user32.dll")] + public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); + [DllImport("user32.dll")] + public static extern bool ReleaseCapture(); + + private void button1_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + ReleaseCapture(); + SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); + } + } + + + + private void Browser_Click(object sender, EventArgs e) + { + throw new NotImplementedException(); + } + + public void SetDefaultButtonDesign(Button b) + { + b.BackColor = Color.Black; + b.FlatStyle = FlatStyle.Flat; + b.FlatAppearance.BorderColor = Color.White; + b.FlatAppearance.BorderSize = 1; + + b.GotFocus += (s, e) => + { + this.Focus(); + }; + } + + + private void Form2_Load(object sender, EventArgs e) + { + + Form1.WidgetWindows.Add(this); + Form1.Widgets.Add(widget); + + foreach (var btn in this.Controls.OfType<Button>()) + { + SetDefaultButtonDesign(btn); + } + + //webBrowser1.ScriptErrorsSuppressed = true; + //webBrowser1.ScrollBarsEnabled = false; + //webBrowser1.DocumentText = Embed; + + + + this.FormClosing += (s, eargs) => + { + if (deletingWidget) + { + Form1.WidgetWindows.Remove(this); + Form1.Widgets.Remove(this.widget); + + browser.Dispose(); + } + else if (Form1.BeginningShutdown) + { + //browser.Dispose(); + } + else + eargs.Cancel = true; + }; + + WindowTitle.MouseDown += (s, eargs) => //allows for title (label) to still allow movement but comes at the cost of not being able to check double click with lmb + { + if (eargs.Button == MouseButtons.Left) + { + ReleaseCapture(); + SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); + } + }; + + WindowTitle.MouseClick += (s, eargs) => + { + if (eargs.Button == MouseButtons.Middle) + { + UpdateTitle(); + } + }; + } + + private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); + private const UInt32 SWP_NOSIZE = 0x0001; + private const UInt32 SWP_NOMOVE = 0x0002; + private const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE; + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); + + + + + + + + + //private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) + //{ + // string tagUpper = ""; + + // foreach (HtmlElement tag in (sender as WebBrowser).Document.All) + // { + // tagUpper = tag.TagName.ToUpper(); + + // if ((tagUpper == "AREA") || (tagUpper == "A")) + // { + // tag.MouseUp += new HtmlElementEventHandler(this.link_MouseUp); + // } + // } + //} + + //void link_MouseUp(object sender, HtmlElementEventArgs e) + //{ + // Regex pattern = new Regex("href=\\\"(.+?)\\\""); + // Match match = pattern.Match((sender as HtmlElement).OuterHtml); + // string link = match.Groups[1].Value; + + // //Process.Start(link); + // Debug.WriteLine("MOUSE UP: " + link); + //} + + + //private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) + //{ + // Debug.WriteLine("COMPLETED"); + + + // //this.Width = webBrowser1.Document.Window.Size.Width + 40; + // //this.Height = webBrowser1.Document.Window.Size.Height + 40; + + // //this.Width = webBrowser1.Document.Body.ScrollRectangle.Width + 40;//Border + // //this.Height = webBrowser1.Document.Body.ScrollRectangle.Height + 40;//Border + + // //If the control is not docked + // //webBrowser1.Size = webBrowser1.Document.Body.ScrollRectangle.Size; + //} + + //private void webBrowser1_NewWindow(object sender, CancelEventArgs e) + //{ + // Debug.WriteLine("NEW WINDOW"); + // e.Cancel = true; + + // var webbrowser = (WebBrowser)sender; + // //OpenWebsite(webbrowser.StatusText.ToString()); + // //Debug.WriteLine(webBrowser1.StatusText.ToString()); + // //Process.Start(webBrowser1.StatusText.ToString()); + // webbrowser = null; + + //} + + public class BrowserLifeSpanHandler : ILifeSpanHandler + { + + public bool DoClose(IWebBrowser browserControl, IBrowser browser) + { + return false; + } + + public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser) + { + + } + public void OnBeforeClose(IWebBrowser browserControl, IBrowser browser) + { + + } + + //Popup Window + public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser) + { + newBrowser = null; + + DialogResult dr = MessageBox.Show(new Form { TopMost = true }, "Would you like to open this 'Popup' in your browser?\n" + "\"" + targetUrl + "\"", "Popup Opening Alert", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + + if (dr == DialogResult.Yes) + Process.Start(targetUrl); + //MessageBox.Show("User Clicked:" + targetUrl); + + return true; + + //return false; + } + + + } + + + + public class BrowserRequestHandler : IRequestHandler + { + //Link Click + public bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect) + { + ignoreLinkLoadingStateChanged = true; + + //Open in Default browser + //MessageBox.Show("REQUEST TYPE: " + request.TransitionType.ToString()); + + ////if () + + if (/*!request.Url.StartsWith("file:") && */(request.Url.StartsWith("http") || request.Url.StartsWith("www")) && (request.TransitionType == TransitionType.ClientRedirect || request.TransitionType == TransitionType.LinkClicked)) + { + DialogResult dr = MessageBox.Show("Would you like to open this 'Link' in your browser?\n" + "\"" + request.Url + "\"", "Link Opening Alert", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + + if (dr == DialogResult.Yes) + Process.Start(request.Url); + + return true; + //return false; + } + return false; + + } + + public bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture) + { + //MessageBox.Show("ON OPEN URL FROM TAB: " + userGesture.ToString()); + //MessageBox.Show(targetUrl); + //if ((targetUrl.StartsWith("http") || targetUrl.StartsWith("www"))) + //{ + // MessageBox.Show(targetUrl); + // //System.Diagnostics.Process.Start(request.Url); + // return true; + //} + return false; + } + + public bool OnCertificateError(IWebBrowser browserControl, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback) + { + callback.Dispose(); + return false; + } + + public void OnPluginCrashed(IWebBrowser browserControl, IBrowser browser, string pluginPath) + { + throw new Exception("Plugin crashed!"); + } + + public CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, + IRequestCallback callback) + { + return CefReturnValue.Continue; + } + + public bool GetAuthCredentials(IWebBrowser chromiumWebBrowser, IBrowser browser, string originUrl, bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback) + { + //NOTE: We also suggest you explicitly Dispose of the callback as it wraps an unmanaged resource. + + //Example #1 + //Spawn a Task to execute our callback and return true; + //Typical usage would see you invoke onto the UI thread to open a username/password dialog + //Then execute the callback with the response username/password + //You can cast the IWebBrowser param to ChromiumWebBrowser to easily access + //control, from there you can invoke onto the UI thread, should be in an async fashion + //Load https://httpbin.org/basic-auth/cefsharp/passwd in the browser to test + //Task.Run(() => + //{ + // using (callback) + // { + // if (originUrl.Contains("https://httpbin.org/basic-auth/")) + // { + // var parts = originUrl.Split('/'); + // var username = parts[parts.Length - 2]; + // var password = parts[parts.Length - 1]; + // callback.Continue(username, password); + // } + // } + //}); + + //return true; + + //Example #2 + //Return false to cancel the request + callback.Dispose(); + return false; + } + + public void OnDocumentAvailableInMainFrame(IWebBrowser chromiumWebBrowser, IBrowser browser) + { + return; + } + + public IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling) + { + //NOTE: In most cases you examine the request.Url and only handle requests you are interested in + if (request.Url.ToLower().StartsWith("https://cefsharp.example") + //|| request.Url.ToLower().StartsWith(CefSharpSchemeHandlerFactory.SchemeName) //idk! + || request.Url.ToLower().StartsWith("mailto:") + || request.Url.ToLower().StartsWith("https://googlechrome.github.io/samples/service-worker/")) + { + return new ResourceRequestHandler(); + } + + return null; + } + + public bool OnSelectClientCertificate(IWebBrowser browserControl, IBrowser browser, bool isProxy, string host, int port, + X509Certificate2Collection certificates, ISelectClientCertificateCallback callback) + { + callback.Dispose(); + return false; + } + + public void OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status) + { + throw new Exception("Browser render process is terminated!"); + } + + public bool OnQuotaRequest(IWebBrowser browserControl, IBrowser browser, string originUrl, long newSize, + IRequestCallback callback) + { + callback.Dispose(); + return false; + } + + public void OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, ref string newUrl) + { + var url = newUrl; + newUrl = url; + } + + public bool OnProtocolExecution(IWebBrowser browserControl, IBrowser browser, string url) + { + return url.StartsWith("mailto"); + } + + public void OnRenderViewReady(IWebBrowser browserControl, IBrowser browser) + { + + } + + public bool OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response) + { + return false; + } + + public IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, + IResponse response) + { + return null; + } + + public void OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, + IResponse response, UrlRequestStatus status, long receivedContentLength) + { + + } + } + + + private void ZoomOut_Click(object sender, EventArgs e) + { + SetZoomLevel(-0.25); + } + + private void ZoomIn_Click(object sender, EventArgs e) + { + SetZoomLevel(+0.25); + } + + public void SetZoomLevel(double scale) + { + double newZoom = browser.GetZoomLevelAsync().Result + scale; + browser.SetZoomLevel(newZoom); + + widget.WidgetZoomScale = newZoom; + } + + private void Reload_Click(object sender, EventArgs e) + { + if (widget.WidgetLoadType == LoadType.HTMLEmbed) + browser.LoadHtml(widget.WidgetWebData, false); + else if (widget.WidgetLoadType == LoadType.WebsiteURL) + browser.Load(widget.WidgetWebData); + + } + + bool deletingWidget = false; + private void Exit_Click(object sender, EventArgs e) + { + + DialogResult dr = MessageBox.Show("Would you delete the widget \"" + WindowTitle.Text + "\"?\nIt will be permanently deleted.\n(This can be undone by not saving the current widgets)", "Delete Widget?", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + if (dr == DialogResult.Yes) + { + deletingWidget = true; + this.Close(); + } + } + + public void RenameTitle(string Title) + { + WindowTitle.Text = Title; + } + } + + class ReSize + { + + private bool Above, Right, Under, Left, Right_above, Right_under, Left_under, Left_above; + + + int Thickness = 6; //Thickness of border u can cheang it + int Area = 8; //Thickness of Angle border + + + /// <summary> + /// Constructor + /// </summary> + /// <param name="thickness">set thickness of form border</param> + public ReSize(int thickness) + { + Thickness = thickness; + } + + /// <summary> + /// Constructor set thickness of form border=1 + /// </summary> + public ReSize() + { + Thickness = 10; + } + + //Get Mouse Position + public string getMosuePosition(Point mouse, Form form) + { + bool above_underArea = mouse.X > Area && mouse.X < form.ClientRectangle.Width - Area; /* |\AngleArea(Left_Above)\(=======above_underArea========)/AngleArea(Right_Above)/| */ //Area===>(==) + bool right_left_Area = mouse.Y > Area && mouse.Y < form.ClientRectangle.Height - Area; + + bool _Above = mouse.Y <= Thickness; //Mouse in Above All Area + bool _Right = mouse.X >= form.ClientRectangle.Width - Thickness; + bool _Under = mouse.Y >= form.ClientRectangle.Height - Thickness; + bool _Left = mouse.X <= Thickness; + + Above = _Above && (above_underArea); if (Above) return "a"; /*Mouse in Above All Area WithOut Angle Area */ + Right = _Right && (right_left_Area); if (Right) return "r"; + Under = _Under && (above_underArea); if (Under) return "u"; + Left = _Left && (right_left_Area); if (Left) return "l"; + + + Right_above =/*Right*/ (_Right && (!right_left_Area)) && /*Above*/ (_Above && (!above_underArea)); if (Right_above) return "ra"; /*if Mouse Right_above */ + Right_under =/* Right*/((_Right) && (!right_left_Area)) && /*Under*/(_Under && (!above_underArea)); if (Right_under) return "ru"; //if Mouse Right_under + Left_under = /*Left*/((_Left) && (!right_left_Area)) && /*Under*/ (_Under && (!above_underArea)); if (Left_under) return "lu"; //if Mouse Left_under + Left_above = /*Left*/((_Left) && (!right_left_Area)) && /*Above*/(_Above && (!above_underArea)); if (Left_above) return "la"; //if Mouse Left_above + + return ""; + + } + + } + + public class Widget + { + public string WidgetTitle; + public string WidgetWebData; + public Form2.LoadType WidgetLoadType; + public double WidgetZoomScale; + public Size WidgetWindowSize; + public Point WidgetLocation; + } +} \ No newline at end of file diff --git a/src/Form2.resx b/src/Form2.resx new file mode 100755 index 0000000..29dcb1b --- /dev/null +++ b/src/Form2.resx @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root> \ No newline at end of file diff --git a/src/InputBox.Designer.cs b/src/InputBox.Designer.cs new file mode 100755 index 0000000..61e9349 --- /dev/null +++ b/src/InputBox.Designer.cs @@ -0,0 +1,98 @@ +namespace WidgetEmbed +{ + partial class InputBox + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + this.OKButton = new System.Windows.Forms.Button(); + this.CancelButton = new System.Windows.Forms.Button(); + this.TextInput = new System.Windows.Forms.TextBox(); + this.MessageLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // OKButton + // + this.OKButton.Location = new System.Drawing.Point(243, 21); + this.OKButton.Name = "OKButton"; + this.OKButton.Size = new System.Drawing.Size(75, 23); + this.OKButton.TabIndex = 0; + this.OKButton.Text = "OK"; + this.OKButton.UseVisualStyleBackColor = true; + // + // CancelButton + // + this.CancelButton.Location = new System.Drawing.Point(243, 50); + this.CancelButton.Name = "CancelButton"; + this.CancelButton.Size = new System.Drawing.Size(75, 23); + this.CancelButton.TabIndex = 1; + this.CancelButton.Text = "Cancel"; + this.CancelButton.UseVisualStyleBackColor = true; + // + // TextInput + // + this.TextInput.Location = new System.Drawing.Point(12, 104); + this.TextInput.Name = "TextInput"; + this.TextInput.Size = new System.Drawing.Size(306, 20); + this.TextInput.TabIndex = 2; + // + // MessageLabel + // + this.MessageLabel.AutoSize = true; + this.MessageLabel.Location = new System.Drawing.Point(9, 9); + this.MessageLabel.Name = "MessageLabel"; + this.MessageLabel.Size = new System.Drawing.Size(50, 13); + this.MessageLabel.TabIndex = 3; + this.MessageLabel.Text = "Message"; + // + // InputBox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(330, 136); + this.ControlBox = false; + this.Controls.Add(this.MessageLabel); + this.Controls.Add(this.TextInput); + this.Controls.Add(this.CancelButton); + this.Controls.Add(this.OKButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Name = "InputBox"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "InputBox"; + this.Load += new System.EventHandler(this.InputBox_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button OKButton; + private System.Windows.Forms.Button CancelButton; + private System.Windows.Forms.TextBox TextInput; + private System.Windows.Forms.Label MessageLabel; + } +} \ No newline at end of file diff --git a/src/InputBox.cs b/src/InputBox.cs new file mode 100755 index 0000000..17cab26 --- /dev/null +++ b/src/InputBox.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace WidgetEmbed +{ + public partial class InputBox : Form + { + public InputBox() + { + InitializeComponent(); + } + + public static InputBox Instance; + private void InputBox_Load(object sender, EventArgs e) + { + + this.TopMost = true; + + + TextInput.TextChanged += (s, eargs) => + { + if (TextInput.TextLength == 0) + OKButton.Enabled = false; + else + OKButton.Enabled = true; + }; + + OKButton.Click += (s, eargs) => + { + returnMessage.SetResult(TextInput.Text); + }; + + CancelButton.Click += (s, eargs) => + { + returnMessage.SetResult(""); + }; + + this.FormClosing += (s, eargs) => + { + eargs.Cancel = true; + + if (returnMessage != null) + returnMessage.SetResult(""); + }; + } + + TaskCompletionSource<string> returnMessage; + public async Task<string> Show(string Message, string Title, string DefaultText = "", int maxTextLength = 0) //Check if there are issues and things that need to be invoked. + { + + OKButton.Enabled = false; + + if (DefaultText.Length > 0) + OKButton.Enabled = true; + + MessageLabel.Text = Message; + this.Text = Title; + TextInput.MaxLength = maxTextLength; + TextInput.Text = DefaultText; + + this.ShowInTaskbar = true; + this.Visible = true; + + + returnMessage = new TaskCompletionSource<string>(); + await returnMessage.Task; + + this.Visible = false; + this.ShowInTaskbar = false; + + return returnMessage.Task.Result; + } + } +} diff --git a/src/InputBox.resx b/src/InputBox.resx new file mode 100755 index 0000000..29dcb1b --- /dev/null +++ b/src/InputBox.resx @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root> \ No newline at end of file diff --git a/src/Program.cs b/src/Program.cs new file mode 100755 index 0000000..8150145 --- /dev/null +++ b/src/Program.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace WidgetEmbed +{ + static class Program + { + /// <summary> + /// The main entry point for the application. + /// </summary> + static string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value; + [STAThread] + static void Main() + { + using (Mutex mutex = new Mutex(false, "Global\\" + appGuid)) + { + if (!mutex.WaitOne(0, false)) + { + MessageBox.Show(new Form { TopMost = true }, "Program instance is already running!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } + } +} diff --git a/src/Properties/AssemblyInfo.cs b/src/Properties/AssemblyInfo.cs new file mode 100755 index 0000000..fd2cb41 --- /dev/null +++ b/src/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("WidgetEmbed")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("WidgetEmbed")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("4b3d30ee-2039-4ca9-b2ac-30e3b321dfdb")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/Properties/Resources.Designer.cs b/src/Properties/Resources.Designer.cs new file mode 100755 index 0000000..d892555 --- /dev/null +++ b/src/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace WidgetEmbed.Properties +{ + + + /// <summary> + /// A strongly-typed resource class, for looking up localized strings, etc. + /// </summary> + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// <summary> + /// Returns the cached ResourceManager instance used by this class. + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WidgetEmbed.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// <summary> + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/src/Properties/Resources.resx b/src/Properties/Resources.resx new file mode 100755 index 0000000..ffecec8 --- /dev/null +++ b/src/Properties/Resources.resx @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root> \ No newline at end of file diff --git a/src/Properties/Settings.Designer.cs b/src/Properties/Settings.Designer.cs new file mode 100755 index 0000000..0de2e72 --- /dev/null +++ b/src/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace WidgetEmbed.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/src/Properties/Settings.settings b/src/Properties/Settings.settings new file mode 100755 index 0000000..abf36c5 --- /dev/null +++ b/src/Properties/Settings.settings @@ -0,0 +1,7 @@ +<?xml version='1.0' encoding='utf-8'?> +<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)"> + <Profiles> + <Profile Name="(Default)" /> + </Profiles> + <Settings /> +</SettingsFile> diff --git a/src/WidgetEmbed.csproj b/src/WidgetEmbed.csproj new file mode 100755 index 0000000..7ee3226 --- /dev/null +++ b/src/WidgetEmbed.csproj @@ -0,0 +1,159 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="packages\CefSharp.WinForms.83.4.20\build\CefSharp.WinForms.props" Condition="Exists('packages\CefSharp.WinForms.83.4.20\build\CefSharp.WinForms.props')" /> + <Import Project="packages\CefSharp.Common.83.4.20\build\CefSharp.Common.props" Condition="Exists('packages\CefSharp.Common.83.4.20\build\CefSharp.Common.props')" /> + <Import Project="packages\cef.redist.x86.83.4.2\build\cef.redist.x86.props" Condition="Exists('packages\cef.redist.x86.83.4.2\build\cef.redist.x86.props')" /> + <Import Project="packages\cef.redist.x64.83.4.2\build\cef.redist.x64.props" Condition="Exists('packages\cef.redist.x64.83.4.2\build\cef.redist.x64.props')" /> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProjectGuid>{4B3D30EE-2039-4CA9-B2AC-30E3B321DFDB}</ProjectGuid> + <OutputType>WinExe</OutputType> + <RootNamespace>WidgetEmbed</RootNamespace> + <AssemblyName>WidgetEmbed</AssemblyName> + <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> + <Deterministic>true</Deterministic> + <NuGetPackageImportStamp> + </NuGetPackageImportStamp> + <PublishUrl>publish\</PublishUrl> + <Install>true</Install> + <InstallFrom>Disk</InstallFrom> + <UpdateEnabled>false</UpdateEnabled> + <UpdateMode>Foreground</UpdateMode> + <UpdateInterval>7</UpdateInterval> + <UpdateIntervalUnits>Days</UpdateIntervalUnits> + <UpdatePeriodically>false</UpdatePeriodically> + <UpdateRequired>false</UpdateRequired> + <MapFileExtensions>true</MapFileExtensions> + <ApplicationRevision>0</ApplicationRevision> + <ApplicationVersion>1.0.0.%2a</ApplicationVersion> + <IsWebBootstrapper>false</IsWebBootstrapper> + <UseApplicationTrust>false</UseApplicationTrust> + <BootstrapperEnabled>true</BootstrapperEnabled> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <PlatformTarget>x64</PlatformTarget> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>bin\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'"> + <PlatformTarget>x64</PlatformTarget> + <OutputPath>bin\x64\Debug\</OutputPath> + </PropertyGroup> + <ItemGroup> + <Reference Include="CefSharp"> + <HintPath>packages\CefSharp.Common.83.4.20\CefSharp\x64\CefSharp.dll</HintPath> + </Reference> + <Reference Include="CefSharp.WinForms"> + <HintPath>packages\CefSharp.WinForms.83.4.20\CefSharp\x64\CefSharp.WinForms.dll</HintPath> + </Reference> + <Reference Include="Microsoft.VisualBasic" /> + <Reference Include="System" /> + <Reference Include="System.Core" /> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System.Data.DataSetExtensions" /> + <Reference Include="Microsoft.CSharp" /> + <Reference Include="System.Data" /> + <Reference Include="System.Deployment" /> + <Reference Include="System.Drawing" /> + <Reference Include="System.Net.Http" /> + <Reference Include="System.Windows.Forms" /> + <Reference Include="System.Xml" /> + </ItemGroup> + <ItemGroup> + <Compile Include="Form1.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Form1.Designer.cs"> + <DependentUpon>Form1.cs</DependentUpon> + </Compile> + <Compile Include="Form2.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Form2.Designer.cs"> + <DependentUpon>Form2.cs</DependentUpon> + </Compile> + <Compile Include="InputBox.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="InputBox.Designer.cs"> + <DependentUpon>InputBox.cs</DependentUpon> + </Compile> + <Compile Include="Program.cs" /> + <Compile Include="Properties\AssemblyInfo.cs" /> + <EmbeddedResource Include="Form1.resx"> + <DependentUpon>Form1.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Form2.resx"> + <DependentUpon>Form2.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="InputBox.resx"> + <DependentUpon>InputBox.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Properties\Resources.resx"> + <Generator>ResXFileCodeGenerator</Generator> + <LastGenOutput>Resources.Designer.cs</LastGenOutput> + <SubType>Designer</SubType> + </EmbeddedResource> + <Compile Include="Properties\Resources.Designer.cs"> + <AutoGen>True</AutoGen> + <DependentUpon>Resources.resx</DependentUpon> + </Compile> + <None Include="packages.config" /> + <None Include="Properties\Settings.settings"> + <Generator>SettingsSingleFileGenerator</Generator> + <LastGenOutput>Settings.Designer.cs</LastGenOutput> + </None> + <Compile Include="Properties\Settings.Designer.cs"> + <AutoGen>True</AutoGen> + <DependentUpon>Settings.settings</DependentUpon> + <DesignTimeSharedInput>True</DesignTimeSharedInput> + </Compile> + </ItemGroup> + <ItemGroup> + <None Include="App.config" /> + </ItemGroup> + <ItemGroup> + <BootstrapperPackage Include=".NETFramework,Version=v4.7.2"> + <Visible>False</Visible> + <ProductName>Microsoft .NET Framework 4.7.2 %28x86 and x64%29</ProductName> + <Install>true</Install> + </BootstrapperPackage> + <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1"> + <Visible>False</Visible> + <ProductName>.NET Framework 3.5 SP1</ProductName> + <Install>false</Install> + </BootstrapperPackage> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> + <PropertyGroup> + <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> + </PropertyGroup> + <Error Condition="!Exists('packages\cef.redist.x64.83.4.2\build\cef.redist.x64.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\cef.redist.x64.83.4.2\build\cef.redist.x64.props'))" /> + <Error Condition="!Exists('packages\cef.redist.x86.83.4.2\build\cef.redist.x86.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\cef.redist.x86.83.4.2\build\cef.redist.x86.props'))" /> + <Error Condition="!Exists('packages\CefSharp.Common.83.4.20\build\CefSharp.Common.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\CefSharp.Common.83.4.20\build\CefSharp.Common.props'))" /> + <Error Condition="!Exists('packages\CefSharp.Common.83.4.20\build\CefSharp.Common.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\CefSharp.Common.83.4.20\build\CefSharp.Common.targets'))" /> + <Error Condition="!Exists('packages\CefSharp.WinForms.83.4.20\build\CefSharp.WinForms.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\CefSharp.WinForms.83.4.20\build\CefSharp.WinForms.props'))" /> + <Error Condition="!Exists('packages\CefSharp.WinForms.83.4.20\build\CefSharp.WinForms.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\CefSharp.WinForms.83.4.20\build\CefSharp.WinForms.targets'))" /> + </Target> + <Import Project="packages\CefSharp.Common.83.4.20\build\CefSharp.Common.targets" Condition="Exists('packages\CefSharp.Common.83.4.20\build\CefSharp.Common.targets')" /> + <Import Project="packages\CefSharp.WinForms.83.4.20\build\CefSharp.WinForms.targets" Condition="Exists('packages\CefSharp.WinForms.83.4.20\build\CefSharp.WinForms.targets')" /> +</Project> \ No newline at end of file diff --git a/src/WidgetEmbed.sln b/src/WidgetEmbed.sln new file mode 100755 index 0000000..6aa4542 --- /dev/null +++ b/src/WidgetEmbed.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29519.87 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WidgetEmbed", "WidgetEmbed.csproj", "{4B3D30EE-2039-4CA9-B2AC-30E3B321DFDB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4B3D30EE-2039-4CA9-B2AC-30E3B321DFDB}.Debug|Any CPU.ActiveCfg = Debug|x64 + {4B3D30EE-2039-4CA9-B2AC-30E3B321DFDB}.Debug|Any CPU.Build.0 = Debug|x64 + {4B3D30EE-2039-4CA9-B2AC-30E3B321DFDB}.Debug|x64.ActiveCfg = Release|x64 + {4B3D30EE-2039-4CA9-B2AC-30E3B321DFDB}.Debug|x64.Build.0 = Release|x64 + {4B3D30EE-2039-4CA9-B2AC-30E3B321DFDB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4B3D30EE-2039-4CA9-B2AC-30E3B321DFDB}.Release|Any CPU.Build.0 = Release|Any CPU + {4B3D30EE-2039-4CA9-B2AC-30E3B321DFDB}.Release|x64.ActiveCfg = Release|x64 + {4B3D30EE-2039-4CA9-B2AC-30E3B321DFDB}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {AA9B9649-159D-472E-BE35-9A8BD03C9ED6} + EndGlobalSection +EndGlobal diff --git a/src/packages.config b/src/packages.config new file mode 100755 index 0000000..e8778c3 --- /dev/null +++ b/src/packages.config @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<packages> + <package id="cef.redist.x64" version="83.4.2" targetFramework="net472" /> + <package id="cef.redist.x86" version="83.4.2" targetFramework="net472" /> + <package id="CefSharp.Common" version="83.4.20" targetFramework="net472" /> + <package id="CefSharp.WinForms" version="83.4.20" targetFramework="net472" /> +</packages> \ No newline at end of file