diff options
| author | Michael VanOverbeek <[email protected]> | 2017-04-07 17:02:38 +0000 |
|---|---|---|
| committer | Michael VanOverbeek <[email protected]> | 2017-04-07 17:02:38 +0000 |
| commit | 3d48f3101aa25050e6b219fc1111293273a59fa4 (patch) | |
| tree | 40bf8d722245d02d87b0914a38e2b09673e093c0 /ShiftOS.WinForms/WindowBorder.cs | |
| parent | edf4aef6adf8a2a45c347f70804fc5ac93070576 (diff) | |
| parent | 3789b48df00e89fa6dcd7e27bb6885ba880504f6 (diff) | |
| download | shiftos_thereturn-3d48f3101aa25050e6b219fc1111293273a59fa4.tar.gz shiftos_thereturn-3d48f3101aa25050e6b219fc1111293273a59fa4.tar.bz2 shiftos_thereturn-3d48f3101aa25050e6b219fc1111293273a59fa4.zip | |
Merge branch 'master' of https://github.com/shiftos-game/ShiftOS
Diffstat (limited to 'ShiftOS.WinForms/WindowBorder.cs')
| -rw-r--r-- | ShiftOS.WinForms/WindowBorder.cs | 496 |
1 files changed, 496 insertions, 0 deletions
diff --git a/ShiftOS.WinForms/WindowBorder.cs b/ShiftOS.WinForms/WindowBorder.cs new file mode 100644 index 0000000..4fba470 --- /dev/null +++ b/ShiftOS.WinForms/WindowBorder.cs @@ -0,0 +1,496 @@ +/* + * 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.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +using static ShiftOS.Engine.SkinEngine; +using System.Runtime.InteropServices; +using ShiftOS.Engine; +using ShiftOS.WinForms.Tools; +using ShiftOS.WinForms.Applications; + +/// <summary> +/// Window border. +/// </summary> +namespace ShiftOS.WinForms +{ + /// <summary> + /// Window border. + /// </summary> + public partial class WindowBorder : Form, IWindowBorder + { + /// <summary> + /// Raises the closing event. + /// </summary> + /// <param name="e">E.</param> + protected override void OnClosing(CancelEventArgs e) + { + if ((ParentWindow as IShiftOSWindow).OnUnload()) + { + if (!SaveSystem.ShuttingDown) + { + if(Engine.AppearanceManager.OpenForms.Contains(this)) + Engine.AppearanceManager.OpenForms.Remove(this); + Desktop.ResetPanelButtons(); + } + } + base.OnClosing(e); + } + + /// <summary> + /// The parent window. + /// </summary> + private UserControl _parentWindow = null; + + /// <summary> + /// Gets or sets the parent window. + /// </summary> + /// <value>The parent window.</value> + public IShiftOSWindow ParentWindow + { + get + { + return (IShiftOSWindow)_parentWindow; + } + set + { + _parentWindow = (UserControl)value; + } + } + + internal void SetTitle(string title) + { + lbtitletext.Text = title; + } + + /// <summary> + /// Initializes a new instance of the <see cref="ShiftOS.WinForms.WindowBorder"/> class. + /// </summary> + /// <param name="win">Window.</param> + public WindowBorder(UserControl win) + { + InitializeComponent(); + this._parentWindow = win; + Shiftorium.Installed += () => + { + try + { + this.ParentForm.Invoke(new Action(() => + { + Setup(); + })); + } + catch { } + }; + SkinEngine.SkinLoaded += () => + { + try + { + Setup(); + (ParentWindow as IShiftOSWindow).OnSkinLoad(); + ControlManager.SetupControls(this.pnlcontents); + } + catch + { + + } + }; + this.Width = LoadedSkin.LeftBorderWidth + _parentWindow.Width + LoadedSkin.RightBorderWidth; + this.Height = LoadedSkin.TitlebarHeight + _parentWindow.Height + LoadedSkin.BottomBorderWidth; + + this.pnlcontents.Controls.Add(this._parentWindow); + this._parentWindow.Dock = DockStyle.Fill; + this._parentWindow.Show(); + ControlManager.SetupControls(this._parentWindow); + + ParentWindow.OnSkinLoad(); + ParentWindow.OnUpgrade(); + Shiftorium.Installed += () => + { + Setup(); + ParentWindow.OnUpgrade(); + }; + + Desktop.ShowWindow(this); + + } + + /// <summary> + /// Universals the key down. + /// </summary> + /// <returns>The key down.</returns> + /// <param name="o">O.</param> + /// <param name="a">The alpha component.</param> + public static void Universal_KeyDown(object o, KeyEventArgs a) + { + if (a.Control && a.KeyCode == Keys.T) + { + a.SuppressKeyPress = true; + + + if (SaveSystem.CurrentSave != null) + { + if (Shiftorium.UpgradeInstalled("window_manager")) + { + Engine.AppearanceManager.SetupWindow(new Applications.Terminal()); + } + } + } + + ShiftOS.Engine.Scripting.LuaInterpreter.RaiseEvent("on_key_down", a); + } + + /// <summary> + /// Windows the border load. + /// </summary> + /// <returns>The border load.</returns> + /// <param name="sender">Sender.</param> + /// <param name="e">E.</param> + public void WindowBorder_Load(object sender, EventArgs e) + { + this.DoubleBuffered = true; + + this._parentWindow.TextChanged += (o, a) => + { + Setup(); + Desktop.ResetPanelButtons(); + + }; + + this.Left = (Screen.PrimaryScreen.Bounds.Width - this.Width) / 2; + this.Top = (Screen.PrimaryScreen.Bounds.Height - this.Height) / 2; + + if (!this.IsDialog) + { + Engine.AppearanceManager.OpenForms.Add(this); + } + + SaveSystem.GameReady += () => + { + if (Shiftorium.UpgradeInstalled("wm_free_placement")) + { + AppearanceManager.Invoke(new Action(() => + { + this.Left = (Screen.PrimaryScreen.Bounds.Width - this.Width) / 2; + this.Top = (Screen.PrimaryScreen.Bounds.Height - this.Height) / 2; + + })); + } + AppearanceManager.Invoke(new Action(() => + { + Setup(); + })); + }; + + ControlManager.SetupControls(this); + + Setup(); + + var sWin = (IShiftOSWindow)ParentWindow; + + sWin.OnLoad(); + } + + /// <summary> + /// Setup this instance. + /// </summary> + public void Setup() + { + this.lbtitletext.Text = NameChangerBackend.GetName(ParentWindow); + + if (SaveSystem.CurrentSave != null) + { + this.pnltitle.Visible = Shiftorium.UpgradeInstalled("wm_titlebar"); + this.pnlclose.Visible = Shiftorium.UpgradeInstalled("close_button"); + this.pnlminimize.Visible = (IsDialog == false) && Shiftorium.UpgradeInstalled("minimize_button"); + this.pnlmaximize.Visible = (IsDialog == false) && Shiftorium.UpgradeInstalled("maximize_button"); + SetupSkin(); + } + else + { + this.pnltitle.Visible = false; + this.pnlclose.Visible = false; + this.pnlminimize.Visible = false; + this.pnlmaximize.Visible = false; + + } + } + + /// <summary> + /// Setups the skin. + /// </summary> + /// <returns>The skin.</returns> + public void SetupSkin() + { + this.DoubleBuffered = true; + this.TransparencyKey = LoadedSkin.SystemKey; + pnltitle.Height = LoadedSkin.TitlebarHeight; + pnltitle.BackColor = LoadedSkin.TitleBackgroundColor; + pnltitle.BackgroundImage = GetImage("titlebar"); + pnltitleleft.Visible = LoadedSkin.ShowTitleCorners; + pnltitleright.Visible = LoadedSkin.ShowTitleCorners; + pnltitleleft.BackColor = LoadedSkin.TitleLeftCornerBackground; + pnltitleright.BackColor = LoadedSkin.TitleRightCornerBackground; + pnltitleleft.Width = LoadedSkin.TitleLeftCornerWidth; + pnltitleright.Width = LoadedSkin.TitleRightCornerWidth; + pnltitleleft.BackgroundImage = GetImage("titleleft"); + pnltitleleft.BackgroundImageLayout = GetImageLayout("titleleft"); + pnltitleright.BackgroundImage = GetImage("titleright"); + pnltitleright.BackgroundImageLayout = GetImageLayout("titleright"); + pnltitle.BackgroundImageLayout = GetImageLayout("titlebar"); //RETARD ALERT. WHY WASN'T THIS THERE WHEN IMAGELAYOUTS WERE FIRST IMPLEMENTED? + + lbtitletext.BackColor = (pnltitle.BackgroundImage != null) ? Color.Transparent : LoadedSkin.TitleBackgroundColor; + lbtitletext.ForeColor = LoadedSkin.TitleTextColor; + lbtitletext.Font = LoadedSkin.TitleFont; + + pnlleft.BackColor = LoadedSkin.BorderLeftBackground; + pnlleft.BackgroundImage = GetImage("leftborder"); + pnlleft.BackgroundImageLayout = GetImageLayout("leftborder"); + pnlleft.Width = LoadedSkin.LeftBorderWidth; + pnlright.BackColor = LoadedSkin.BorderRightBackground; + pnlright.BackgroundImage = GetImage("rightborder"); + pnlright.BackgroundImageLayout = GetImageLayout("rightborder"); + pnlright.Width = LoadedSkin.RightBorderWidth; + + pnlbottom.BackColor = LoadedSkin.BorderBottomBackground; + pnlbottom.BackgroundImage = GetImage("bottomborder"); + pnlbottom.BackgroundImageLayout = GetImageLayout("bottomborder"); + pnlbottom.Height = LoadedSkin.BottomBorderWidth; + + pnlbottomr.BackColor = LoadedSkin.BorderBottomRightBackground; + pnlbottomr.BackgroundImage = GetImage("bottomrborder"); + pnlbottomr.BackgroundImageLayout = GetImageLayout("bottomrborder"); + pnlbottoml.BackColor = LoadedSkin.BorderBottomLeftBackground; + pnlbottoml.BackgroundImage = GetImage("bottomlborder"); + pnlbottoml.BackgroundImageLayout = GetImageLayout("bottomlborder"); + + lbtitletext.ForeColor = LoadedSkin.TitleTextColor; + lbtitletext.Font = LoadedSkin.TitleFont; + pnlclose.BackColor = LoadedSkin.CloseButtonColor; + pnlclose.BackgroundImage = GetImage("closebutton"); + pnlclose.BackgroundImageLayout = GetImageLayout("closebutton"); + pnlminimize.BackColor = LoadedSkin.MinimizeButtonColor; + pnlminimize.BackgroundImage = GetImage("minimizebutton"); + pnlminimize.BackgroundImageLayout = GetImageLayout("minimizebutton"); + pnlmaximize.BackColor = LoadedSkin.MaximizeButtonColor; + pnlmaximize.BackgroundImage = GetImage("maximizebutton"); + pnlmaximize.BackgroundImageLayout = GetImageLayout("maximizebutton"); + + pnlclose.Size = LoadedSkin.CloseButtonSize; + pnlminimize.Size = LoadedSkin.MinimizeButtonSize; + pnlmaximize.Size = LoadedSkin.MaximizeButtonSize; + pnlclose.Location = FromRight(LoadedSkin.CloseButtonFromSide); + pnlminimize.Location = FromRight(LoadedSkin.MinimizeButtonFromSide); + pnlmaximize.Location = FromRight(LoadedSkin.MaximizeButtonFromSide); + pnlclose.Left -= pnlclose.Width; + pnlmaximize.Left -= pnlmaximize.Width; + pnlminimize.Left -= pnlminimize.Width; + + switch (LoadedSkin.TitleTextCentered) + { + case false: + lbtitletext.Location = new Point(16 + LoadedSkin.TitlebarIconFromSide.X + LoadedSkin.TitleTextLeft.X, + LoadedSkin.TitleTextLeft.Y); + break; + default: + lbtitletext.Left = (pnltitle.Width - lbtitletext.Width) / 2; + lbtitletext.Top = LoadedSkin.TitleTextLeft.Y; + break; + } + + if (Shiftorium.UpgradeInstalled("app_icons")) + { + pnlicon.Show(); + pnlicon.Size = new Size(16, 16); + pnlicon.BackColor = Color.Transparent; + pnlicon.BackgroundImage = GetIcon(this.ParentWindow.GetType().Name); + pnlicon.BackgroundImageLayout = ImageLayout.Stretch; + pnlicon.Location = LoadedSkin.TitlebarIconFromSide; + } + else + { + pnlicon.Hide(); + } + } + + /// <summary> + /// Froms the right. + /// </summary> + /// <returns>The right.</returns> + /// <param name="input">Input.</param> + public Point FromRight(Point input) + { + return new Point(pnltitle.Width - input.X, input.Y); + } + + /// <summary> + /// Lbtitletexts the click. + /// </summary> + /// <returns>The click.</returns> + /// <param name="sender">Sender.</param> + /// <param name="e">E.</param> + private void lbtitletext_Click(object sender, EventArgs e) + { + + } + + /// <summary> + /// Pnlcloses the click. + /// </summary> + /// <returns>The click.</returns> + /// <param name="sender">Sender.</param> + /// <param name="e">E.</param> + private void pnlclose_Click(object sender, EventArgs e) + { + this.Close(); + } + + /// <summary> + /// Pnlmaximizes the click. + /// </summary> + /// <returns>The click.</returns> + /// <param name="sender">Sender.</param> + /// <param name="e">E.</param> + private void pnlmaximize_Click(object sender, EventArgs e) + { + if (maximized == false) + Desktop.MaximizeWindow(this); + else + Desktop.RestoreWindow(this); + maximized = !maximized; + SetupSkin(); + } + + bool minimized = false; + bool maximized = false; + + public bool IsMinimized + { + get + { + return minimized; + } + } + + public bool IsMaximized + { + get + { + return maximized; + } + } + + + /// <summary> + /// Pnlminimizes the click. + /// </summary> + /// <returns>The click.</returns> + /// <param name="sender">Sender.</param> + /// <param name="e">E.</param> + private void pnlminimize_Click(object sender, EventArgs e) + { + if (minimized == false) + Desktop.MinimizeWindow(this); + else + Desktop.RestoreWindow(this); + minimized = !minimized; + } + + + /// <summary> + /// The W m NCLBUTTONDOW. + /// </summary> + public const int WM_NCLBUTTONDOWN = 0xA1; + /// <summary> + /// The H t CAPTIO. + /// </summary> + public const int HT_CAPTION = 0x2; + + /// <summary> + /// The is dialog. + /// </summary> + public bool IsDialog = false; + + + [DllImportAttribute("user32.dll")] + /// <summary> + /// Sends the message. + /// </summary> + /// <returns>The message.</returns> + /// <param name="hWnd">H window.</param> + /// <param name="Msg">Message.</param> + /// <param name="wParam">W parameter.</param> + /// <param name="lParam">L parameter.</param> + public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); + [DllImportAttribute("user32.dll")] + /// <summary> + /// Releases the capture. + /// </summary> + /// <returns>The capture.</returns> + public static extern bool ReleaseCapture(); + + /// <summary> + /// Pnltitles the mouse move. + /// </summary> + /// <returns>The mouse move.</returns> + /// <param name="sender">Sender.</param> + /// <param name="e">E.</param> + private void pnltitle_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left && Shiftorium.UpgradeInstalled("draggable_windows")) + { + ReleaseCapture(); + SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); + } + } + + /// <summary> + /// Pnltitles the paint. + /// </summary> + /// <returns>The paint.</returns> + /// <param name="sender">Sender.</param> + /// <param name="e">E.</param> + private void pnltitle_Paint(object sender, PaintEventArgs e) { + + } + + /// <summary> + /// Lbtitletexts the mouse move. + /// </summary> + /// <returns>The mouse move.</returns> + /// <param name="sender">Sender.</param> + /// <param name="e">E.</param> + private void lbtitletext_MouseMove(object sender, MouseEventArgs e) { + pnltitle_MouseMove(sender, e); + } + } +} |
