399 lines
13 KiB
C#
399 lines
13 KiB
C#
/*
|
|
* 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.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Data;
|
|
using System.Windows.Documents;
|
|
using System.Windows.Forms.Integration;
|
|
using System.Windows.Input;
|
|
using System.Windows.Media;
|
|
using System.Windows.Media.Imaging;
|
|
using System.Windows.Navigation;
|
|
using System.Windows.Shapes;
|
|
using ShiftOS.Engine;
|
|
using static ShiftOS.Engine.SkinEngine;
|
|
|
|
namespace ShiftOS.Wpf
|
|
{
|
|
/// <summary>
|
|
/// Interaction logic for WpfWindowBorder.xaml
|
|
/// </summary>
|
|
public partial class WpfWindowBorder : UserControl, IWindowBorder
|
|
{
|
|
private bool _isWPF = true;
|
|
|
|
public WpfWindowBorder(IShiftOSWindow ctrl)
|
|
{
|
|
InitializeComponent();
|
|
if (ctrl is UserControl)
|
|
{
|
|
_parent = ctrl as UserControl;
|
|
_isWPF = true;
|
|
}
|
|
else if (ctrl is System.Windows.Forms.UserControl)
|
|
{
|
|
_isWPF = false;
|
|
_wParent = ctrl as System.Windows.Forms.UserControl;
|
|
_wParent.Show();
|
|
}
|
|
Shiftorium.Installed += () =>
|
|
{
|
|
SetupUpgradeables();
|
|
ParentWindow.OnUpgrade();
|
|
};
|
|
SkinEngine.SkinLoaded += () =>
|
|
{
|
|
SetupSkin();
|
|
ParentWindow.OnSkinLoad();
|
|
};
|
|
SaveSystem.GameReady += () =>
|
|
{
|
|
Dispatcher.Invoke(() =>
|
|
{
|
|
SetupUpgradeables();
|
|
SetupSkin();
|
|
});
|
|
};
|
|
if (_isWPF)
|
|
{
|
|
this.Width = borderleft.Width + _parent.Width + borderright.Width;
|
|
this.Height = titlemaster.Height + _parent.Height + borderbottom.Height;
|
|
pgcontents.Content = _parent;
|
|
}
|
|
else
|
|
{
|
|
pgcontents.Width = _wParent.Width;
|
|
pgcontents.Height = _wParent.Height;
|
|
|
|
this.Width = borderleft.Width + _wParent.Width + borderright.Width;
|
|
this.Height = titlemaster.Height + _wParent.Height + borderbottom.Height;
|
|
pgcontents.Content = new WindowsFormsHost();
|
|
(pgcontents.Content as WindowsFormsHost).Child = _wParent;
|
|
_wParent.DoWinformsSkinningMagicOnWpf();
|
|
}
|
|
Desktop.ShowWindow(this);
|
|
SetupUpgradeables();
|
|
Loaded += (o,a) =>
|
|
{
|
|
SetupSkin();
|
|
ParentWindow.OnSkinLoad();
|
|
ParentWindow.OnLoad();
|
|
};
|
|
|
|
if (!_isWPF)
|
|
{
|
|
_wParent.TextChanged += (o, a) =>
|
|
{
|
|
this.Text = _wParent.Text;
|
|
};
|
|
this.Text = _wParent.Text;
|
|
}
|
|
}
|
|
|
|
private System.Windows.Forms.UserControl _wParent = null;
|
|
|
|
public void SetupUpgradeables()
|
|
{
|
|
close.Upgrade("close_button");
|
|
max.Upgrade("maximize_button");
|
|
min.Upgrade("minimize_button");
|
|
|
|
titlemaster.Upgrade("wm_titlebar");
|
|
|
|
borderleft.Upgrade("wm_free_placement");
|
|
borderright.Upgrade("wm_free_placement");
|
|
borderbottom.Upgrade("wm_free_placement");
|
|
borderbottoml.Upgrade("wm_free_placement");
|
|
borderbottomr.Upgrade("wm_free_placement");
|
|
|
|
|
|
}
|
|
|
|
public void SetupSkin()
|
|
{
|
|
if (LoadedSkin.ShowTitleCorners)
|
|
{
|
|
titleleft.Visibility = Visibility.Visible;
|
|
titleright.Visibility = Visibility.Visible;
|
|
}
|
|
else
|
|
{
|
|
titleleft.Visibility = Visibility.Hidden;
|
|
titleright.Visibility = Visibility.Hidden;
|
|
}
|
|
|
|
try
|
|
{
|
|
_parent.Background = LoadedSkin.ControlColor.CreateBrush();
|
|
_parent.Foreground = LoadedSkin.ControlTextColor.CreateBrush();
|
|
}
|
|
catch
|
|
{
|
|
_wParent.BackColor = LoadedSkin.ControlColor;
|
|
_wParent.ForeColor = LoadedSkin.ControlTextColor;
|
|
}
|
|
|
|
|
|
titlemaster.Height = LoadedSkin.TitlebarHeight;
|
|
if(LoadedSkin.TitleTextCentered == true)
|
|
{
|
|
titletext.SetValue(Canvas.LeftProperty, (double)(titlemaster.ActualWidth - titletext.ActualWidth) / 2);
|
|
titletext.SetValue(Canvas.TopProperty, (double)LoadedSkin.TitleTextLeft.Y);
|
|
}
|
|
else
|
|
{
|
|
titletext.SetValue(Canvas.LeftProperty, (double)LoadedSkin.TitleTextLeft.X);
|
|
titletext.SetValue(Canvas.TopProperty, (double)LoadedSkin.TitleTextLeft.Y);
|
|
}
|
|
|
|
titletext.SetFont(LoadedSkin.TitleFont);
|
|
|
|
titletext.Foreground = LoadedSkin.TitleTextColor.CreateBrush();
|
|
|
|
titlebar.Background = LoadedSkin.TitleBackgroundColor.CreateBrush();
|
|
|
|
close.SetValue(Canvas.LeftProperty, this.ActualWidth - LoadedSkin.CloseButtonSize.Width - LoadedSkin.CloseButtonFromSide.X);
|
|
close.SetValue(Canvas.TopProperty, (double)LoadedSkin.CloseButtonFromSide.Y);
|
|
|
|
min.SetValue(Canvas.LeftProperty, this.ActualWidth - LoadedSkin.MinimizeButtonSize.Width - LoadedSkin.MinimizeButtonFromSide.X);
|
|
min.SetValue(Canvas.TopProperty, (double)LoadedSkin.MinimizeButtonFromSide.Y);
|
|
|
|
max.SetValue(Canvas.LeftProperty, this.ActualWidth - LoadedSkin.MaximizeButtonSize.Width - LoadedSkin.MaximizeButtonFromSide.X);
|
|
max.SetValue(Canvas.TopProperty, (double)LoadedSkin.MaximizeButtonFromSide.Y);
|
|
|
|
close.Background = LoadedSkin.CloseButtonColor.CreateBrush();
|
|
min.Background = LoadedSkin.MinimizeButtonColor.CreateBrush();
|
|
max.Background = LoadedSkin.MaximizeButtonColor.CreateBrush();
|
|
|
|
close.BorderThickness = new Thickness(0.0);
|
|
min.BorderThickness = new Thickness(0.0);
|
|
max.BorderThickness = new Thickness(0.0);
|
|
|
|
borderleft.Background = LoadedSkin.BorderLeftBackground.CreateBrush();
|
|
borderright.Background = LoadedSkin.BorderRightBackground.CreateBrush();
|
|
borderbottom.Background = LoadedSkin.BorderBottomBackground.CreateBrush();
|
|
borderbottoml.Background = LoadedSkin.BorderBottomLeftBackground.CreateBrush();
|
|
borderbottomr.Background = LoadedSkin.BorderBottomRightBackground.CreateBrush();
|
|
|
|
borderleft.Width = LoadedSkin.LeftBorderWidth;
|
|
borderright.Width = LoadedSkin.RightBorderWidth;
|
|
bottommaster.Height = LoadedSkin.BottomBorderWidth;
|
|
|
|
}
|
|
|
|
|
|
protected override Size MeasureOverride(Size constraint)
|
|
{
|
|
int topHeight = 0;
|
|
int bottomHeight = 0;
|
|
int leftHeight = 0;
|
|
int rightHeight = 0;
|
|
|
|
if (Shiftorium.UpgradeInstalled("wm_titlebar"))
|
|
topHeight = LoadedSkin.TitlebarHeight;
|
|
if (Shiftorium.UpgradeInstalled("wm_free_placement"))
|
|
{
|
|
bottomHeight = LoadedSkin.BottomBorderWidth;
|
|
leftHeight = LoadedSkin.LeftBorderWidth;
|
|
rightHeight = LoadedSkin.RightBorderWidth;
|
|
}
|
|
|
|
if (_isWPF)
|
|
{
|
|
return new Size(
|
|
leftHeight + _parent.Width + rightHeight,
|
|
topHeight + _parent.Height + bottomHeight);
|
|
|
|
}
|
|
else
|
|
{
|
|
return new Size(
|
|
leftHeight + _wParent.Width + rightHeight,
|
|
topHeight + _wParent.Height + bottomHeight);
|
|
}
|
|
}
|
|
|
|
public double ActualActualHeight
|
|
{
|
|
get
|
|
{
|
|
int topHeight = 0;
|
|
int bottomHeight = 0;
|
|
|
|
if (Shiftorium.UpgradeInstalled("wm_titlebar"))
|
|
topHeight = LoadedSkin.TitlebarHeight;
|
|
if (Shiftorium.UpgradeInstalled("wm_free_placement"))
|
|
{
|
|
bottomHeight = LoadedSkin.BottomBorderWidth;
|
|
}
|
|
|
|
if (_isWPF)
|
|
{
|
|
return (topHeight + _parent.Height + bottomHeight);
|
|
|
|
}
|
|
else
|
|
{
|
|
return (topHeight + _wParent.Height + bottomHeight);
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool _isDialog = false;
|
|
|
|
public bool IsDialog
|
|
{
|
|
get
|
|
{
|
|
return _isDialog;
|
|
}
|
|
set
|
|
{
|
|
_isDialog = value;
|
|
SetupDialog();
|
|
}
|
|
}
|
|
|
|
public void SetupDialog()
|
|
{
|
|
if (IsDialog)
|
|
{
|
|
min.Upgrade("minimize_button");
|
|
max.Upgrade("maximize_button");
|
|
}
|
|
else
|
|
{
|
|
min.Visibility = Visibility.Collapsed;
|
|
max.Visibility = Visibility.Collapsed;
|
|
}
|
|
}
|
|
|
|
private UserControl _parent = null;
|
|
|
|
public IShiftOSWindow ParentWindow
|
|
{
|
|
get
|
|
{
|
|
if (_isWPF)
|
|
{
|
|
return (IShiftOSWindow)_parent;
|
|
}
|
|
else
|
|
{
|
|
return (IShiftOSWindow)_wParent;
|
|
}
|
|
}
|
|
|
|
set
|
|
{
|
|
if (_isWPF)
|
|
{
|
|
_parent = (UserControl)value;
|
|
}
|
|
else
|
|
{
|
|
_wParent = (System.Windows.Forms.UserControl)value;
|
|
(this.pgcontents.Content as WindowsFormsHost).Child = _wParent;
|
|
}
|
|
}
|
|
}
|
|
|
|
public string Text
|
|
{
|
|
get
|
|
{
|
|
return titletext.Text;
|
|
}
|
|
|
|
set
|
|
{
|
|
titletext.Text = value;
|
|
}
|
|
}
|
|
|
|
public void Close()
|
|
{
|
|
Desktop.RemoveWindow(this);
|
|
}
|
|
|
|
private void close_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
this.Close();
|
|
}
|
|
|
|
private void max_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
AppearanceManager.Maximize(this);
|
|
}
|
|
|
|
private void min_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
AppearanceManager.Minimize(this);
|
|
}
|
|
|
|
private Point currentPoint;
|
|
private TranslateTransform transform = new TranslateTransform();
|
|
private Point anchorPoint;
|
|
|
|
private void titlebar_MouseDown(object sender, MouseEventArgs e)
|
|
{
|
|
if (Shiftorium.UpgradeInstalled("draggable_windows") && isInDrag == true)
|
|
{
|
|
var element = sender as FrameworkElement;
|
|
currentPoint = e.GetPosition(null);
|
|
|
|
transform.X += (currentPoint.X - anchorPoint.X);
|
|
transform.Y += (currentPoint.Y - anchorPoint.Y);
|
|
this.RenderTransform = transform;
|
|
anchorPoint = currentPoint;
|
|
if(_isWPF == false)
|
|
{
|
|
_wParent.Refresh();
|
|
(pgcontents.Content as WindowsFormsHost).InvalidateVisual();
|
|
}
|
|
}
|
|
}
|
|
|
|
bool isInDrag = false;
|
|
|
|
private void titlebar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
var element = sender as FrameworkElement;
|
|
anchorPoint = e.GetPosition(null);
|
|
isInDrag = true;
|
|
e.Handled = true;
|
|
}
|
|
|
|
private void titlebar_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
|
{
|
|
isInDrag = false;
|
|
}
|
|
}
|
|
}
|