aboutsummaryrefslogtreecommitdiff
path: root/ShiftOS.WinForms/Program.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ShiftOS.WinForms/Program.cs')
-rw-r--r--ShiftOS.WinForms/Program.cs279
1 files changed, 279 insertions, 0 deletions
diff --git a/ShiftOS.WinForms/Program.cs b/ShiftOS.WinForms/Program.cs
new file mode 100644
index 0000000..8f65265
--- /dev/null
+++ b/ShiftOS.WinForms/Program.cs
@@ -0,0 +1,279 @@
+/*
+ * MIT License
+ *
+ * Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using ShiftOS.Engine;
+using Newtonsoft.Json;
+using static ShiftOS.Objects.ShiftFS.Utils;
+using ShiftOS.WinForms.Applications;
+using ShiftOS.WinForms.Tools;
+using System.Reflection;
+using System.IO;
+
+namespace ShiftOS.WinForms
+{
+ public static class Program
+ {
+ /// <summary>
+ /// The main entry point for the application.
+ /// </summary>
+ [STAThread]
+ public static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ //if ANYONE puts code before those two winforms config lines they will be declared a drunky. - Michael
+ SkinEngine.SetPostProcessor(new DitheringSkinPostProcessor());
+ SaveSystem.PreDigitalSocietyConnection += () =>
+ {
+ Action completed = null;
+ completed = () =>
+ {
+ SaveSystem.Ready = true;
+ Engine.AudioManager.PlayCompleted -= completed;
+ AudioManager.StartAmbientLoop();
+ };
+ Engine.AudioManager.PlayCompleted += completed;
+ Engine.AudioManager.PlayStream(Properties.Resources.dial_up_modem_02);
+
+ };
+ LoginManager.Init(new GUILoginFrontend());
+ CrashHandler.SetGameMetadata(Assembly.GetExecutingAssembly());
+ SkinEngine.SetIconProber(new ShiftOSIconProvider());
+ ShiftOS.Engine.AudioManager.Init(new ShiftOSAudioProvider());
+ Localization.RegisterProvider(new WFLanguageProvider());
+
+ TutorialManager.RegisterTutorial(new Oobe());
+
+ TerminalBackend.TerminalRequested += () =>
+ {
+ AppearanceManager.SetupWindow(new Applications.Terminal());
+ };
+ Infobox.Init(new Dialog());
+ FileSkimmerBackend.Init(new WinformsFSFrontend());
+ var desk = new WinformsDesktop();
+ Desktop.Init(desk);
+ OutOfBoxExperience.Init(new Oobe());
+ AppearanceManager.Initiate(new WinformsWindowManager());
+ Application.Run(desk);
+ }
+ }
+
+ internal class ShiftOSIconProvider : IIconProber
+ {
+ public Image GetIcon(DefaultIconAttribute attr)
+ {
+
+ var res = typeof(Properties.Resources);
+ foreach(var prop in res.GetProperties(BindingFlags.NonPublic | BindingFlags.Static))
+ {
+ if(prop.PropertyType.BaseType == typeof(Image))
+ {
+ if(prop.Name == attr.ID)
+ {
+ return prop.GetValue(null) as Image;
+ }
+ }
+ }
+ return new Bitmap(16, 16);
+ }
+ }
+
+ [ShiftoriumProvider]
+ internal class WinformsShiftoriumProvider : IShiftoriumProvider
+ {
+ public List<ShiftoriumUpgrade> GetDefaults()
+ {
+ var defaultList = JsonConvert.DeserializeObject<List<ShiftoriumUpgrade>>(Properties.Resources.Shiftorium);
+
+ foreach(var exe in Directory.GetFiles(Environment.CurrentDirectory))
+ {
+ if (exe.EndsWith(".exe") || exe.EndsWith(".dll"))
+ {
+ try
+ {
+ var asm = Assembly.LoadFile(exe);
+ foreach (var type in asm.GetTypes())
+ {
+ var attrib = type.GetCustomAttributes(false).FirstOrDefault(x => x is AppscapeEntryAttribute) as AppscapeEntryAttribute;
+ if (attrib != null)
+ {
+ var upgrade = new ShiftoriumUpgrade
+ {
+ Id = attrib.Name.ToLower().Replace(" ", "_"),
+ Name = attrib.Name,
+ Description = attrib.Description,
+ Cost = attrib.Cost,
+ Category = attrib.Category,
+ Dependencies = (string.IsNullOrWhiteSpace(attrib.DependencyString)) ? "appscape_handled_nodisplay" : "appscape_handled_nodisplay;" + attrib.DependencyString
+ };
+ defaultList.Add(upgrade);
+ }
+
+ var sattrib = type.GetCustomAttributes(false).FirstOrDefault(x => x is StpContents) as StpContents;
+ if (sattrib != null)
+ {
+ var upgrade = new ShiftoriumUpgrade
+ {
+ Id = sattrib.Upgrade,
+ Name = sattrib.Name,
+ Description = "This is a hidden dummy upgrade for the .stp file installation attribute \"" + sattrib.Name + "\".",
+ Cost = 0,
+ Category = "If this is shown, there's a bug in the Shiftorium Provider or the user is a supreme Shifter.",
+ Dependencies = "dummy_nodisplay"
+ };
+ defaultList.Add(upgrade);
+ }
+
+ }
+
+
+
+
+ }
+ catch { }
+ }
+ }
+ return defaultList;
+ }
+ }
+
+ public class WinformsFSFrontend : IFileSkimmer
+ {
+
+
+ public void OpenDirectory(string path)
+ {
+ var fs = new Applications.FileSkimmer();
+ AppearanceManager.SetupWindow(fs);
+ fs.ChangeDirectory(path);
+ }
+
+ public void GetPath(string[] filetypes, FileOpenerStyle style, Action<string> callback)
+ {
+ AppearanceManager.SetupDialog(new Applications.FileDialog(filetypes, style, callback));
+ }
+
+ public void OpenFile(string path)
+ {
+ try
+ {
+ switch (FileSkimmerBackend.GetFileType(path))
+ {
+ case FileType.TextFile:
+ if (!Shiftorium.UpgradeInstalled("textpad"))
+ throw new Exception();
+
+ var txt = new TextPad();
+ AppearanceManager.SetupWindow(txt);
+ txt.LoadFile(path);
+ break;
+ case FileType.Executable:
+ //NYI
+ throw new Exception();
+ case FileType.Lua:
+ try
+ {
+ var runner = new Engine.Scripting.LuaInterpreter();
+ runner.ExecuteFile(path);
+ }
+ catch (Exception ex)
+ {
+ Infobox.Show("{LUA_ERROR}", ex.Message);
+ }
+ break;
+ case FileType.JSON:
+ //NYI
+ throw new Exception();
+ case FileType.Filesystem:
+ MountPersistent(path);
+ //If this doesn't fail...
+ FileSkimmerBackend.OpenDirectory((Mounts.Count - 1).ToString() + ":");
+ break;
+ case FileType.Skin:
+ if (!Shiftorium.UpgradeInstalled("skinning"))
+ throw new Exception();
+
+ var sl = new Skin_Loader();
+ AppearanceManager.SetupWindow(sl);
+ sl.LoadedSkin = JsonConvert.DeserializeObject<Skin>(ReadAllText(path));
+ sl.SetupUI();
+ break;
+ case FileType.Image:
+ if (!Shiftorium.UpgradeInstalled("artpad_open"))
+ throw new Exception();
+
+ var ap = new Artpad();
+ AppearanceManager.SetupWindow(ap);
+ ap.LoadPicture(path);
+ break;
+ default:
+ throw new Exception();
+
+ }
+ }
+ catch
+ {
+ Infobox.Show("{NO_APP_TO_OPEN}", "{NO_APP_TO_OPEN_EXP}");
+ }
+
+ }
+
+ public Image GetImage(string path)
+ {
+ return Applications.FileSkimmer.GetImage(FileSkimmerBackend.GetFileType(path));
+ }
+
+ public string GetFileExtension(FileType fileType)
+ {
+ switch (fileType)
+ {
+ case FileType.Executable:
+ return ".saa";
+ case FileType.Filesystem:
+ return ".mfs";
+ case FileType.Image:
+ return ".pic";
+ case FileType.JSON:
+ return ".json";
+ case FileType.Lua:
+ return ".lua";
+ case FileType.Python:
+ return ".py";
+ case FileType.Skin:
+ return ".skn";
+ case FileType.TextFile:
+ return ".txt";
+ default:
+ return ".bin";
+
+ }
+ }
+ }
+}