diff --git a/Launcheroid/AppIconLN.ico b/Launcheroid/AppIconLN.ico
new file mode 100644
index 0000000..3b09534
--- /dev/null
+++ b/Launcheroid/AppIconLN.ico
Binary files differ
diff --git a/Launcheroid/FImageLoad.Designer.cs b/Launcheroid/FImageLoad.Designer.cs
new file mode 100644
index 0000000..220b4a6
--- /dev/null
+++ b/Launcheroid/FImageLoad.Designer.cs
@@ -0,0 +1,46 @@
+namespace Launcheroid
+{
+ partial class FImageLoad
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.SuspendLayout();
+ //
+ // FImageLoad
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(454, 439);
+ this.Name = "FImageLoad";
+ this.Text = "FImageLoad";
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/Launcheroid/FImageLoad.cs b/Launcheroid/FImageLoad.cs
new file mode 100644
index 0000000..f34d62b
--- /dev/null
+++ b/Launcheroid/FImageLoad.cs
@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Launcheroid
+{
+ public partial class FImageLoad : Form
+ {
+ private FImageLoad()
+ {
+ InitializeComponent();
+ }
+
+ public static bool IsImage(string path)
+ {
+ try
+ {
+ using (Image i = Image.FromFile(path))
+ return true;
+ }
+ catch { };
+ return false;
+ }
+
+ public static Image Open(string path)
+ {
+ try
+ {
+ return Image.FromFile(path);
+ }
+ catch
+ {
+ return null;
+ }
+ }
+
+ public static Image Open()
+ {
+ string allim = "";
+ string types = "";
+ ImageCodecInfo[] decs = ImageCodecInfo.GetImageDecoders();
+ foreach (ImageCodecInfo ici in decs)
+ {
+ types += "|" + ici.FormatDescription + " (" + ici.CodecName + ")" + "|" + ici.FilenameExtension;
+ allim += ";" + ici.FilenameExtension;
+ }
+ types = "All images|" + allim.Substring(1) + types + "|All files|*.*";
+ using (OpenFileDialog ofd = new OpenFileDialog())
+ {
+ ofd.Filter = types;
+ if (ofd.ShowDialog() == DialogResult.OK)
+ return Open(ofd.FileName);
+ }
+ return null;
+ }
+ }
+}
diff --git a/Launcheroid/FImageLoad.resx b/Launcheroid/FImageLoad.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/Launcheroid/FImageLoad.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Launcheroid/FItem.Designer.cs b/Launcheroid/FItem.Designer.cs
new file mode 100644
index 0000000..744e009
--- /dev/null
+++ b/Launcheroid/FItem.Designer.cs
@@ -0,0 +1,243 @@
+namespace Launcheroid
+{
+ partial class FItem
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.lbName = new System.Windows.Forms.Label();
+ this.tbName = new System.Windows.Forms.TextBox();
+ this.tbPath = new System.Windows.Forms.TextBox();
+ this.lbPath = new System.Windows.Forms.Label();
+ this.tbDirectory = new System.Windows.Forms.TextBox();
+ this.lbDir = new System.Windows.Forms.Label();
+ this.tbArguments = new System.Windows.Forms.TextBox();
+ this.lbArgs = new System.Windows.Forms.Label();
+ this.btOk = new System.Windows.Forms.Button();
+ this.btPathGet = new System.Windows.Forms.Button();
+ this.btDirectoryGet = new System.Windows.Forms.Button();
+ this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.pbIcon = new System.Windows.Forms.PictureBox();
+ this.contextMenuStrip1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pbIcon)).BeginInit();
+ this.SuspendLayout();
+ //
+ // lbName
+ //
+ this.lbName.AutoSize = true;
+ this.lbName.Location = new System.Drawing.Point(146, 15);
+ this.lbName.Name = "lbName";
+ this.lbName.Size = new System.Drawing.Size(38, 13);
+ this.lbName.TabIndex = 1;
+ this.lbName.Text = "Name:";
+ //
+ // tbName
+ //
+ this.tbName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbName.Location = new System.Drawing.Point(204, 12);
+ this.tbName.Name = "tbName";
+ this.tbName.Size = new System.Drawing.Size(268, 20);
+ this.tbName.TabIndex = 2;
+ this.tbName.TextChanged += new System.EventHandler(this.TbName_TextChanged);
+ //
+ // tbPath
+ //
+ this.tbPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbPath.Location = new System.Drawing.Point(204, 38);
+ this.tbPath.Name = "tbPath";
+ this.tbPath.Size = new System.Drawing.Size(238, 20);
+ this.tbPath.TabIndex = 4;
+ //
+ // lbPath
+ //
+ this.lbPath.AutoSize = true;
+ this.lbPath.Location = new System.Drawing.Point(146, 41);
+ this.lbPath.Name = "lbPath";
+ this.lbPath.Size = new System.Drawing.Size(32, 13);
+ this.lbPath.TabIndex = 3;
+ this.lbPath.Text = "Path:";
+ //
+ // tbDirectory
+ //
+ this.tbDirectory.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbDirectory.Location = new System.Drawing.Point(204, 64);
+ this.tbDirectory.Name = "tbDirectory";
+ this.tbDirectory.Size = new System.Drawing.Size(238, 20);
+ this.tbDirectory.TabIndex = 6;
+ //
+ // lbDir
+ //
+ this.lbDir.AutoSize = true;
+ this.lbDir.Location = new System.Drawing.Point(146, 67);
+ this.lbDir.Name = "lbDir";
+ this.lbDir.Size = new System.Drawing.Size(52, 13);
+ this.lbDir.TabIndex = 5;
+ this.lbDir.Text = "Directory:";
+ //
+ // tbArguments
+ //
+ this.tbArguments.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tbArguments.Location = new System.Drawing.Point(211, 90);
+ this.tbArguments.Name = "tbArguments";
+ this.tbArguments.Size = new System.Drawing.Size(261, 20);
+ this.tbArguments.TabIndex = 8;
+ //
+ // lbArgs
+ //
+ this.lbArgs.AutoSize = true;
+ this.lbArgs.Location = new System.Drawing.Point(146, 93);
+ this.lbArgs.Name = "lbArgs";
+ this.lbArgs.Size = new System.Drawing.Size(60, 13);
+ this.lbArgs.TabIndex = 7;
+ this.lbArgs.Text = "Arguments:";
+ //
+ // btOk
+ //
+ this.btOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btOk.Location = new System.Drawing.Point(397, 117);
+ this.btOk.Name = "btOk";
+ this.btOk.Size = new System.Drawing.Size(75, 23);
+ this.btOk.TabIndex = 9;
+ this.btOk.Text = "Ok";
+ this.btOk.UseVisualStyleBackColor = true;
+ this.btOk.Click += new System.EventHandler(this.BtOk_Click);
+ //
+ // btPathGet
+ //
+ this.btPathGet.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.btPathGet.Location = new System.Drawing.Point(448, 38);
+ this.btPathGet.Name = "btPathGet";
+ this.btPathGet.Size = new System.Drawing.Size(24, 20);
+ this.btPathGet.TabIndex = 10;
+ this.btPathGet.Text = "...";
+ this.btPathGet.UseVisualStyleBackColor = true;
+ this.btPathGet.Click += new System.EventHandler(this.BtPathGet_Click);
+ //
+ // btDirectoryGet
+ //
+ this.btDirectoryGet.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.btDirectoryGet.Location = new System.Drawing.Point(448, 64);
+ this.btDirectoryGet.Name = "btDirectoryGet";
+ this.btDirectoryGet.Size = new System.Drawing.Size(24, 20);
+ this.btDirectoryGet.TabIndex = 11;
+ this.btDirectoryGet.Text = "...";
+ this.btDirectoryGet.UseVisualStyleBackColor = true;
+ //
+ // contextMenuStrip1
+ //
+ this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.openToolStripMenuItem,
+ this.deleteToolStripMenuItem});
+ this.contextMenuStrip1.Name = "contextMenuStrip1";
+ this.contextMenuStrip1.Size = new System.Drawing.Size(108, 48);
+ this.contextMenuStrip1.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStrip1_Opening);
+ //
+ // openToolStripMenuItem
+ //
+ this.openToolStripMenuItem.Name = "openToolStripMenuItem";
+ this.openToolStripMenuItem.Size = new System.Drawing.Size(107, 22);
+ this.openToolStripMenuItem.Text = "Open";
+ this.openToolStripMenuItem.Click += new System.EventHandler(this.OpenToolStripMenuItem_Click);
+ //
+ // deleteToolStripMenuItem
+ //
+ this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem";
+ this.deleteToolStripMenuItem.Size = new System.Drawing.Size(107, 22);
+ this.deleteToolStripMenuItem.Text = "Delete";
+ this.deleteToolStripMenuItem.Click += new System.EventHandler(this.DeleteToolStripMenuItem_Click);
+ //
+ // pbIcon
+ //
+ this.pbIcon.BackgroundImage = global::Launcheroid.Properties.Resources.imgbg;
+ this.pbIcon.ContextMenuStrip = this.contextMenuStrip1;
+ this.pbIcon.Location = new System.Drawing.Point(12, 12);
+ this.pbIcon.Name = "pbIcon";
+ this.pbIcon.Size = new System.Drawing.Size(128, 128);
+ this.pbIcon.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+ this.pbIcon.TabIndex = 0;
+ this.pbIcon.TabStop = false;
+ //
+ // FItem
+ //
+ this.AllowDrop = true;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(484, 152);
+ this.Controls.Add(this.btDirectoryGet);
+ this.Controls.Add(this.btPathGet);
+ this.Controls.Add(this.btOk);
+ this.Controls.Add(this.tbArguments);
+ this.Controls.Add(this.lbArgs);
+ this.Controls.Add(this.tbDirectory);
+ this.Controls.Add(this.lbDir);
+ this.Controls.Add(this.tbPath);
+ this.Controls.Add(this.lbPath);
+ this.Controls.Add(this.tbName);
+ this.Controls.Add(this.lbName);
+ this.Controls.Add(this.pbIcon);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
+ this.MaximumSize = new System.Drawing.Size(900, 191);
+ this.MinimumSize = new System.Drawing.Size(500, 191);
+ this.Name = "FItem";
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "FItem";
+ this.DragDrop += new System.Windows.Forms.DragEventHandler(this.FItem_DragDrop);
+ this.DragEnter += new System.Windows.Forms.DragEventHandler(this.FItem_DragEnter);
+ this.contextMenuStrip1.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.pbIcon)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.PictureBox pbIcon;
+ private System.Windows.Forms.Label lbName;
+ private System.Windows.Forms.TextBox tbName;
+ private System.Windows.Forms.TextBox tbPath;
+ private System.Windows.Forms.Label lbPath;
+ private System.Windows.Forms.TextBox tbDirectory;
+ private System.Windows.Forms.Label lbDir;
+ private System.Windows.Forms.TextBox tbArguments;
+ private System.Windows.Forms.Label lbArgs;
+ private System.Windows.Forms.Button btOk;
+ private System.Windows.Forms.Button btPathGet;
+ private System.Windows.Forms.Button btDirectoryGet;
+ private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
+ private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem;
+ }
+}
\ No newline at end of file
diff --git a/Launcheroid/FItem.cs b/Launcheroid/FItem.cs
new file mode 100644
index 0000000..74a5393
--- /dev/null
+++ b/Launcheroid/FItem.cs
@@ -0,0 +1,139 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Launcheroid
+{
+ public partial class FItem : Form
+ {
+ private FItem()
+ {
+ InitializeComponent();
+ }
+
+ private static bool Open(LRD3.Item item, string import)
+ {
+ bool saved;
+ using (FItem f = new FItem())
+ {
+ f.LoadItem(item);
+ f.LinkToPath(import);
+ saved = f.ShowDialog() == DialogResult.OK;
+ if (saved)
+ f.SaveItem(item);
+ }
+ return saved;
+ }
+
+ public static bool Execute(LRD3.Item item)
+ {
+ return Open(item, null);
+ }
+
+ public static LRD3.Item Import(string path)
+ {
+ LRD3.Item i = new LRD3.Item();
+ if (Open(i, path))
+ return i;
+ return null;
+ }
+
+ private void LoadItem(LRD3.Item item)
+ {
+ tbName.Text = Text = item.Name;
+ tbPath.Text = item.Path;
+ tbDirectory.Text = item.InitialFolder;
+ tbArguments.Text = item.Arguments;
+ pbIcon.Image = item.Image;
+ }
+
+ private void SaveItem(LRD3.Item item)
+ {
+ item.Name = tbName.Text;
+ item.Path = tbPath.Text;
+ item.InitialFolder = tbDirectory.Text;
+ item.Arguments = tbArguments.Text;
+ item.Image = pbIcon.Image;
+ }
+
+ private void LinkToPath(string path)
+ {
+ // TODO if it is a link (.lnk) open link and recover information
+ tbName.Text = Text = Path.GetFileNameWithoutExtension(path);
+ tbPath.Text = path;
+ tbDirectory.Text = Path.GetDirectoryName(path);
+ try
+ {
+ pbIcon.Image = Icon.ExtractAssociatedIcon(path).ToBitmap();
+ }
+ catch
+ {
+ pbIcon.Image = null;
+ }
+ }
+
+ private void BtOk_Click(object sender, EventArgs e)
+ {
+ DialogResult = DialogResult.OK;
+ }
+
+ private void TbName_TextChanged(object sender, EventArgs e)
+ {
+ Text = tbName.Text;
+ }
+
+ private void OpenToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Image i = FImageLoad.Open();
+ if (i != null)
+ pbIcon.Image = i;
+ }
+
+ private void DeleteToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ pbIcon.Image = null;
+ }
+
+ private void FItem_DragEnter(object sender, DragEventArgs e)
+ {
+ if (!e.Data.GetDataPresent(DataFormats.FileDrop))
+ return;
+ e.Effect = DragDropEffects.Copy;
+ }
+
+ private void FItem_DragDrop(object sender, DragEventArgs e)
+ {
+ string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
+ if (files.Length != 1)
+ return;
+ Point cp = PointToClient(new Point(e.X, e.Y));
+ Control dropTarget = GetChildAtPoint(cp);
+ if (dropTarget == pbIcon)
+ pbIcon.Image = FImageLoad.Open(files[0]);
+ else
+ LinkToPath(files[0]);
+ }
+
+ private void BtPathGet_Click(object sender, EventArgs e)
+ {
+ using (OpenFileDialog ofd = new OpenFileDialog())
+ {
+ ofd.Filter = "Executables|*.exe;*.com;*.lnk|All files|*.*";
+ if (ofd.ShowDialog() == DialogResult.OK)
+ LinkToPath(ofd.FileName);
+ }
+ }
+
+ private void ContextMenuStrip1_Opening(object sender, CancelEventArgs e)
+ {
+ deleteToolStripMenuItem.Enabled = pbIcon.Image != null;
+ }
+ }
+}
diff --git a/Launcheroid/FItem.resx b/Launcheroid/FItem.resx
new file mode 100644
index 0000000..ad53752
--- /dev/null
+++ b/Launcheroid/FItem.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
\ No newline at end of file
diff --git a/Launcheroid/Form1.Designer.cs b/Launcheroid/Form1.Designer.cs
index e04c98c..ebb6b49 100644
--- a/Launcheroid/Form1.Designer.cs
+++ b/Launcheroid/Form1.Designer.cs
@@ -29,12 +29,119 @@
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
+ this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.executeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.executeWithOptionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
+ this.propertiesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
+ this.addItemToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.deleteItemToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator();
+ this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.contextMenuStrip1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // contextMenuStrip1
+ //
+ this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.executeToolStripMenuItem,
+ this.executeWithOptionsToolStripMenuItem,
+ this.toolStripMenuItem1,
+ this.propertiesToolStripMenuItem,
+ this.toolStripMenuItem2,
+ this.addItemToolStripMenuItem,
+ this.deleteItemToolStripMenuItem,
+ this.toolStripMenuItem3,
+ this.settingsToolStripMenuItem});
+ this.contextMenuStrip1.Name = "contextMenuStrip1";
+ this.contextMenuStrip1.Size = new System.Drawing.Size(193, 154);
+ //
+ // executeToolStripMenuItem
+ //
+ this.executeToolStripMenuItem.Name = "executeToolStripMenuItem";
+ this.executeToolStripMenuItem.Size = new System.Drawing.Size(192, 22);
+ this.executeToolStripMenuItem.Text = "Execute";
+ //
+ // executeWithOptionsToolStripMenuItem
+ //
+ this.executeWithOptionsToolStripMenuItem.Name = "executeWithOptionsToolStripMenuItem";
+ this.executeWithOptionsToolStripMenuItem.Size = new System.Drawing.Size(192, 22);
+ this.executeWithOptionsToolStripMenuItem.Text = "Execute with options...";
+ //
+ // toolStripMenuItem1
+ //
+ this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+ this.toolStripMenuItem1.Size = new System.Drawing.Size(189, 6);
+ //
+ // propertiesToolStripMenuItem
+ //
+ this.propertiesToolStripMenuItem.Name = "propertiesToolStripMenuItem";
+ this.propertiesToolStripMenuItem.Size = new System.Drawing.Size(192, 22);
+ this.propertiesToolStripMenuItem.Text = "Properties";
+ //
+ // toolStripMenuItem2
+ //
+ this.toolStripMenuItem2.Name = "toolStripMenuItem2";
+ this.toolStripMenuItem2.Size = new System.Drawing.Size(189, 6);
+ //
+ // addItemToolStripMenuItem
+ //
+ this.addItemToolStripMenuItem.Name = "addItemToolStripMenuItem";
+ this.addItemToolStripMenuItem.Size = new System.Drawing.Size(192, 22);
+ this.addItemToolStripMenuItem.Text = "Add item";
+ this.addItemToolStripMenuItem.Click += new System.EventHandler(this.AddItemToolStripMenuItem_Click);
+ //
+ // deleteItemToolStripMenuItem
+ //
+ this.deleteItemToolStripMenuItem.Name = "deleteItemToolStripMenuItem";
+ this.deleteItemToolStripMenuItem.Size = new System.Drawing.Size(192, 22);
+ this.deleteItemToolStripMenuItem.Text = "Delete item";
+ //
+ // toolStripMenuItem3
+ //
+ this.toolStripMenuItem3.Name = "toolStripMenuItem3";
+ this.toolStripMenuItem3.Size = new System.Drawing.Size(189, 6);
+ //
+ // settingsToolStripMenuItem
+ //
+ this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem";
+ this.settingsToolStripMenuItem.Size = new System.Drawing.Size(192, 22);
+ this.settingsToolStripMenuItem.Text = "Settings";
+ //
+ // Form1
+ //
+ this.AllowDrop = true;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
- this.Text = "Form1";
+ this.ContextMenuStrip = this.contextMenuStrip1;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "Form1";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
+ this.DragDrop += new System.Windows.Forms.DragEventHandler(this.Form1_DragDrop);
+ this.DragEnter += new System.Windows.Forms.DragEventHandler(this.Form1_DragEnter);
+ this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
+ this.contextMenuStrip1.ResumeLayout(false);
+ this.ResumeLayout(false);
+
}
#endregion
+
+ private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
+ private System.Windows.Forms.ToolStripMenuItem executeToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem executeWithOptionsToolStripMenuItem;
+ private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
+ private System.Windows.Forms.ToolStripMenuItem propertiesToolStripMenuItem;
+ private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2;
+ private System.Windows.Forms.ToolStripMenuItem addItemToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem deleteItemToolStripMenuItem;
+ private System.Windows.Forms.ToolStripSeparator toolStripMenuItem3;
+ private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem;
}
}
diff --git a/Launcheroid/Form1.cs b/Launcheroid/Form1.cs
index d710afe..7b73181 100644
--- a/Launcheroid/Form1.cs
+++ b/Launcheroid/Form1.cs
@@ -7,14 +7,89 @@
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
+using XWolf.Aero;
namespace Launcheroid
{
- public partial class Form1 : Form
+ public partial class Form1 : XGlassForm
{
+ private const int WM_NCHITTEST = 0x0084;
+ private static IntPtr HTCAPTION = (IntPtr)2;
+
+ private LRD3 lib = new LRD3();
+ private string libPath;
+
public Form1()
{
InitializeComponent();
+ FullGlass = true;
+ GoToCursor();
+ libPath = Program.ArgumentFile;
+ if (string.IsNullOrEmpty(libPath))
+ libPath = Program.DefaultFile;
+ lib.Load(libPath);
+ }
+
+ protected override void WndProc(ref Message message)
+ {
+ base.WndProc(ref message);
+ if (message.Msg == WM_NCHITTEST)
+ {
+ int r = message.Result.ToInt32();
+ if (r >= 10 && r <= 18)
+ message.Result = HTCAPTION;
+ }
+ }
+
+ private void GoToCursor()
+ {
+ Point c = Cursor.Position;
+ c.X -= Width / 2;
+ if (c.X < 0)
+ c.X = 0;
+ c.Y -= Height / 2;
+ if (c.Y < 0)
+ c.Y = 0;
+ Location = c;
+ }
+
+ private void UpdateLibrary()
+ {
+
+ }
+
+ private void Add(LRD3.Item item)
+ {
+ lib.Items.Add(item);
+ lib.Save(libPath);
+ UpdateLibrary();
+ }
+
+ private void Form1_Paint(object sender, PaintEventArgs e)
+ {
+
+ }
+
+ private void AddItemToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ LRD3.Item item = new LRD3.Item();
+ if (FItem.Execute(item))
+ Add(item);
+ }
+
+ private void Form1_DragEnter(object sender, DragEventArgs e)
+ {
+ if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy;
+ }
+
+ private void Form1_DragDrop(object sender, DragEventArgs e)
+ {
+ string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
+ if (files.Length != 1)
+ return;
+ LRD3.Item item = FItem.Import(files[0]);
+ if (item != null)
+ Add(item);
}
}
}
diff --git a/Launcheroid/Form1.resx b/Launcheroid/Form1.resx
new file mode 100644
index 0000000..783b959
--- /dev/null
+++ b/Launcheroid/Form1.resx
@@ -0,0 +1,380 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+
+
+ AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAAAwMAAAAQAgAKglAABGFQAAKAAAABAA
+ AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wH///8BAAAAAAAAAAAAAAAA////AWtZ
+ OgUAAAAIGRkACpljAP+ZYwD/AAAAAAAAAADfvoIC////Av///wL///8B////AQAAAAAAAAAMNzc3Gi0t
+ LScAAAAxmWMA/5ljAP/2yHX/mWMA/5ljAP+ZYwD/AAAAA////wL///8C////Af///wEAAAALAAAAGC4u
+ LiUnJycxNSkmVvbIdf+ZYwD/VEZEcwAAADP2yHX/mWMA/wAAAA7V1dUD////Av///wH///8BAAAABQAA
+ AA83NzcaSDQwP4pratq9mpb/x6im/5ljAP+ZYwD/AAAAGwAAABJePgUK////Av///wL///8B////AQAA
+ AAAAAAAAdVRHJ4pvZtW3kor/mWMA/5ljAP/+66f/mWMA/5ljAP+ZYwD/AAAAAP///wH///8C////Af//
+ /wEAAAAAeFRNJIttZNKwioD/s4yB//7rp/+ZYwD/yaym/7eSiv/+66f/mWMA/wAAAAD///8C////Av//
+ /wH///8BeFRNJItmW9GpgnP/q4R1/6yFd/+uhnn/y7Kq/8qvp/+yi4D/s4yC/4tsYed/XFhC////Av//
+ /wL///8BfmlcIaSKfNvJsab/0Lyy/9C7sf/Mtav/mWMA/5ljAP+ZYwD/mWMA/5ljAP+ZYwD/h2Re5oJq
+ X0P///8C////AXtZTHLRvrf9zbes/824rf/Oua7/z7qv/5ljAP/rvpL/7MGV/+zBlf/rvpL/mWMA/6qC
+ cv+NbGKRioCAC////wEAAAAAoYZ9ltC+tf3KtKf/y7Wo/8y2qv+ZYwD/7MGV/+yhUv/soVL/67+S/5lj
+ AP+JZlunAAAAAP///wH///8B////AQAAAACfhnyWmWMA/5ljAP+ZYwD/mWMA//DNoP/xt2f/8LJf/+7H
+ lv+ZYwD/mWMA/5ljAP+ZYwD/////Af7+/gEAAAAAAAAAAJ+CepeZYwD/27qJ//bXqv/23K3/+M17//fO
+ f//23bP/9dev/ty9jv+ZYwD/69e5A////wH///8BAAAAAAAAAAD+/v4BoIZ3lpljAP/juGf//NmE//ze
+ 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
+ v//ZxsH/mWMA/5ljAP+ZYwD/mWMA//DNoP/xt2f/8LJf/+7Hlv+ZYwD/mWMA/5ljAP+ZYwD/AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBRSYSFY1nzqoJz/6uEdf+shHb/rYV3/66Gef+uh3r/r4h7/7CJ
+ fP/Xw77/2MS+/9jEv/+5lYr/mWMA/9u6if/216r/9tyt//jNe//3zn//9t2z//XXr/7cvY7/mWMA/+C/
+ hAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuUUeEh2FT87CLff/Ksab/qoJz/7+hlf+/oJT/qoJz/6+I
+ e/+shHb/rYV3/7WShv/IraT/18K8/7+hmP+win3/mWMA/+O4Z//82YT//N6M//3fkP/72o7/5b10/5lj
+ AP/gv4QC/v7+AQAAAAAAAAAAAAAAAAAAAAAAAAAAblFFhKaOgPa+oZT/yK+k/9G8s//RvbT/0r20/863
+ rv+/opb/0buz/66HeP+pgXL/qoJz/7aUh//Vwbn/zbSs/62FeP+uh3n/mWMA/+7Pg//+7Kf//uun/+/Q
+ iP+ZYwD/5MaMAQAAAAD///8BAAAAAAAAAAAAAAAAVVUqBnBRR4SYe2r0yrOo/8+6r//PurD/z7qx/9C7
+ sf/Qu7L/0Lyy/9G8s//RvLP/upuN/7aUh/+winz/w6ab/9O/t//Tv7f/t5eJ/6uCdP+rhHX/mWMA//Hb
+ qP/x26b/mWMA/4RnXf9rTkbRpIeHBf///wEAAAAAAAAAAAAAAABmPz8UrpqU8dnIwP/Nt6z/zbit/824
+ rf/Oua7/zrmv/8+5r//PurD/z7qw/9C7sf/Qu7L/0Lux/62Id//Ls6n/xaqf/9K9tf/OuK7/q4Z2/6iA
+ b/+pgHH/mWMA/5ljAP+rg3T/p4By/4dpX/9vUk2a////AQAAAAAAAAAAAAAAAGYzMwVsTUV9zr+6+dnI
+ v//Mtqr/zLar/8y3q//Nt6z/zbis/824rf/OuK7/zrmu/865r//Puq//tZSF/6yHdv+ieWX/wKSX/9G8
+ s//IsKX/qYFw/6Z9a/+mfmz/p39u/6h/b/+pg3P/cVRNygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AABsTUN9zr+4+djHvf/KtKf/y7Wo/8u1qf/Ltqr/zLaq/8y3q//Mt6z/zbes/824rf/OuK3/xKue/6B2
+ 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
+ AD/+AAB//wAA//+AAf//wAP//+AH///wD///+B////w////+f////3///////ygAAAAwAAAAYAAAAAEA
+ IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAABAAA
+ AAYAAAAHAAAACAAAAAgAAAAJAAAACAAAAAgAAAAHAAAABgAAAAQAAAACAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAcAAAAKAAAADQAA
+ ABAAAAASAAAAFAAAABYAAAAYAAAAGQAAABk2NjYbTU1NG01NTRtQUFAZUVFQGD4+PhUAAAASAAAAD4he
+ NBrAewD/wHsA/8B7AP/AewD/sHpGDgAAAAAAAAAAAAAAAP38+wL///8B////Af///wH///8BAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAA
+ ABMAAAAXAAAAGgAAAB4AAAAhAAAAJAAAACYAAAAoAAAAKgAAACoqKiosKioqKysrKyoAAAAoAAAAJQAA
+ ACMAAAAgAAAAHQAAABnAewD/4KRL/+CkS//AewD/AAAABwAAAAMAAAAAAAAAAAAAAAD///8B////Af//
+ /wH///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAADAAA
+ ABEAAAAVAAAAGQAAAB4AAAAiAAAAJgAAACoAAAAuAAAAMQAAADUAAAA3AAAAOgAAADtWPjmiIyMjPCQk
+ JDoAAAA3AAAANMB7AP/AewD/wHsA/8B7AP/AewD/4KRL/+CkS//AewD/wHsA/8B7AP/AewD/wHsA/wAA
+ AAD///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAA
+ AAoAAAAOAAAAEwAAABcAAAAcAAAAIAAAACUAAAApAAAALgAAADIAAAA3AAAAOwAAAD8AAABEAAAASGJF
+ QfaMcXDxWUJBqh8fH0gAAABDAAAAPsB7AP/gpEv/4KRL/8B7AP/AewD/wHsA/8B7AP/AewD/wHsA/+Ck
+ S//gpEv/wHsA/wAAAAT///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAFAAAACQAAAA4AAAASAAAAFwAAABsAAAAfAAAAJAAAACgAAAAtAAAAMQAAADYAAAA6AAAAPgAA
+ AEIAAABGYEQ/9ZJ4ef+HcHH/fGNg9FlCQKoAAABFAAAAQcB7AP/fo0v/36NL/8B7AP8AAAAsAAAAJwAA
+ ACMAAAAewHsA/9+jS//fo0v/wHsA/wAAAAiJiYkE////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAIAAAAGAAAACwAAAA8AAAATAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAA
+ ADQAAAA4AAAAOwAAAD5fRD/1kXZ2/5d+fv+3mJn/loaG/4p3c/ZZQD2mIiIiPsB7AP/AewD/wHsA/8B7
+ AP8AAAArAAAAJwAAACMAAAAfwHsA/8B7AP/AewD/wHsA/wAAAApycnIGvLy8Av///wH///8BAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAACgAAAA8AAAATAAAAFwAAABsAAAAeAAAAIgAA
+ ACYAAAApAAAALQAAADAAAAAzAAAANWJHP/SOdHT/m399/8ShoP/Go6P/uZub/5aGhv+KcnH1WkI/oQAA
+ ADQAAAAyAAAALwAAACzAewD/wHsA/8B7AP/AewD/AAAAGQAAABYAAAARAAAADQAAAAlycnIGvLy8Av//
+ /wH///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAACQAAAAwAAAAQAAAAFAAA
+ ABcAAAAbAAAAHgAAACEAAAAkAAAAJwAAACoAAAAsYkc/9I5ycP+dgH//w5+d/8Ognv/EoZ//xKGf/7yf
+ n/+ajY3/iHFt9F5EP50AAAArAAAAKQAAACbAegD/+dWJ//zdj//AegD/AAAAFgAAABMAAAAPAAAACwAA
+ AAcAAAAD////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABQAA
+ AAkAAAAMAAAADwAAABMAAAAWAAAAGQAAABsAAAAeAAAAIAAAACJgR0Lzi3Bt/6GCgP/AnJj/wZ2Z/8Gd
+ mv/Cn5z/wp+d/9W8uv/Pvr3/mY2M/8B7AP/AewD/wHsA/8B7AP/AegD/+teK//zfkP/AegD/wHsA/8B7
+ AP/AewD/wHsA/wAAAAT///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAQAAAAQAAAAHAAAACgAAAA0AAAAQAAAAEgAAABUAAAAXAAAAGWBHQvOKbmr/o4N//76Z
+ lP++mpX/vpqW/7+blv/Fo6H/xaSh/9zHxv/gzcz/z7+9/8B6AP/51Yn//N2P/8B6AP+/egD/v3oA/796
+ AP+/egD/wHoA//nVif/83Y//wHoA/////wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAYAAAAJAAAACwAAAA0AAAAPY0VB8olt
+ aP+mhH//u5aQ/7uWkP+8l5H/vJiS/72Yk//ey8n/3svJ/97Myf/fzMr/2cPB/8B6AP/614r//N+Q/8B6
+ AP8AAAAPAAAADQAAAAsAAAAIwHoA//rXiv/835D/wHoA/////wH///8B////Af///wH///8BAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAA
+ AAZjREHyiGxm/6eFfv+4k4v/uZSM/7mUjf+6lY7/upWP/7uWj//bx8T/3crH/93KyP/ey8j/0bm0/796
+ AP+/egD/v3oA/796AP9qTUeLAAAABQAAAAMAAAABv3oA/796AP+/egD/v3oA/////wH///8B////Af//
+ /wH///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAGNEQfKJa2T/qIV9/7aQh/+2kIj/t5GJ/7eSif+4kor/uJOL/7mTjP+6lo7/zLCr/9zJ
+ xv/dysb/zLCr/7yXkf+8l5H/r42H/4FoZP93XFbxbU1JhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+ /wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAY0RB8olqYv+phHv/s42C/7SNg/+0joT/tY6F/7WPhv+2kIf/tpCH/7eR
+ iP+3kor/x6mj/9vIxP/cyMT/yKul/8B7AP/AewD/wHsA/8B7AP/AewD/wHsA/8B7AP/AewD/wHsA/8B7
+ AP/AewD/wHsA/////wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjREHyiWph/6mEeP+xin7/sYp//7KLgP+yjIH/s4yB/7ON
+ gv+0jYP/tI6E/7WOhf+1kIb/xaag/9rHwv/ax8P/x6qk/8B7AP/two3/8riB//O6hP/zuoT/87qE//O6
+ hP/zuoT/87qE//K4gf/two3/wHsA/////wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBEQPKKamD/qYJ2/66Hev+vh3v/r4h7/7CI
+ fP+wiX3/sYl+/7GKf/+yi3//souA/7KMgf/AoJj/z7ex/9nGwf/ZxsH/ya2m/8B7AP/nsGv/651N/+uf
+ UP/rn1D/659Q/+ufUP/rn1D/659Q/+udTf/nsGv/wHsA/////wH///8B////Af///wH///8BAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYERA8oxqX/+ogXP/rIR1/6yE
+ dv+thXf/rYV4/62Gef+uh3n/rod6/6+Ie/+viHz/sIl9/7CJfv/YxL7/2MS+/9jEv//Yxb//zbOr/8B7
+ AP/nsGv/655O/+ygUv/soFL/7KBS/+ygUv/soFL/7KBS/+ueTv/nsGv/wHsA/////wH///8B////Af//
+ /wH///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgREDyjWpd/6h/
+ b/+pgXH/qYFy/6qCcv+qgnP/q4N0/6uDdf+shHb/rIV3/62Fd/+thnj/roZ5/66Hev/Pt6//z7ev/9fD
+ vP/Xw73/1L64/8B7AP/nsWz/651O/+ygUv/soFL/7KBS/+ygUv/soFL/7KBS/+ueTv/nsGv/wHsA////
+ /wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGNE
+ QvKPalz/pX1s/7aVhv/SvrX/tJKE/6uDdP+4l4r/07+3/7aUhv+qgXL/qoJz/7SQgv+rg3X/rIR1/6yE
+ dv+thnj/rYd5/861rv/Wwrz/18K8/8B7AP/osW3/7KBR/+ugUv/soFL/7KBS/+ygUv/roFH/66BR/+ud
+ Tv/nsGv/wHsA/////wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAY0RC8q+WjP+3l4j/t5aH/8ivpP/RvbT/0b20/9K9tP/SvbX/0r61/8ivpf+5mIv/vJ6R/9O/
+ t/+zj4H/qoFy/6qCc/+rgnT/q4N0/8Chlf/Vwbr/1cG6/8B7AP/nsm//7aRY/+6mWf/tpFX/7aRU/+2j
+ VP/to1P/7KFT/+ufT//nsGv/wHsA/2tLR4cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABgQ0DymHJi/8+6sP/PurH/0Lux/9C7sf/Qu7L/0Lyy/9G8s//RvLP/0byz/9G9
+ tP/SvbT/0r21/9G8s/+pgnL/qH9u/6h/b//AewD/wHsA/8B7AP/AewD/wHsA/8B7AP/utnT/7q1f//Cx
+ ZP/wsmT/769c/++sWP/uqlb/7qhW/+2lUv/ssGv/wHsA/8B7AP/AewD/wHsA/8B7AP/AewD/AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVFQvKif2//yLGl/865rv/Oua//z7qv/8+6sP/PurD/z7qw/9C7
+ sf/Qu7H/0Luy/9C8sv/RvLL/0byz/9G8s//Ls6n/sY1+/8aroP+1k4X/wHsA/9ebSv/1xZX/8LFr//G1
+ bv/wtWj/8rdo//S6a//0vW7/9L5v//S8bv/zuWb/8bJd/++tV//uq1n/761h/+6pYP/1v4z/2J1I+sB7
+ AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZkhC1NPBuf/Xxr3/zbes/824rf/NuK3/zrit/865
+ rv/Oua7/zrmv/865r//Puq//z7qw/8+6sP/Pu7H/0Lux/9C7sv/Qu7L/0Lyy/9G8s/+0k4T/vqGU/8B7
+ AP/boEj/8r17//K2Z//0vWv/9cFw//bFc//3x3X/98l4//fJev/3yXv/9sd9//XDd//zu3D/8bVn//K5
+ dv/boUv/wHsA/2VOQ0T///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaU8+TZN8cfLs5OD/18W8/8y2
+ q//Mt6v/zbes/823rP/NuKz/zbit/824rf/OuK7/zrmu/865r//Oua//z7qv/8+6sP/PurD/z7qx/865
+ rv+pg3H/p4Bu/7STg//AewD/5LZu//jJgv/2xXP/98p4//nPe//50X7/+tOB//nTgv/50oT/+dCD//fO
+ hP/3yoT/98yQ/+nEiv/AewD/ZEZA8XBXTxr///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVL
+ PmKTe3Dy7OTg/9bFu//Ltqn/y7aq/8y2qv/Mtqv/zLer/8y3rP/Nt6z/zbis/824rf/NuK3/zriu/865
+ rv/Oua7/zrmv/8+5r//FrKH/rYl3/7KRgf+heGT/wHsA/+jCfP/504X/+tN///zXhP/82ob//duJ//3c
+ i//824z/+9mM//rWjP/51ZP/7MuT/8B7AP9lSUDx/Pn0Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABlSz5ikntw8uzk4P/WxLr/yrWo/8u1qP/Ltaj/y7Wp/8u2qv/Mtqr/zLaq/8y3
+ q//Mt6v/zbes/823rP/NuK3/zbit/864rf/Oua7/zrmu/8u0qf+heGT/oHZh/8B7AP/vz47//dyL//3f
+ jf/94pH//eKU//7jlf/94pX//eCV//zdlf/x1Jv/wHsA/2VKQfEAAAAA////Af///wH///8BAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZUg+YpJ6cPLs5N//1sS6/8q0pv/KtKf/yrSn/8q0
+ p//Ltaj/y7Wo/8u1qf/Ltqr/zLaq/8y2qv/Mtqv/zLer/8y3rP/Nt6z/zLer/6N8Z/+edF7/pX5r/8y2
+ qv/AewD/+uSp///nmv//6J3//+qh///pof//6KD//+eh//vns//AewD/aEtA8e/evwH///8B////Af//
+ /wH///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVIPmKSe3Dy7OTe/9XE
+ uf/Js6X/ybOl/8mzpv/KtKb/yrSm/8q0p//KtKf/yrWo/8u1qP/Ltan/y7Wp/8u2qv/Mtqr/zLar/6eC
+ bv+ccVv/o3tm/8iwpP/EqZz/wHsA//3stv/+77D///G2///wtf/+7q///e24/8B7AP9oSkDxAAAAAP//
+ /wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AABlSD5ikXtv8uvj3v/Vw7n/yLKj/8iypP/IsqT/ybOl/8mzpf/Js6b/ybOm/8q0pv/KtKf/yrSn/8q1
+ p//Ltaj/y7Wo/76jlP+zlIL/m29Z/6B3Yf+cclr/nW5W/8B7AP//9tL///TN///0yv//9s//wHsA/3BO
+ P/Lu27oB////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAZUg+YpF6bvLr497/1cO4/8exov/HsaP/yLGj/8iyo//IsqT/yLKk/8my
+ pP/Js6X/ybOl/8mzpv/KtKb/yrSn/8q0p//Ks6b/mW1V/5luVv+ablf/mW5V/55tT//AewD///rk///5
+ 4v/AewD/e1I79AAAAAD+/fwB////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVIPmKRem7y6+Pd/9TDt//GsKH/x7Ch/8ew
+ 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
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABiRjlij3Zr8ung2v/SwLP/vaaV/2RFP/EAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYkY5Yo1xafK8o5D/ZEU/8QAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJGOWJkRjvOAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AABfPz8YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD///////8AAP//gAH//wAA//gAAAODAAD/wAAAAcMAAP8AAAAAQwAA/AAAAAADAAD8AAAAAAMAAPgA
+ AAAAAwAA+AAAAAADAAD4AAAAAAMAAPwAAAAAAwAA/gAAAAADAAD/gAAAAAMAAP/wAAAAAwAA//wAAB+D
+ AAD/+AAAAAMAAP/wAAAAAwAA/+AAAAADAAD/wAAAAAMAAP+AAAAAAwAA/wAAAAADAAD+AAAAAD8AAPwA
+ AAAAAwAA+AAAAAAHAADwAAAAAAMAAPAAAAAAAwAA+AAAAAADAAD8AAAAACMAAP4AAAAAAwAA/wAAAACD
+ AAD/gAAAAAMAAP/AAAACAwAA/+AAAAQDAAD/8AAACAMAAP/4AAAf/wAA//wAAD//AAD//gAAf/8AAP//
+ AAD//wAA//+AAf//AAD//8AD//8AAP//4Af//wAA///wD///AAD///gf//8AAP///D///wAA///+f///
+ AAD///9///8AAP///////wAA////////AAA=
+
+
+
\ No newline at end of file
diff --git a/Launcheroid/GFX.cs b/Launcheroid/GFX.cs
new file mode 100644
index 0000000..2c931c7
--- /dev/null
+++ b/Launcheroid/GFX.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Launcheroid
+{
+ class GFX
+ {
+ }
+}
diff --git a/Launcheroid/Glass.cs b/Launcheroid/Glass.cs
new file mode 100644
index 0000000..bf287c3
--- /dev/null
+++ b/Launcheroid/Glass.cs
@@ -0,0 +1,540 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using System.ComponentModel;
+using System.Drawing;
+using System.ComponentModel.Design.Serialization;
+using System.Globalization;
+using System.Collections;
+using System.Drawing.Drawing2D;
+
+namespace XWolf.Aero
+{
+ #region XGlassForm
+ public class XGlassForm : Form
+ {
+ private bool composite;
+ private GlassMargins glassMargins = new GlassMargins(50, 0, 0, 0);
+ private Image glassImage = null;
+ private Point glassImageLocation = new Point();
+ private bool glassDrag = true;
+
+ public XGlassForm()
+ {
+ DoubleBuffered = true;
+ composite = Glass.Composite;
+ this.Shown += new EventHandler(XGlassForm_Shown);
+ this.Paint += new PaintEventHandler(XGlassForm_Paint);
+ this.Resize += new EventHandler(XGlassForm_Resize);
+ this.MouseDown += new MouseEventHandler(XGlassForm_MouseDown);
+ }
+
+ void XGlassForm_Resize(object sender, EventArgs e)
+ {
+ Invalidate();
+ }
+
+ //protected override void WndProc(ref Message msg)
+ //{
+ // int[] except={3,6,8,13,14,20,28,32,36,70,71,132,134,160,161,174,274,512,533,534,561,562,641,642,674,675};
+ // //mensaje 20
+
+ // //switch (msg.Msg)
+ // //{
+ // // case WM_DWMCOLORIZATIONCOLORCHANGED:
+ // // // The color format of currColor is 0xAARRGGBB.
+ // // uint currColor = (uint)msg.WParam.ToInt32();
+ // // bool opacityblend = (msg.LParam.ToInt32() != 0);
+ // // ...
+ // // break;
+ // //}
+ // base.WndProc(ref msg);
+ // foreach (int msge in except)
+ // if (msg.Msg == msge)
+ // return;
+ // Console.WriteLine("MSG: " + msg.Msg);
+
+ //}
+
+ void XGlassForm_Shown(object sender, EventArgs e)
+ {
+ UpdateGlass();
+ }
+ void XGlassForm_Paint(object sender, PaintEventArgs e)
+ {
+ Size client = ClientSize;
+ if (DesignMode)
+ {
+ Pen p = new Pen(Color.Gray);
+ Rectangle glassclient = new Rectangle(glassMargins.Left - 1, glassMargins.Top - 1, client.Width - (glassMargins.Left + glassMargins.Right) + 1, client.Height - (glassMargins.Top + glassMargins.Bottom) + 1);
+ e.Graphics.DrawRectangle(p, glassclient);
+ }
+ else
+ if (glassMargins.IsFull)
+ e.Graphics.Clear(Color.Transparent);
+ else
+ {
+
+ Rectangle glassclient = new Rectangle(glassMargins.Left, glassMargins.Top, client.Width - (glassMargins.Left + glassMargins.Right), client.Height - (glassMargins.Top + glassMargins.Bottom));
+ e.Graphics.Clear(composite ? Color.Transparent : SystemColors.ButtonShadow);
+ e.Graphics.FillRectangle(new SolidBrush(BackColor), glassclient);
+ }
+ if (glassImage != null)
+ {
+ Rectangle r = new Rectangle(glassImageLocation, glassImage.Size);
+ e.Graphics.DrawImage(glassImage, r);
+ }
+ //if (glassMargins.IsFull)
+ // e.Graphics.Clear(Color.Transparent);
+ //else
+ //{
+ // Brush b = new SolidBrush(Color.Transparent);
+ // Size client=ClientSize;
+ // e.Graphics.FillRectangle(b, 0, 0, glassMargins.Left, client.Width);
+ //}
+ }
+
+ void XGlassForm_MouseDown(object sender, MouseEventArgs e)
+ {
+ if (!glassDrag)
+ return;
+ Size c = ClientSize;
+ if (e.X > glassMargins.Left && e.X < c.Width - glassMargins.Right &&
+ e.Y > glassMargins.Top && e.Y < c.Height - glassMargins.Bottom)
+ return;
+ // Releasing the mouse capture to allow the form to receive the order
+ Aero.ReleaseCapture();
+ // Ordering the form
+ // Simulating left mouse button clicking on the title bar
+ Aero.SendMessage(this.Handle, // Form handle
+ Aero.WM_NCLBUTTONDOWN, // Simulating the click
+ Aero.HTCAPTION, // Attaching it to the title bar
+ 0); // No further options required
+ }
+
+
+ private void UpdateGlass()
+ {
+ if (composite)
+ {
+ Glass.GlassForm(this, glassMargins);
+ Invalidate();
+ }
+ }
+
+ protected void DrawText(Graphics g, string text, Font font, Brush brush, PointF p)
+ {
+ GraphicsPath gp = new GraphicsPath();
+ gp.AddString(text, font.FontFamily, (int)font.Style, font.Size, p, StringFormat.GenericDefault);
+ g.FillPath(brush, gp);
+ gp.Dispose();
+ }
+
+ protected void DrawText(Graphics g, string text, FontFamily fontfam, int fontstyle, float fontsize, Brush brush, PointF p)
+ {
+ GraphicsPath gp = new GraphicsPath();
+ gp.AddString(text, fontfam, fontstyle, fontsize, p, StringFormat.GenericDefault);
+ g.FillPath(brush, gp);
+ gp.Dispose();
+ }
+
+ [Description("Margenes del efecto cristal"), Category("Aero Glass"), RefreshProperties(RefreshProperties.All)]
+ public GlassMargins GlassMargins
+ {
+ get { return glassMargins; }
+ set { glassMargins = value; UpdateGlass(); }
+ }
+
+ [Description("Cristal completo"), Category("Aero Glass"), RefreshProperties(RefreshProperties.All)]
+ public bool FullGlass
+ {
+ get { return glassMargins.IsFull; }
+ set { if (value) glassMargins = GlassMargins.GetFullGlassMargins(); UpdateGlass(); }
+ }
+
+ [Description("Imagen en el cristal"), Category("Aero Glass")]
+ public Image GlassImage
+ {
+ get { return glassImage; }
+ set { glassImage = value; Invalidate(); }
+ }
+
+ [Description("Posicion de Imagen en el cristal"), Category("Aero Glass")]
+ public Point GlassImageLocation
+ {
+ get { return glassImageLocation; }
+ set { glassImageLocation = value; Invalidate(); }
+ }
+
+ [Description("Usar la extensión del glass como un tirador"), Category("Aero Glass")]
+ public bool GlassDrag
+ {
+ get { return glassDrag; }
+ set { glassDrag = value; }
+ }
+ }
+ #endregion
+
+ public class Aero
+ {
+ internal static bool hasAero;
+
+ #region API
+ private class DWNAPI
+ {
+ [DllImport("dwmapi.dll")]
+ public extern static int DwmExtendFrameIntoClientArea(IntPtr hwnd, ref GlassMargins margin);
+ [DllImport("dwmapi.dll")]
+ public extern static int DwmIsCompositionEnabled(ref int en);
+ }
+
+ [DllImport("user32.dll")]
+ [return: MarshalAs(UnmanagedType.I4)]
+ public static extern int SendMessage(IntPtr hWnd, [param: MarshalAs(UnmanagedType.U4)]uint Msg, [param: MarshalAs(UnmanagedType.U4)]uint wParam, [param: MarshalAs(UnmanagedType.I4)]int lParam);
+
+ [DllImport("user32.dll")]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ public static extern bool ReleaseCapture();
+
+ public const uint WM_NCLBUTTONDOWN = 0xA1; // 161
+ public const uint HTCAPTION = 2;
+ #endregion
+
+
+ #region APIex
+ internal static void DwmExtendFrameIntoClientArea(IntPtr hwnd, GlassMargins margin)
+ {
+ try
+ {
+ DWNAPI.DwmExtendFrameIntoClientArea(hwnd, ref margin);
+ }
+ catch { };
+ }
+ internal static bool DwmIsCompositionEnabled()
+ {
+ try
+ {
+ int result = 0;
+ DWNAPI.DwmIsCompositionEnabled(ref result);
+ return result > 0;
+ }
+ catch { return false; };
+ }
+ #endregion
+
+ static Aero()
+ {
+ hasAero = false;
+ try
+ {
+ DwmIsCompositionEnabled();
+ hasAero = true;
+ }
+ catch { };
+ }
+
+ public static bool HasAero { get { return hasAero; } }
+ }
+
+ #region GalssMarginsConverter
+ public class GalssMarginsConverter : TypeConverter
+ {
+ private static CultureInfo FixCulture(CultureInfo c)
+ {
+ if (c == null)
+ return CultureInfo.CurrentCulture;
+ return c;
+ }
+ private static char GetListSeparator(CultureInfo c)
+ {
+ c = FixCulture(c);
+ return c.TextInfo.ListSeparator[0];
+ }
+
+ #region ConvertFrom
+
+ public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+ {
+ return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
+ }
+
+ public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+ {
+ string str = value as string;
+ if (str == null)
+ return base.ConvertFrom(context, culture, value);
+ str = str.Trim();
+ if (str.Length == 0)
+ return null;
+ culture = FixCulture(culture);
+ char ch = culture.TextInfo.ListSeparator[0];
+ string[] strArray = str.Split(new char[] { ch });
+ int[] numArray = new int[strArray.Length];
+ if (numArray.Length != 4)
+ throw new ArgumentException("Solo se admiten 4 valores");
+ TypeConverter converter = TypeDescriptor.GetConverter(typeof(int));
+ for (int i = 0; i < numArray.Length; i++)
+ numArray[i] = (int)converter.ConvertFromString(context, culture, strArray[i]);
+ return new GlassMargins(numArray[0], numArray[1], numArray[2], numArray[3]);
+ }
+
+ #endregion
+
+ #region ConvertTo
+
+ public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
+ {
+ return ((destinationType == typeof(InstanceDescriptor)) || base.CanConvertTo(context, destinationType));
+ }
+
+ public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
+ {
+ if (destinationType == null)
+ throw new ArgumentNullException("destinationType");
+ if (value is GlassMargins)
+ {
+ if (destinationType == typeof(string))
+ {
+ GlassMargins gmargins = (GlassMargins)value;
+ if (culture == null)
+ culture = CultureInfo.CurrentCulture;
+ string separator = culture.TextInfo.ListSeparator + " ";
+ TypeConverter converter = TypeDescriptor.GetConverter(typeof(int));
+ string[] strArray ={
+ converter.ConvertToString(context, culture, gmargins.Left),
+ converter.ConvertToString(context, culture, gmargins.Top),
+ converter.ConvertToString(context, culture, gmargins.Right),
+ converter.ConvertToString(context, culture, gmargins.Bottom)
+ };
+ return string.Join(separator, strArray);
+ }
+ //if (destinationType == typeof(InstanceDescriptor))
+ //{
+ // GlassMargins gmargins = (GlassMargins)value;
+
+ // return new InstanceDescriptor(typeof(GlassMargins).GetConstructor(new Type[] { typeof(int), typeof(int), typeof(int), typeof(int) }), new object[] { gmargins.Left, gmargins.Top, gmargins.Right, gmargins.Bottom });
+ //}
+ }
+ return base.ConvertTo(context, culture, value, destinationType);
+ }
+
+ #endregion
+
+ #region Instancia
+ public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
+ {
+ if (context == null)
+ {
+ throw new ArgumentNullException("context");
+ }
+ if (propertyValues == null)
+ {
+ throw new ArgumentNullException("propertyValues");
+ }
+ GlassMargins gmargins = (GlassMargins)context.PropertyDescriptor.GetValue(context.Instance);
+ return new GlassMargins((int)propertyValues["Left"], (int)propertyValues["Top"], (int)propertyValues["Right"], (int)propertyValues["Bottom"]);
+ }
+
+ public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
+ {
+ return true;
+ }
+ #endregion
+
+ #region Properties
+ public override bool GetPropertiesSupported(ITypeDescriptorContext context)
+ {
+ return true;
+ }
+
+ public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
+ {
+ return TypeDescriptor.GetProperties(value, attributes).Sort(new string[] { "Left", "Top", "Right", "Bottom" });
+ }
+ #endregion
+ }
+ #endregion
+
+ //#region GalssMarginsConverter
+ //public class GalssMarginsConverter : TypeConverter
+ //{
+ // #region ConvertFrom
+
+ // public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+ // {
+ // return ((sourceType == typeof(string)) || base.CanConvertFrom(context, sourceType));
+ // }
+
+ // public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+ // {
+ // string str = value as string;
+ // if (str == null)
+ // return base.ConvertFrom(context, culture, value);
+ // str = str.Trim();
+ // if (str.Length == 0)
+ // return null;
+ // if (culture == null)
+ // culture = CultureInfo.CurrentCulture;
+ // char ch = culture.TextInfo.ListSeparator[0];
+ // string[] strArray = str.Split(new char[] { ch });
+ // int[] numArray = new int[strArray.Length];
+ // TypeConverter converter = TypeDescriptor.GetConverter(typeof(int));
+ // for (int i = 0; i < numArray.Length; i++)
+ // numArray[i] = (int)converter.ConvertFromString(context, culture, strArray[i]);
+ // if (numArray.Length != 4)
+ // throw new ArgumentException();
+ // return new GlassMargins(numArray[0], numArray[1], numArray[2], numArray[3]);
+ // }
+
+ // #endregion
+
+ // #region ConvertTo
+
+ // public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
+ // {
+ // //return ((destinationType == typeof(InstanceDescriptor)) || base.CanConvertTo(context, destinationType));
+ // return ((destinationType == typeof(String)) || base.CanConvertTo(context, destinationType));
+ // }
+
+ // public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
+ // {
+ // if (destinationType == null)
+ // throw new ArgumentNullException("destinationType");
+ // if (value is GlassMargins)
+ // {
+ // if (destinationType == typeof(string))
+ // {
+ // GlassMargins gmargins = (GlassMargins)value;
+ // if (culture == null)
+ // culture = CultureInfo.CurrentCulture;
+ // string separator = culture.TextInfo.ListSeparator + " ";
+ // TypeConverter converter = TypeDescriptor.GetConverter(typeof(int));
+ // string[] strArray ={
+ // converter.ConvertToString(context, culture, gmargins.Left),
+ // converter.ConvertToString(context, culture, gmargins.Top),
+ // converter.ConvertToString(context, culture, gmargins.Right),
+ // converter.ConvertToString(context, culture, gmargins.Bottom)
+ // };
+ // return string.Join(separator, strArray);
+ // }
+ // //if (destinationType == typeof(InstanceDescriptor))
+ // //{
+ // // GlassMargins gmargins = (GlassMargins)value;
+
+ // // return new InstanceDescriptor(typeof(GlassMargins).GetConstructor(new Type[] { typeof(int), typeof(int), typeof(int), typeof(int) }), new object[] { gmargins.Left, gmargins.Top, gmargins.Right, gmargins.Bottom });
+ // //}
+ // }
+ // return base.ConvertTo(context, culture, value, destinationType);
+ // }
+
+ // #endregion
+
+ // //public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
+ // //{
+ // // if (context == null)
+ // // {
+ // // throw new ArgumentNullException("context");
+ // // }
+ // // if (propertyValues == null)
+ // // {
+ // // throw new ArgumentNullException("propertyValues");
+ // // }
+ // // GlassMargins gmargins = (GlassMargins)context.PropertyDescriptor.GetValue(context.Instance);
+ // // return new GlassMargins((int)propertyValues["Left"], (int)propertyValues["Top"], (int)propertyValues["Right"], (int)propertyValues["Bottom"]);
+ // //}
+
+ // //public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
+ // //{
+ // // return true;
+ // //}
+
+ // #region Properties
+ // public override bool GetPropertiesSupported(ITypeDescriptorContext context)
+ // {
+ // return true;
+ // }
+
+ // public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
+ // {
+ // return TypeDescriptor.GetProperties(value, attributes).Sort(new string[] { "Left", "Top", "Right", "Bottom" });
+ // }
+ // #endregion
+ //}
+ //#endregion
+
+ #region GlassMargins
+ [Serializable, StructLayout(LayoutKind.Sequential), TypeConverter(typeof(GalssMarginsConverter))]
+ public struct GlassMargins
+ {
+ private int left;
+ private int right;
+ private int top;
+ private int bottom;
+
+ public static GlassMargins GetFullGlassMargins()
+ {
+ return new GlassMargins(-1, -1, -1, -1);
+ }
+
+ public GlassMargins(int left, int top, int right, int bottom)
+ {
+ this.left = left;
+ this.right = right;
+ this.top = top;
+ this.bottom = bottom;
+ }
+
+ public int Top { get { return top; } set { top = value; } }
+ public int Left { get { return left; } set { left = value; } }
+ public int Right { get { return right; } set { right = value; } }
+ public int Bottom { get { return bottom; } set { bottom = value; } }
+
+ [Browsable(false)]
+ public bool IsFull { get { return top == -1 && left == -1 && right == -1 & bottom == -1; } }
+
+ [Browsable(false)]
+ public bool IsNone { get { return top == 0 && left == 0 && right == 0 & bottom == 0; } }
+
+ public override string ToString()
+ {
+ if (IsFull)
+ return "Full Glass";
+ if (IsNone)
+ return "No Glass";
+ return left + "; " + top + "; " + right + "; " + bottom;
+ }
+ };
+ #endregion
+
+ internal class Glass
+ {
+ private static bool CheckComposite()
+ {
+ if (!Aero.hasAero)
+ return false;
+ return Aero.DwmIsCompositionEnabled();
+ }
+
+ public static void GlassForm(Form f)
+ {
+ GlassForm(f, GlassMargins.GetFullGlassMargins());
+ }
+
+ public static void GlassForm(Form f, int leftmargin, int bottommargin, int rightmargin, int topmargin)
+ {
+ GlassForm(f, new GlassMargins(leftmargin, bottommargin, rightmargin, topmargin));
+ }
+
+ public static void GlassForm(Form f, GlassMargins margins)
+ {
+ if (!Composite)
+ return;
+ Aero.DwmExtendFrameIntoClientArea(f.Handle, margins);
+ }
+
+ public static bool Composite { get { return CheckComposite(); } }
+ }
+
+}
diff --git a/Launcheroid/LRD3.cs b/Launcheroid/LRD3.cs
new file mode 100644
index 0000000..9599d3c
--- /dev/null
+++ b/Launcheroid/LRD3.cs
@@ -0,0 +1,118 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Launcheroid
+{
+ public class LRD3
+ {
+ public class Item
+ {
+ public string Name { get; set; }
+ public string Path { get; set; }
+ public string Arguments { get; set; }
+ public string InitialFolder { get; set; }
+ public Image Image { get; set; }
+ }
+
+ public LRD3()
+ {
+ Reset();
+ }
+
+ public void Reset()
+ {
+ NavigationRoot = null;
+ IconSize = 48;
+ IconSpacing = 5;
+ IconMargin = 7;
+ Items.Clear();
+ }
+
+ #region Load/Save
+ ///
+ /// Load all information from file
+ ///
+ ///
+ public void Load(string path)
+ {
+ if (!File.Exists(path))
+ return;
+ Reset();
+
+ }
+
+ ///
+ /// Save the current information to a file
+ ///
+ ///
+ public void Save(string path)
+ {
+ using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
+ using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))
+ {
+ sw.WriteLine("// Launcheroid3 file (Text mode) Autogenerated by Lancheroid on " + DateTime.Now.ToString());
+ sw.WriteLine("// Launcheroid3 by XWolfOverride in 2019");
+ sw.WriteLine();
+ foreach (Item i in Items)
+ {
+ sw.WriteLine("[Item]");
+ sw.Write("name:"); sw.WriteLine(i.Name);
+ sw.Write("path:"); sw.WriteLine(i.Path);
+ sw.Write("idir:"); sw.WriteLine(i.InitialFolder);
+ sw.Write("args:"); sw.WriteLine(i.Arguments);
+ sw.Write("icon:"); sw.WriteLine(Image64(i.Image));
+ sw.WriteLine("");
+ }
+ sw.WriteLine("[Settings]");
+ sw.Write("root:"); sw.WriteLine(NavigationRoot);
+ sw.Write("size:"); sw.WriteLine(IconSize);
+ sw.Write("spac:"); sw.WriteLine(IconSpacing);
+ sw.Write("marg:"); sw.WriteLine(IconMargin);
+ }
+ }
+
+ private string Image64(Image i)
+ {
+ if (i == null)
+ return "";
+ MemoryStream ms = new MemoryStream();
+ i.Save(ms, ImageFormat.Png);
+ ms.Close();
+ byte[] data = ms.GetBuffer();
+ return Convert.ToBase64String(data);
+ }
+ #endregion
+
+ ///
+ /// Navigation root for navigation panel (if not null)
+ /// use '/' for root
+ ///
+ public string NavigationRoot { get; set; }
+
+ ///
+ /// Size (in pixels) of icons in screen
+ ///
+ public int IconSize { get; set; }
+
+ ///
+ /// Size (in pixels) of spacing between icons
+ ///
+ public int IconSpacing { get; set; }
+
+ ///
+ /// Size (in pixels) of between icons and window frame
+ ///
+ public int IconMargin { get; set; }
+
+ ///
+ /// List of items in Launcher
+ ///
+ public List- Items { get; } = new List
- ();
+ }
+}
diff --git a/Launcheroid/Launcheroid.csproj b/Launcheroid/Launcheroid.csproj
index 905a7f8..cd25f18 100644
--- a/Launcheroid/Launcheroid.csproj
+++ b/Launcheroid/Launcheroid.csproj
@@ -32,6 +32,9 @@
prompt
4
+
+ AppIconLN.ico
+
@@ -46,14 +49,40 @@
+
+ Form
+
+
+ FImageLoad.cs
+
+
+ Form
+
+
+ FItem.cs
+
Form
Form1.cs
+
+
+ Form
+
+
+
+ FImageLoad.cs
+
+
+ FItem.cs
+
+
+ Form1.cs
+
ResXFileCodeGenerator
Resources.Designer.cs
@@ -62,6 +91,7 @@
True
Resources.resx
+ True
SettingsSingleFileGenerator
@@ -76,5 +106,9 @@
+
+
+
+
\ No newline at end of file
diff --git a/Launcheroid/Program.cs b/Launcheroid/Program.cs
index b4ac4f9..6966ab2 100644
--- a/Launcheroid/Program.cs
+++ b/Launcheroid/Program.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
@@ -8,6 +9,7 @@
{
static class Program
{
+ private const string DEFAULTFILENAME = "Links.lrd";
///
/// The main entry point for the application.
///
@@ -18,5 +20,25 @@
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
+
+ public static string ArgumentFile
+ {
+ get
+ {
+ string[] args = Environment.GetCommandLineArgs();
+ if (args.Length > 1)
+ return args[1];
+ return null;
+ }
+ }
+
+ public static string DefaultFile
+ {
+ get
+ {
+ string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
+ return Path.Combine(Path.GetDirectoryName(path), DEFAULTFILENAME);
+ }
+ }
}
}
diff --git a/Launcheroid/Properties/Resources.Designer.cs b/Launcheroid/Properties/Resources.Designer.cs
index 130c198..5f07ac2 100644
--- a/Launcheroid/Properties/Resources.Designer.cs
+++ b/Launcheroid/Properties/Resources.Designer.cs
@@ -8,10 +8,10 @@
//
//------------------------------------------------------------------------------
-namespace Launcheroid.Properties
-{
-
-
+namespace Launcheroid.Properties {
+ using System;
+
+
///
/// A strongly-typed resource class, for looking up localized strings, etc.
///
@@ -19,53 +19,55 @@
// 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.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- internal class Resources
- {
-
+ 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()
- {
+ internal Resources() {
}
-
+
///
/// Returns the cached ResourceManager instance used by this class.
///
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Resources.ResourceManager ResourceManager
- {
- get
- {
- if ((resourceMan == null))
- {
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Launcheroid.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
-
+
///
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
///
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Globalization.CultureInfo Culture
- {
- get
- {
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
return resourceCulture;
}
- set
- {
+ set {
resourceCulture = value;
}
}
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap imgbg {
+ get {
+ object obj = ResourceManager.GetObject("imgbg", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
}
}
diff --git a/Launcheroid/Properties/Resources.resx b/Launcheroid/Properties/Resources.resx
index af7dbeb..7ece317 100644
--- a/Launcheroid/Properties/Resources.resx
+++ b/Launcheroid/Properties/Resources.resx
@@ -46,7 +46,7 @@
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
- : System.Serialization.Formatters.Binary.BinaryFormatter
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
@@ -60,6 +60,7 @@
: and then encoded with base64 encoding.
-->
+
@@ -68,9 +69,10 @@
-
+
+
@@ -85,9 +87,10 @@
-
+
+
@@ -109,9 +112,13 @@
2.0
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ..\res\imgbg.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
\ No newline at end of file
diff --git a/Launcheroid/res/AppIcon.ico b/Launcheroid/res/AppIcon.ico
new file mode 100644
index 0000000..1fcba38
--- /dev/null
+++ b/Launcheroid/res/AppIcon.ico
Binary files differ
diff --git a/Launcheroid/res/AppIconLN.ico b/Launcheroid/res/AppIconLN.ico
new file mode 100644
index 0000000..3b09534
--- /dev/null
+++ b/Launcheroid/res/AppIconLN.ico
Binary files differ
diff --git a/Launcheroid/res/BlueLauncher.ico b/Launcheroid/res/BlueLauncher.ico
new file mode 100644
index 0000000..ce77a12
--- /dev/null
+++ b/Launcheroid/res/BlueLauncher.ico
Binary files differ
diff --git a/Launcheroid/res/Gnome App Green.ico b/Launcheroid/res/Gnome App Green.ico
new file mode 100644
index 0000000..340605b
--- /dev/null
+++ b/Launcheroid/res/Gnome App Green.ico
Binary files differ
diff --git a/Launcheroid/res/WhiteLauncher.ico b/Launcheroid/res/WhiteLauncher.ico
new file mode 100644
index 0000000..77326a3
--- /dev/null
+++ b/Launcheroid/res/WhiteLauncher.ico
Binary files differ
diff --git a/Launcheroid/res/imgbg.png b/Launcheroid/res/imgbg.png
new file mode 100644
index 0000000..4a250e0
--- /dev/null
+++ b/Launcheroid/res/imgbg.png
Binary files differ