/* * 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. */ #define MUD_RAPIDDEV using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Newtonsoft.Json; using static ShiftOS.Engine.SaveSystem; namespace ShiftOS.Engine { /// /// Provides functionality for managing windows within ShiftOS. /// public static class AppearanceManager { [Obsolete("Please use Localization.GetAllLanguages().")] public static string[] GetLanguages() { return Localization.GetAllLanguages(); } /// /// Sets the title text of the specified window. /// /// The window to modify /// The title text to use /// Thrown if the window is null. public static void SetWindowTitle(IShiftOSWindow window, string title) { if (window == null) throw new ArgumentNullException("window", "The window cannot be null."); winmgr.SetTitle(window, title); } public static IEnumerable GetAllWindowTypes() { List types = new List(); foreach(var file in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) { if(file.EndsWith(".exe") || file.EndsWith(".dll")) { try { var asm = Assembly.LoadFile(file); foreach(var type in asm.GetTypes()) { if (type.GetInterfaces().Contains(typeof(IShiftOSWindow))) types.Add(type); } } catch { } } } return types; } /// /// Returns the default window title for a specified -inheriting type. /// /// The type to scan /// The default title /// Thrown if is null. public static string GetDefaultTitle(Type winType) { if (winType == null) throw new ArgumentNullException("winType"); foreach(var attrib in winType.GetCustomAttributes(false)) { if(attrib is DefaultTitleAttribute) { return (attrib as DefaultTitleAttribute).Title; } } return winType.Name; } /// /// Current cursor position of the console /// public static int CurrentPosition { get; set; } /// /// We don't know what this does. It may be gone if it does nothing. /// public static int LastLength { get; set; } /// /// Minimize a window. /// /// The window border to minimize. /// Thrown if is null. /// Thrown if this part of the engine hasn't been enabled. public static void Minimize(IWindowBorder form) { if (form == null) throw new ArgumentNullException("form"); if (winmgr == null) throw new EngineModuleDisabledException(); winmgr.Minimize(form); } /// /// Maximizes a window. /// /// The window border to maximize. /// Thrown if is null. /// Thrown if this engine module hasn't been enabled. public static void Maximize(IWindowBorder form) { if (form == null) throw new ArgumentNullException("form"); if (winmgr == null) throw new EngineModuleDisabledException(); winmgr.Maximize(form); } /// /// Provides a list of all open ShiftOS windows. /// public static List OpenForms = new List(); /// /// Decorates a window with a border, then shows the window. /// /// The window to decorate and show. /// Thrown if is null. /// Thrown if this engine module has not been initiated yet. public static void SetupWindow(IShiftOSWindow form) { if (form == null) throw new ArgumentNullException("form"); if (winmgr == null) throw new EngineModuleDisabledException(); winmgr.SetupWindow(form); Desktop.ResetPanelButtons(); } /// /// Closes the specified window. /// /// The window to close. /// Thrown if is null. /// Thrown if this engine module has not been initiated yet. public static void Close(IShiftOSWindow win) { if (win == null) throw new ArgumentNullException("win"); if (winmgr == null) throw new EngineModuleDisabledException(); winmgr.Close(win); Desktop.ResetPanelButtons(); } /// /// Decorates a window with a border, then shows the window, as a dialog box. /// /// The window to decorate and show. /// Thrown if is null. /// Thrown if this engine module has not been initiated yet. public static void SetupDialog(IShiftOSWindow form) { if (form == null) throw new ArgumentNullException("form"); if (winmgr == null) throw new EngineModuleDisabledException(); winmgr.SetupDialog(form); Desktop.ResetPanelButtons(); } /// /// The underlying window manager for this engine module /// private static WindowManager winmgr = null; /// /// Initiate this engine module, and perform mandatory configuration. /// /// A working, configured to use as a backend for this module public static void Initiate(WindowManager mgr) { winmgr = mgr; } /// /// Raised when the engine is entering its shutdown phase. Save your work! /// public static event EmptyEventHandler OnExit; /// /// Starts the engine's exit routine, firing the OnExit event. /// internal static void Exit() { OnExit?.Invoke(); //disconnect from MUD ServerManager.Disconnect(); Desktop.InvokeOnWorkerThread(() => { Environment.Exit(0); }); } /// /// The current terminal body control. /// public static ITerminalWidget ConsoleOut { get; set; } /// /// Redirects the .NET to a new instance. /// public static void StartConsoleOut() { Console.SetOut(new TerminalTextWriter()); } /// /// Invokes an action on the window management thread. /// /// The action to invoke public static void Invoke(Action act) { winmgr.InvokeAction(act); } } /// /// Provides the base functionality for a ShiftOS terminal. /// public interface ITerminalWidget { /// /// Write text to this Terminal. /// /// Text to write void Write(string text); /// /// Write text to this Terminal, followed by a newline. /// /// Text to write. void WriteLine(string text); /// /// Clear the contents of this Terminal. /// void Clear(); /// /// Move the cursor to the last character in the Terminal. /// void SelectBottom(); } /// /// Provides the base functionality for a ShiftOS window manager. /// public abstract class WindowManager { /// /// Minimizes a window /// /// The window border to minimize public abstract void Minimize(IWindowBorder border); /// /// Maximizes a window /// /// The window border to maximize public abstract void Maximize(IWindowBorder border); /// /// Closes a window /// /// The window to close public abstract void Close(IShiftOSWindow win); /// /// Decorates a window with a window border, then shows it to the user. /// /// The window to decorate. public abstract void SetupWindow(IShiftOSWindow win); /// /// Decorates a window with a border, then shows it to the user as a dialog box. /// /// The window to decorate public abstract void SetupDialog(IShiftOSWindow win); /// /// Invokes an action on the window management thread. /// /// The action to invoke. public abstract void InvokeAction(Action act); /// /// Sets the title text of a window. /// /// The window to modify. /// The new title text. public abstract void SetTitle(IShiftOSWindow win, string title); } /// /// Provides the base functionality for a typical ShiftOS window border. /// public interface IWindowBorder { /// /// Closes the border along with its window. Unload events should be invoked here. /// void Close(); /// /// Gets or sets the title text for the window border. /// string Text { get; set; } /// /// Gets or sets the underlying for this border. /// IShiftOSWindow ParentWindow { get; set; } } /// /// Provides a way of setting default title text for classes. /// public class DefaultTitleAttribute : Attribute { /// /// Creates a new instance of the . /// /// A default title to associate with this attribute. public DefaultTitleAttribute(string title) { Title = title; } public string Title { get; private set; } } /// /// An exception that is thrown when mandatory configuration to run a specific method or module hasn't been done yet. /// public class EngineModuleDisabledException : Exception { /// /// Initializes a new instance of the . /// public EngineModuleDisabledException() : base("This engine module has not yet been enabled.") { } } }