using ComPDFKit.Controls.PDFControl; 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.IO; using System.ComponentModel; using System.Resources; using System.Runtime.CompilerServices; using Dragablz; using ComPDFKit.Controls.Helper; using ComPDFKitViewer; using ComPDFKit.PDFDocument; using ComPDFKit.Controls.Data; using ComPDFKit.Controls.Common; using System.Reflection; using ComPDFKit.NativeMethod; using System.Threading; namespace PDFViewer { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window, INotifyPropertyChanged { #region Property private PDFViewControl passwordViewer; private string[] oldAndNewFilePath; public string AppInfo { get { return Assembly.GetExecutingAssembly().GetName().Name + " " + string.Join(".", Assembly.GetExecutingAssembly().GetName().Version.ToString().Split('.').Take(3)); } } #endregion public MainWindow() { InitializeComponent(); Loaded += MainWindow_Loaded; DataContext = this; } private void MainWindow_Loaded(object sender, RoutedEventArgs e) { PasswordUI.Closed -= PasswordUI_Closed; PasswordUI.Canceled -= PasswordUI_Canceled; PasswordUI.Confirmed -= PasswordUI_Confirmed; PasswordUI.Confirmed += PasswordUI_Confirmed; PasswordUI.Canceled += PasswordUI_Canceled; PasswordUI.Closed += PasswordUI_Closed; HomePageControl.OpenFileEvent -= OpenFileEventHandler; HomePageControl.OpenFileEvent += OpenFileEventHandler; TabControl.SelectionChanged -= TabControl_SelectionChanged; TabControl.SelectionChanged += TabControl_SelectionChanged; FirstLoadFile(); CPDFAnnotationData.Author = Properties.Settings.Default.DocumentAuthor; } private void FirstLoadFile() { if (Properties.Settings.Default.IsLoadLastFileNeeded) { if (LoadLastOpenedDocuments()) { TabControl.SelectedIndex = Properties.Settings.Default.LastSelectedFileIndex; if (TabControl.SelectedIndex == -1) { HomePageButton.IsToggled = true; } Properties.Settings.Default.IsLoadLastFileNeeded = false; Properties.Settings.Default.Save(); } else { HomePageButton.IsToggled = true; } } HomePageButton.IsToggled = true; } private bool LoadLastOpenedDocuments() { if (Properties.Settings.Default.LastOpenedFiles != null && Properties.Settings.Default.LastOpenedFiles.Count > 0) { foreach (var filePath in Properties.Settings.Default.LastOpenedFiles) { TabControlLoadDocument(filePath); } return true; } return false; } private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) { var tabablz = sender as Dragablz.TabablzControl; if (tabablz.SelectedIndex != -1) { HomePageButton.IsToggled = false; } } private void OpenFileEventHandler(object sender, OpenFileEventArgs args) { if (args.OperationType == FileOperationType.OpenFileDirectly) { TabControlLoadDocument(args.FilePath, args.FeatureName); } else if (args.OperationType == FileOperationType.CreateNewFile) { bool confirmCreate = false; BlankPageSetting blankPageSetting = new BlankPageSetting(); CreateBlankPageSettingDialog createBlankPageSettingDialog = new CreateBlankPageSettingDialog() { Owner = this }; createBlankPageSettingDialog.CreateBlankPage += (o, setting) => { blankPageSetting = setting; confirmCreate = true; }; createBlankPageSettingDialog.ShowDialog(); if (!confirmCreate) { return; } TabItemExt tabItem = new TabItemExt(); MainPage viewPage = new MainPage(); CPDFDocument document = CPDFDocument.CreateDocument(); document.SetInfo(new CPDFInfo { Author = Properties.Settings.Default.DocumentAuthor, Creator = Assembly.GetExecutingAssembly().GetName().Name, CreationDate = DateTime.Now.ToString(), Subject = "Document", Producer = Assembly.GetExecutingAssembly().GetName().Name, Keywords = "Document", Version = string.Join(".", Assembly.GetExecutingAssembly().GetName().Version.ToString().Split('.').Take(3)) }); document.InsertPage(0, (float)(blankPageSetting.Size.Width * 7.2 / 2.54), (float)(blankPageSetting.Size.Height * 7.2 / 2.54), ""); if (blankPageSetting.Orientation == Orientation.Horizontal) { document.RotatePage(0, 1); } viewPage.CheckExistBeforeOpenFileEvent -= ViewPage_CheckExistBeforeOpenFileEvent; viewPage.FileChangeEvent -= ViewPage_FileChangeEvent; viewPage.AfterSaveAsFileEvent -= ViewPage_AfterSaveAsFileEvent; viewPage.CheckExistBeforeOpenFileEvent += ViewPage_CheckExistBeforeOpenFileEvent; viewPage.FileChangeEvent += ViewPage_FileChangeEvent; viewPage.AfterSaveAsFileEvent += ViewPage_AfterSaveAsFileEvent; viewPage.InitWithDocument(document); tabItem.Content = viewPage; tabItem.IsSelected = true; tabItem.FileName = "Blank Page.pdf"; tabItem.Tag = "Blank Page.pdf"; TabControl.Items.Add(tabItem); viewPage.CanSave = true; } else { string filePath = CommonHelper.GetExistedPathOrEmpty(); if (filePath != string.Empty) { TabControlLoadDocument(filePath); } } } private void ViewPage_AfterSaveAsFileEvent(object sender, string e) { if (sender is MainPage mainPage) { var tabItem = (from object t in TabControl.Items select t as TabItemExt).FirstOrDefault(item => Equals(item.Content, mainPage)); if (tabItem != null) { tabItem.FileName = Path.GetFileName(e); tabItem.Tag = e; } mainPage.GetPDFViewControl().GetCPDFViewer().CloseDocument(); mainPage.GetPDFViewControl().InitDocument(e); App.OpenedFilePathList.Add(e); } } private void TabControlLoadDocument(string filePath, string featureName = "") { if (App.OpenedFilePathList.Contains(filePath)) { for (int i = 0; i < App.Current.Windows.Count; i++) { MainWindow win = App.Current.Windows[i] as MainWindow; if (win != null) { var items = win.TabControl.Items; foreach (TabItemExt item in items) { if (item.Tag.ToString().ToLower() == filePath.ToLower()) { win.Activate(); item.IsSelected = true; (item.Content as MainPage).SetFeatureMode(featureName); return; } } } } } TabItemExt tabItem = new TabItemExt(); MainPage viewPage = new MainPage(); viewPage.CheckExistBeforeOpenFileEvent -= ViewPage_CheckExistBeforeOpenFileEvent; viewPage.FileChangeEvent -= ViewPage_FileChangeEvent; viewPage.AfterSaveAsFileEvent -= ViewPage_AfterSaveAsFileEvent; viewPage.CheckExistBeforeOpenFileEvent += ViewPage_CheckExistBeforeOpenFileEvent; viewPage.FileChangeEvent += ViewPage_FileChangeEvent; viewPage.AfterSaveAsFileEvent += ViewPage_AfterSaveAsFileEvent; passwordViewer = new PDFViewControl(); passwordViewer.InitDocument(filePath); if (passwordViewer != null && passwordViewer.PDFViewTool != null) { CPDFViewer tempViewer = passwordViewer.PDFViewTool.GetCPDFViewer(); CPDFDocument pdfDoc = tempViewer?.GetDocument(); if (pdfDoc == null) { MessageBox.Show("Open File Failed"); return; } if (pdfDoc.IsLocked) { PasswordUI.SetShowText(System.IO.Path.GetFileName(filePath) + " " + LanguageHelper.CommonManager.GetString("Tip_Encrypted")); PasswordUI.ClearPassword(); PopupBorder.Visibility = Visibility.Visible; PasswordUI.Visibility = Visibility.Visible; } else { viewPage.InitWithFilePath(filePath); tabItem.Content = viewPage; tabItem.IsSelected = true; tabItem.FileName = Path.GetFileName(filePath); tabItem.Tag = filePath; App.OpenedFilePathList.Add(filePath); TabControl.Items.Add(tabItem); viewPage.Loaded += (sender, e) => { viewPage.SetFeatureMode(featureName); }; } } } private void PasswordUI_Closed(object sender, EventArgs e) { PopupBorder.Visibility = Visibility.Collapsed; PasswordUI.Visibility = Visibility.Collapsed; } private void PasswordUI_Canceled(object sender, EventArgs e) { PopupBorder.Visibility = Visibility.Collapsed; PasswordUI.Visibility = Visibility.Collapsed; } private void PasswordUI_Confirmed(object sender, string e) { if (passwordViewer != null && passwordViewer.PDFViewTool != null) { CPDFViewer tempViewer=passwordViewer.PDFViewTool.GetCPDFViewer(); CPDFDocument pdfDoc=tempViewer?.GetDocument(); if(pdfDoc==null) { return; } pdfDoc.UnlockWithPassword(e); if (pdfDoc.IsLocked == false) { PasswordUI.SetShowError("", Visibility.Collapsed); PasswordUI.ClearPassword(); PasswordUI.Visibility = Visibility.Collapsed; PopupBorder.Visibility = Visibility.Collapsed; string filePath = pdfDoc.FilePath; TabItemExt tabItem = new TabItemExt(); MainPage viewPage = new MainPage(); tabItem.Content = viewPage; tabItem.IsSelected = true; tabItem.FileName = Path.GetFileName(filePath); tabItem.Tag = filePath; viewPage.SetPDFViewer(passwordViewer); App.OpenedFilePathList.Add(filePath); TabControl.Items.Add(tabItem); } else { PasswordUI.SetShowError("error", Visibility.Visible); } } } private void ViewPage_FileChangeEvent(object sender, EventArgs e) { for (int i = 0; i < App.Current.Windows.Count; i++) { MainWindow win = App.Current.Windows[i] as MainWindow; if (win != null) { var items = win.TabControl.Items; foreach (TabItemExt item in items) { if (item.Tag.ToString().ToLower() == oldAndNewFilePath[1].ToLower()) { item.IsSelected = true; item.FileName = Path.GetFileName(oldAndNewFilePath[0]); item.IsSelected = true; item.Tag = oldAndNewFilePath[0]; } } } } for (int i = 0; i < App.OpenedFilePathList.Count; i++) { if (oldAndNewFilePath[1].ToLower() == App.OpenedFilePathList[i].ToLower()) { App.OpenedFilePathList[i] = oldAndNewFilePath[0]; break; } } } private bool ViewPage_CheckExistBeforeOpenFileEvent(string[] arg) { if (App.OpenedFilePathList.Contains(arg[0])) { for (int i = 0; i < App.Current.Windows.Count; i++) { MainWindow win = App.Current.Windows[i] as MainWindow; if (win != null) { var items = win.TabControl.Items; foreach (TabItemExt item in items) { if (item.Tag.ToString().ToLower() == arg[0].ToLower()) { win.Activate(); item.IsSelected = true; return true; } } } } } oldAndNewFilePath = arg; return false; } public class TabItemExt : TabItem, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private string _fileName; public string FileName { get { return _fileName; } set { if (_fileName != value) { _fileName = value; OnPropertyChanged(); } } } public void OnPropertyChanged([CallerMemberName] string name = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); } //protected override void OnSelected(RoutedEventArgs e) //{ // string filePath = Tag?.ToString(); // if (!string.IsNullOrEmpty(filePath) && File.Exists(filePath)) // { // this.IsSelected = true; // } //} } private DragablzItem FindParentDragablzItem(DependencyObject element) { while (element != null && !(element is DragablzItem)) { element = VisualTreeHelper.GetParent(element); } return element as DragablzItem; } private TabControl FindParentTabControl(DependencyObject element) { while (element != null && !(element is TabControl)) { element = VisualTreeHelper.GetParent(element); } return element as TabControl; } private void CloseFileButton_Click(object sender, RoutedEventArgs e) { var button = sender as Button; var dragablzItem = FindParentDragablzItem(button); var tabControl = FindParentTabControl(dragablzItem); MainPage mainPage = (dragablzItem.Content as TabItemExt).Content as MainPage; if (mainPage == null) { return; } if (mainPage.CanSave) { string fileName = (dragablzItem.Content as TabItemExt).FileName; var message = fileName + " " + LanguageHelper.CommonManager.GetString("Warn_NotSave"); var result = MessageBox.Show(message, LanguageHelper.CommonManager.GetString("Caption_Warning"), MessageBoxButton.YesNoCancel, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { mainPage.SaveFile(); App.OpenedFilePathList.Remove((dragablzItem.Content as TabItemExt).Tag.ToString()); tabControl.Items.Remove(dragablzItem.Content); } else if (result == MessageBoxResult.No) { App.OpenedFilePathList.Remove((dragablzItem.Content as TabItemExt).Tag.ToString()); tabControl.Items.Remove(dragablzItem.Content); } else { } } else { App.OpenedFilePathList.Remove((dragablzItem.Content as TabItemExt).Tag.ToString()); tabControl.Items.Remove(dragablzItem.Content); } if (tabControl.Items.Count == 0) { HomePageButton.IsToggled = true; } } private void DefaultAddButton_Click(object sender, RoutedEventArgs e) { string filePath = CommonHelper.GetExistedPathOrEmpty(); if (filePath != string.Empty) { TabControlLoadDocument(filePath); } } private void MinimizeButton_Click(object sender, RoutedEventArgs e) { SystemCommands.MinimizeWindow(this); } private void MaximizeRestoreButton_Click(object sender, RoutedEventArgs e) { if (this.WindowState == WindowState.Maximized) { SystemCommands.RestoreWindow(this); } else { SystemCommands.MaximizeWindow(this); } } private void CloseButton_Click(object sender, RoutedEventArgs e) { int count = TabControl.Items.Count; while (count > 0) { TabItemExt item = TabControl.Items[0] as TabItemExt; MainPage mainPage = item.Content as MainPage; if (mainPage == null) { count--; continue; } if (mainPage.CanSave) { string fileName = item.FileName; var message = fileName + " " + LanguageHelper.CommonManager.GetString("Warn_NotSave"); var result = MessageBox.Show(message, LanguageHelper.CommonManager.GetString("Caption_Warning"), MessageBoxButton.YesNoCancel, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { mainPage.SaveFile(); App.OpenedFilePathList.Remove(item.Tag.ToString()); TabControl.Items.Remove(item); count--; } else if (result == MessageBoxResult.No) { App.OpenedFilePathList.Remove(item.Tag.ToString()); TabControl.Items.Remove(item); count--; } else { break; } } else { App.OpenedFilePathList.Remove(item.Tag.ToString()); TabControl.Items.Remove(item); count--; } } if (count == 0) { SystemCommands.CloseWindow(this); } } private void SettingsBtn_Click(object sender, RoutedEventArgs e) { SettingsDialog settingsDialog = new SettingsDialog(); settingsDialog.LanguageChanged -= SettingsDialog_LanguageChanged; settingsDialog.LanguageChanged += SettingsDialog_LanguageChanged; settingsDialog.Owner = this; settingsDialog.ShowDialog(); } private void SettingsDialog_LanguageChanged(object sender, string e) { foreach (var tab in TabControl.Items) { var item = tab as TabItemExt; if (item?.Content is MainPage mainPage) { if (mainPage.CanSave) { string fileName = item.FileName; var message = fileName + " " + LanguageHelper.CommonManager.GetString("Warn_NotSave"); var result = MessageBox.Show(message, LanguageHelper.CommonManager.GetString("Caption_Warning"), MessageBoxButton.YesNoCancel, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { mainPage.SaveFile(); } else { break; } } mainPage.GetPDFViewControl().GetCPDFViewer().CloseDocument(); } } if (Properties.Settings.Default.LastOpenedFiles == null) { Properties.Settings.Default.LastOpenedFiles = new System.Collections.Specialized.StringCollection(); } Properties.Settings.Default.LastOpenedFiles.Clear(); foreach (var filePath in App.OpenedFilePathList) { Properties.Settings.Default.LastOpenedFiles.Add(filePath); } Properties.Settings.Default.LastSelectedFileIndex = TabControl.SelectedIndex; Properties.Settings.Default.IsLoadLastFileNeeded = true; Properties.Settings.Default.Save(); System.Diagnostics.Process.Start(Application.ResourceAssembly.Location); this.Close(); } private void HomePageButton_Toggled(object sender, RoutedEventArgs e) { if (sender is HomePageButton homePageButton && homePageButton.IsToggled) { TabControl.SelectedIndex = -1; } else { TabControl.SelectedIndex = 0; } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } protected bool UpdateProper(ref T properValue, T newValue, [CallerMemberName] string properName = "") { if (object.Equals(properValue, newValue)) return false; properValue = newValue; OnPropertyChanged(properName); return true; } private bool HomePageButton_QueryLock(object sender, HomePageButton.QueryLockEventArgs e) { return TabControl.Items.Count <= 0; } } }