using PDF_Master.ViewModels;
using Prism.Regions;
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.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Prism.Events;
using PDF_Master.EventAggregators;
using PDF_Master.CustomControl;
using Prism.Ioc;
using PDF_Master.Helper;
using System.IO;
using ComPDFKit.PDFDocument;
using PDFSettings;
using PDF_Master.Properties;
using System.Windows.Interop;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Diagnostics;
namespace PDF_Master.Views
{
///
/// MainWindow.xaml 的交互逻辑
///
public partial class MainWindow : Window
{
public IEventAggregator aggregator;
public IRegionManager region;
///
/// 窗口大小是否改变
///
private bool sizeChange = false;
public MainWindow()
{
InitializeComponent();
this.SourceInitialized += MainWindow_SourceInitialized;
System.Windows.Forms.Application.EnableVisualStyles();
}
private void MainWindow_SourceInitialized(object sender, EventArgs e)
{
try
{
//限制应用多开,显示已有窗体或者直接打开文件
IntPtr hwnd = new WindowInteropHelper(this).Handle;
HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc));
}
catch { }
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == App.MsgId)
{
try
{
int msgLength = (int)(lParam);
IntPtr mapHandle = Win32Helper.OpenFileMapping((int)Win32Helper.FileMapAccessType.Read, 0, "Global\\sharePathNotify");
IntPtr readPtr = Win32Helper.MapViewOfFileEx(mapHandle, Win32Helper.FileMapAccessType.Read, 0, 0, UIntPtr.Zero, IntPtr.Zero);
string filePath = Marshal.PtrToStringAuto(readPtr, msgLength);
Win32Helper.UnmapViewOfFile(readPtr);
Win32Helper.CloseHandle(mapHandle);
MD5 currMd5 = MD5.Create();
byte[] hashArray = currMd5.ComputeHash(Encoding.Default.GetBytes(filePath));
StringBuilder hexBuilder = new StringBuilder();
foreach (byte code in hashArray)
{
hexBuilder.AppendFormat("{0:X2}", code);
}
IntPtr waitPtr = Win32Helper.OpenEvent(0x0002, false, "Global\\shareWaitNotify" + hexBuilder.ToString());
if (waitPtr != IntPtr.Zero)
{
Win32Helper.SetEvent(waitPtr);
Win32Helper.CloseHandle(waitPtr);
}
if (File.Exists(filePath))
{
//打开传过来的文件路径
if (App.OpenedFileList.Contains(filePath))
{
//如果已经打开时,则选中文档所在页签
App.mainWindowViewModel.SelectItem(filePath);
}
else
{
(this.DataContext as MainWindowViewModel).AddTabItem(filePath);
}
if (WindowState == WindowState.Minimized)
{
WindowState = WindowState.Normal;
}
Activate();
}
}
catch
{
}
handled = true;
return (IntPtr)(1);
}
if (msg == App.WakeId || msg == App.WebopenexpiredId)
{
//将现有窗口激活 并前置
try
{
Activate();
//最小化后激活
if (this.WindowState == WindowState.Minimized)
{
System.Windows.SystemCommands.RestoreWindow(this);
}
//窗体前置
Topmost = true;
Topmost = false;
ServiceHelper.GetUser();
if (msg == App.WebopenexpiredId)
{
if (App.IsLogin == true && App.UserOpen == false)
{
App.mainWindowViewModel.OpenUser();
App.WebOpencase = "";
}
else if (App.IsLogin == false && App.LoginOpen == false)
{
App.mainWindowViewModel.OpenLogin();
App.WebOpencase = "";
}
}
handled = true;
}
catch
{
}
return (IntPtr)(1);
}
return IntPtr.Zero;
}
///
/// 此类因为Dragablz控件的原因需要特殊处理
///
///
public MainWindow(IEventAggregator eventAggregator, IContainerProvider container) : this()
{
aggregator = eventAggregator;
eventAggregator?.GetEvent().Publish(new DragablzWindowEventArgs() { TabControl = TabablzControl, Type = DragablzWindowEventType.Opened });
}
private void BtnMiniSize_Click(object sender, RoutedEventArgs e)
{
System.Windows.SystemCommands.MinimizeWindow(this);
}
private void BtnClose_Click(object sender, RoutedEventArgs e)
{
System.Windows.SystemCommands.CloseWindow(this);
}
private void BtnReStore_Click(object sender, RoutedEventArgs e)
{
if (this.WindowState == WindowState.Maximized)
{
System.Windows.SystemCommands.RestoreWindow(this);
}
else
{
System.Windows.SystemCommands.MaximizeWindow(this);
}
}
private async void Window_Activated(object sender, EventArgs e)
{
App.Current.MainWindow = this;
App.mainWindowViewModel = this.DataContext as MainWindowViewModel;
aggregator?.GetEvent().Publish(new DragablzWindowEventArgs() { TabControl = TabablzControl, Type = DragablzWindowEventType.Activated });
//只需要第一次激活时获取一次信息
if (App.IsFirstOpen)
{
//判断本地有没有token,没有显示登录,有再判断登录状态
if (Settings.Default.AppProperties.LoginToken != "")
{
string code = ServiceHelper.GetUser();
if (code == "330" || code == "304")
{
App.mainWindowViewModel.UpgradeVis = Visibility.Visible;
App.mainWindowViewModel.LoginVis = Visibility.Visible;
App.mainWindowViewModel.RegisterVis = Visibility.Collapsed;
App.mainWindowViewModel.OphVis = Visibility.Visible;
if (Settings.Default.UserDate.IsLoginoff == false)
{
App.mainWindowViewModel.OpenLoginoff();
Settings.Default.UserDate.IsLoginoff = true;
Settings.Default.Save();
}
}
else
{
App.IsLogin = true;
App.mainWindowViewModel.Useremailchar = Settings.Default.UserDate.Email.Substring(0, 1);
App.mainWindowViewModel.UserVis = Visibility.Visible;
}
}
else if (Settings.Default.UserDate.Email != "")
{
App.mainWindowViewModel.UpgradeVis = Visibility.Visible;
App.mainWindowViewModel.LoginVis = Visibility.Visible;
App.mainWindowViewModel.RegisterVis = Visibility.Collapsed;
App.mainWindowViewModel.OphVis = Visibility.Visible;
}
else
{
App.mainWindowViewModel.UpgradeVis = Visibility.Visible;
App.mainWindowViewModel.RegisterVis = Visibility.Visible;
App.mainWindowViewModel.LoginVis = Visibility.Collapsed;
App.mainWindowViewModel.OphVis = Visibility.Visible;
}
App.IsFirstOpen = false;
}
//控制首页UPgrade按钮的显示与否
if (Settings.Default.UserDate.subscribestatus == 1)
{
App.mainWindowViewModel.UpgradeVis = Visibility.Collapsed;
}
else
{
App.mainWindowViewModel.UpgradeVis = Visibility.Visible;
}
//设为默认浏览器后,外部点击文档打开
if (App.NeedOpenFilePathList.Count != 0)
{
for (int i = 0; i < App.NeedOpenFilePathList.Count; i++)
{
(this.DataContext as MainWindowViewModel).AddTabItem(App.NeedOpenFilePathList[i]);
await Task.Delay(50);
}
App.NeedOpenFilePathList.Clear();
}
}
private void Window_Closed(object sender, EventArgs e)
{
aggregator?.GetEvent().Publish(new DragablzWindowEventArgs() { TabControl = TabablzControl, Type = DragablzWindowEventType.Closed });
}
public void LoadPdfViewer(string[] filePaths)
{
var content = App.mainWindowViewModel.SelectedItem.DataContext as MainContentViewModel;
if (filePaths.Count() == 1)
{
if (App.OpenedFileList.Contains(filePaths[0]))
{
App.mainWindowViewModel.SelectItem(filePaths[0]);
}
else
{
content.OpenFile(filePaths[0]);
}
ToolMethod.SetFileThumbImg(filePaths[0]);
}
else
{
var fileList = filePaths.ToList().Where(x => !App.OpenedFileList.Exists(y => y == x)).ToList();
if (fileList.Count <= 0)
return;
content.OpenFile(filePaths[0]);
for (int i = 1; i < fileList.Count(); i++)
{
if (!App.OpenedFileList.Contains(fileList[i]))
{
App.mainWindowViewModel.AddTabItem(fileList[i]);
}
ToolMethod.SetFileThumbImg(fileList[i]);
}
}
Settings.Default.Save();
}
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (this.WindowState == WindowState.Maximized)
{
ico_max.Visibility = Visibility.Collapsed;
}
else
{
ico_max.Visibility = Visibility.Visible;
}
UpdateTitleMargin();
if (this.ActualWidth != 1280)
{
sizeChange = true;
}
}
///
/// 更新添加按钮的间隔位置
///
private void UpdateTitleMargin()
{
var width = StkPnlRight.ActualWidth;
double width1 = this.ActualWidth;
double width2 = TabablzControl.ActualWidth;
if (BorderUpgrade.Visibility == Visibility.Collapsed)
{
BtnAdd.Margin = new Thickness(8, 13, width, 7);
Trace.WriteLine("BorderUpgrade.Collapsed " + width1);
Trace.WriteLine("BorderUpgrade.Collapsed " + width2);
Trace.WriteLine("BorderUpgrade.Collapsed " + width);
}
else
{
Trace.WriteLine("BorderUpgrade.Visibility " + width1);
Trace.WriteLine("BorderUpgrade.Visibility " + width2);
Trace.WriteLine("BorderUpgrade.Visibility " + width);
if (this.WindowState == WindowState.Maximized)
{
BtnAdd.Margin = new Thickness(8, 13, width, 7);
}
else
{
if (sizeChange)
{
BtnAdd.Margin = new Thickness(8, 13, width, 7);
}
else
{
sizeChange = false;
BtnAdd.Margin = new Thickness(8, 13, width + 50, 7);
}
}
}
TabablzControl.UpdateLayout();
}
private void TxtRename_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
TabablzControl.Focus();
}
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (!(DataContext as MainWindowViewModel).closeAllTabItem())
{
e.Cancel = true;
}
}
private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
//通过转移焦点来触发文本框失去焦点事件
var uiElement = FocusManager.GetFocusedElement(this);
if (uiElement != null)
{
var textBox = uiElement as TextBox;
//会影响页面编辑的下拉框选择 暂时注释
//if (textBox != null)
//{
// GridRoot.Focusable = true;
// GridRoot.Focus();
//}
}
}
private void Grid_Openhight_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
UpdateTitleMargin();
}
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
if (App.Current.Windows.Count <= 1)
{
//软件打开,第一个窗体加载时,回传事件
//放在主窗体的显示事件里,避免因网络请求问题导致启动缓慢
await Task.Run(() =>
{
//上传启动信息至服务端
ServiceHelper.CreateDeviceLog();
});
}
}
}
}