Browse Source

compdfkit(windows) - 多页签添加删除

liuaoran 1 year ago
parent
commit
6fba7e88c7

+ 3 - 0
compdfkit_demo_windows/compdfkit/compdfkit/App.xaml.cs

@@ -37,6 +37,9 @@ namespace compdfkit
     /// 
     public partial class App : Application
     {
+        static public bool DefaultPDFLoaded = false;
+        public static List<string> OpenedFilePathList = new List<string>();
+
         protected override void OnStartup(StartupEventArgs e)
         {
             string str = this.GetType().Assembly.Location;

+ 1 - 1
compdfkit_demo_windows/compdfkit/compdfkit/MainPage.xaml

@@ -320,7 +320,7 @@
                 <cpdfcommon:PageNumberControl Grid.Row="1" Name="FloatPageTool" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,20"></cpdfcommon:PageNumberControl>
             </Grid>
         </Grid>
-        <Border Name="PopupBorder" Background="#A0000000" Visibility="Collapsed">
+        <Border Name="PopupBorder" Background="#A0000000" Visibility="Collapsed" Grid.Row="2">
             <Grid>
                 <!--文件信息-->
                 <Grid Name="FileInfoUI"  Width="422" Height="680" HorizontalAlignment="Center" VerticalAlignment="Center" Background="White" Visibility="Collapsed">

+ 38 - 32
compdfkit_demo_windows/compdfkit/compdfkit/MainPage.xaml.cs

@@ -83,6 +83,8 @@ namespace compdfkit
         /// The last edit object
         /// </summary>
         private PDFEditEvent lastPDFEditEvent = null;
+
+        public event Func<string, bool> CheckExistBeforeOpenFileEvent;
         public event PropertyChangedEventHandler PropertyChanged;
          
         public MainPage()
@@ -99,48 +101,48 @@ namespace compdfkit
         }
 
         private void LoadDocument()
-        { 
-            pdfViewControl.PDFView?.Load();
-            pdfViewControl.PDFView?.SetShowLink(true);
-            PDFGrid.Child = pdfViewControl;
+        {
+                pdfViewControl.PDFView?.Load();
+                pdfViewControl.PDFView?.SetShowLink(true);
+                PDFGrid.Child = pdfViewControl;
 
-            pdfViewControl.PDFView.InfoChanged -= PdfViewer_InfoChanged;
-            pdfViewControl.PDFView.InfoChanged += PdfViewer_InfoChanged;
+                pdfViewControl.PDFView.InfoChanged -= PdfViewer_InfoChanged;
+                pdfViewControl.PDFView.InfoChanged += PdfViewer_InfoChanged;
 
-            pdfViewControl.PDFView.PDFEditCommandHandler -= PDFView_PDFEditCommandHandler;
-            pdfViewControl.PDFView.PDFEditCommandHandler += PDFView_PDFEditCommandHandler;
+                pdfViewControl.PDFView.PDFEditCommandHandler -= PDFView_PDFEditCommandHandler;
+                pdfViewControl.PDFView.PDFEditCommandHandler += PDFView_PDFEditCommandHandler;
 
-            pdfViewControl.PDFView.AnnotCommandHandler -= PDFView_AnnotCommandHandler;
-            pdfViewControl.PDFView.AnnotCommandHandler += PDFView_AnnotCommandHandler;
+                pdfViewControl.PDFView.AnnotCommandHandler -= PDFView_AnnotCommandHandler;
+                pdfViewControl.PDFView.AnnotCommandHandler += PDFView_AnnotCommandHandler;
 
-            pdfViewControl.PDFView.AnnotEditHandler -= PDFView_AnnotEditHandler;
-            pdfViewControl.PDFView.AnnotEditHandler += PDFView_AnnotEditHandler;
+                pdfViewControl.PDFView.AnnotEditHandler -= PDFView_AnnotEditHandler;
+                pdfViewControl.PDFView.AnnotEditHandler += PDFView_AnnotEditHandler;
 
-            pdfViewControl.PDFView.UndoManager.PropertyChanged -= UndoManager_PropertyChanged;
-            pdfViewControl.PDFView.UndoManager.PropertyChanged += UndoManager_PropertyChanged;
+                pdfViewControl.PDFView.UndoManager.PropertyChanged -= UndoManager_PropertyChanged;
+                pdfViewControl.PDFView.UndoManager.PropertyChanged += UndoManager_PropertyChanged;
 
-            pdfViewControl.PDFView.SetFormFieldHighlight(true);
+                pdfViewControl.PDFView.SetFormFieldHighlight(true);
 
-            PasswordUI.Closed -= PasswordUI_Closed;
-            PasswordUI.Closed += PasswordUI_Closed;
+                PasswordUI.Closed -= PasswordUI_Closed;
+                PasswordUI.Closed += PasswordUI_Closed;
 
-            PasswordUI.Canceled -= PasswordUI_Canceled;
-            PasswordUI.Confirmed += PasswordUI_Confirmed;
+                PasswordUI.Canceled -= PasswordUI_Canceled;
+                PasswordUI.Confirmed += PasswordUI_Confirmed;
 
-            PasswordUI.Confirmed -= PasswordUI_Confirmed;
-            PasswordUI.Canceled += PasswordUI_Canceled;
+                PasswordUI.Confirmed -= PasswordUI_Confirmed;
+                PasswordUI.Canceled += PasswordUI_Canceled;
 
-            CPDFSaclingControl.InitWithPDFViewer(pdfViewControl.PDFView);
-            CPDFSaclingControl.SetZoomTextBoxText(string.Format("{0}", (int)(pdfViewControl.PDFView.ZoomFactor * 100)));
+                CPDFSaclingControl.InitWithPDFViewer(pdfViewControl.PDFView);
+                CPDFSaclingControl.SetZoomTextBoxText(string.Format("{0}", (int)(pdfViewControl.PDFView.ZoomFactor * 100)));
 
-            pdfAnnotationControl.SetPDFViewer(pdfViewControl.PDFView);
-            FloatPageTool.InitWithPDFViewer(pdfViewControl.PDFView);
-            BotaSideTool.InitWithPDFViewer(pdfViewControl.PDFView);
-            BotaSideTool.SelectBotaTool(BOTATools.Thumbnail);
-            ViewSettingBtn.IsChecked = false;
-            PropertyContainer.Child = null;
-            PropertyContainer.Visibility = Visibility.Collapsed;
-        }
+                pdfAnnotationControl.SetPDFViewer(pdfViewControl.PDFView);
+                FloatPageTool.InitWithPDFViewer(pdfViewControl.PDFView);
+                BotaSideTool.InitWithPDFViewer(pdfViewControl.PDFView);
+                BotaSideTool.SelectBotaTool(BOTATools.Thumbnail);
+                ViewSettingBtn.IsChecked = false;
+                PropertyContainer.Child = null;
+                PropertyContainer.Visibility = Visibility.Collapsed;
+            } 
 
         #region Load Document
         /// <summary>
@@ -712,7 +714,7 @@ namespace compdfkit
 
         #region UI Action
 
-        private void SaveFile()
+        public void SaveFile()
         {
             if (pdfViewControl != null && pdfViewControl.PDFView != null && pdfViewControl.PDFView.Document != null)
             {
@@ -746,6 +748,10 @@ namespace compdfkit
             try
             {
                 string filePath = CommonHelper.GetFilePathOrEmpty();
+                if ((bool)CheckExistBeforeOpenFileEvent?.Invoke(filePath)) 
+                {
+                    return;
+                }
                 if (!string.IsNullOrEmpty(filePath) && pdfViewControl != null)
                 {
                     if (pdfViewControl.PDFView != null && pdfViewControl.PDFView.Document != null)

+ 5 - 7
compdfkit_demo_windows/compdfkit/compdfkit/MainWindow.xaml

@@ -101,7 +101,7 @@
                                 <ColumnDefinition Width="*" />
                                 <ColumnDefinition Width="auto" />
                             </Grid.ColumnDefinitions>
-                            <Border  x:Name="Title"  Width="184"  Height="32"  Margin="0,4,0,0" BorderBrush="#A0A2AE" BorderThickness="1,1,1,0" CornerRadius="3,3,0,0">
+                            <Border  x:Name="Title"  Width="184"  Height="32"  Margin="10,4,0,0" BorderBrush="#A0A2AE" BorderThickness="1,1,1,0" CornerRadius="3,3,0,0">
                                 <Grid Background="Transparent">
                                     <Grid.ColumnDefinitions>
                                         <ColumnDefinition Width="auto" />
@@ -118,9 +118,7 @@
                                     </Thumb>
                                     <TextBlock  x:Name="ChangeIcon"  Grid.Column="1" Width="5" Margin="3,4,2,0" HorizontalAlignment="Left" VerticalAlignment="Top" IsHitTestVisible="False"  Text="*" Visibility="{Binding FileChanged}" />
 
-                                    <Button  Grid.Column="2"  Width="16" Height="16"  Margin="0,4,8,4" Background="Transparent"  BorderThickness="0" Command="{Binding DataContext.CloseTabCommand, RelativeSource={RelativeSource AncestorType=TabControl}}"
-                                            CommandParameter="{Binding}"  Template="{StaticResource CloseFileButton}">
-                                    </Button>
+                                    <Button  Grid.Column="2"  Width="16" Height="16"  Margin="0,4,8,4" Background="Transparent"  BorderThickness="0" Template="{StaticResource CloseFileButton}"  Click="Button_Click"></Button>
                                 </Grid>
                             </Border>
                         </Grid>
@@ -187,7 +185,7 @@
             </Setter>
         </Style>
 
-        <Style x:Key="TitleBarCloseButtonStyle" BasedOn="{StaticResource TitleBarButtonStyle}" TargetType="Button"> 
+        <Style x:Key="TitleBarCloseButtonStyle" BasedOn="{StaticResource TitleBarButtonStyle}" TargetType="Button">
             <Setter Property="Template">
                 <Setter.Value>
                     <ControlTemplate TargetType="{x:Type Button}">
@@ -204,10 +202,10 @@
                         </Border>
                         <ControlTemplate.Triggers>
                             <Trigger Property="IsMouseOver" Value="true">
-                                <Setter TargetName="border" Property="Background" Value="#C42B1C" /> 
+                                <Setter TargetName="border" Property="Background" Value="#C42B1C" />
                             </Trigger>
                             <Trigger Property="IsPressed" Value="true">
-                                <Setter TargetName="border" Property="Background" Value="#C84031" /> 
+                                <Setter TargetName="border" Property="Background" Value="#C84031" />
                             </Trigger>
                         </ControlTemplate.Triggers>
                     </ControlTemplate>

+ 193 - 19
compdfkit_demo_windows/compdfkit/compdfkit/MainWindow.xaml.cs

@@ -7,6 +7,7 @@ using compdfkit_tools.PDFControl;
 using ComPDFKitViewer;
 using ComPDFKitViewer.AnnotEvent;
 using ComPDFKitViewer.PdfViewer;
+using Dragablz;
 using Microsoft.Win32;
 using System;
 using System.Collections.Generic;
@@ -40,23 +41,28 @@ namespace compdfkit
         {
             InitializeComponent();
             Loaded += MainWindow_Loaded;
+            App.OpenedFilePathList.Clear();
         }
 
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
         private void MainWindow_Loaded(object sender, RoutedEventArgs e)
         {
-            LoadDefaultDocument();
+            if (App.DefaultPDFLoaded == false)
+            {
+                LoadDefaultDocument();
+                App.DefaultPDFLoaded = true;
+            }
         }
 
         private void LoadDefaultDocument()
         {
-            MainPage viewPage = new MainPage();
-            TabItemExt tabItem = new TabItemExt();
             string defaultFilePath = "developer_guide_windows.pdf";
-            viewPage.InitWithFilePath(defaultFilePath);
-            tabItem.Content = viewPage;
-            tabItem.IsSelected = true;
-            tabItem.FileName = Path.GetFileName(defaultFilePath);
-            TabControl.Items.Add(tabItem);
+            TabControlLoadDocument(defaultFilePath);
         }
 
         private void DefaultAddButton_Click(object sender, RoutedEventArgs e)
@@ -64,16 +70,90 @@ namespace compdfkit
             string filePath = CommonHelper.GetFilePathOrEmpty();
             if (filePath != string.Empty)
             {
-                TabItemExt tabItem = new TabItemExt();
-                MainPage viewPage = new MainPage();
-                viewPage.InitWithFilePath(filePath);
-                tabItem.Content = viewPage;
-                tabItem.IsSelected = true;
-                tabItem.FileName = Path.GetFileName(filePath);
-                TabControl.Items.Add(tabItem);
+                TabControlLoadDocument(filePath);
             }
         }
 
+        private void TabControlLoadDocument(string filePath)
+        {
+            foreach (TabItemExt item in TabControl.Items)
+            {
+                if (item.Tag != null && item.Tag.ToString() == filePath)
+                {
+                    item.IsSelected = true; // 如果存在相同的 Tag,则选中对应的 tabItem
+                    return;
+                }
+            }
+
+            TabItemExt tabItem = new TabItemExt();
+            MainPage viewPage = new MainPage();
+
+            viewPage.CheckExistBeforeOpenFileEvent -= (e) =>
+            {
+                foreach (TabItemExt item in TabControl.Items)
+                {
+                    if (item.Tag != null && item.Tag.ToString() == e)
+                    {
+                        item.IsSelected = true;
+                        return true;
+                    }
+                }
+                tabItem.IsSelected = true;
+                tabItem.FileName = Path.GetFileName(e);
+                if (App.OpenedFilePathList.Contains(e))
+                {
+                    for (int i = 0; i < App.OpenedFilePathList.Count; i++)
+                    {
+                        if (e.ToLower() == App.OpenedFilePathList[i].ToLower())
+                        {
+                            App.OpenedFilePathList[i] = e;
+                            break;
+                        }
+                    }
+                }
+                tabItem.Tag = e;
+                return false;
+            };
+
+            viewPage.CheckExistBeforeOpenFileEvent += (e) =>
+            {
+                foreach (TabItemExt item in TabControl.Items)
+                {
+                    if (item.Tag != null && item.Tag.ToString() == e)
+                    {
+                        item.IsSelected = true;
+                        return true;
+                    }
+                }
+                tabItem.IsSelected = true;
+                tabItem.FileName = Path.GetFileName(e);
+                if (App.OpenedFilePathList.Contains(e))
+                {
+                    for (int i = 0; i < App.OpenedFilePathList.Count; i++)
+                    {
+                        if (e.ToLower() == App.OpenedFilePathList[i].ToLower())
+                        {
+                            App.OpenedFilePathList[i] = e;
+                            break;
+                        }
+                    }
+                }
+                tabItem.Tag = e;
+                return false;
+            };
+
+            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);
+        }
+
+
         public class TabItemExt : TabItem, INotifyPropertyChanged
         {
             public event PropertyChangedEventHandler PropertyChanged;
@@ -93,6 +173,7 @@ namespace compdfkit
                     }
                 }
             }
+
             /// <summary>
             /// 文件更改显示*
             /// </summary>
@@ -123,7 +204,64 @@ namespace compdfkit
             DragMove();
         }
 
-        #region window action
+        private void Button_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.CanSave)
+            {
+                string fileName = (dragablzItem.Content as TabItemExt).FileName;
+                var message = string.Format("Do you want to save the changes in {0}?", fileName);
+                var result = MessageBox.Show(message, "Alert", MessageBoxButton.YesNoCancel, MessageBoxImage.Question);
+
+                if (result == MessageBoxResult.Yes)
+                {
+                    mainPage.SaveFile();
+                    tabControl.Items.Remove(dragablzItem.Content);
+                }
+                else if (result == MessageBoxResult.No)
+                {
+                    tabControl.Items.Remove(dragablzItem.Content);
+                }
+                else
+                {
+
+                }
+            }
+            else
+            {
+                tabControl.Items.Remove(dragablzItem.Content);
+            }
+
+            if (tabControl.Items.Count == 0)
+            {
+                SystemCommands.CloseWindow(this);
+            }
+        }
+
+        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 MinimizeButton_Click(object sender, RoutedEventArgs e)
         {
             SystemCommands.MinimizeWindow(this);
@@ -143,9 +281,45 @@ namespace compdfkit
 
         private void CloseButton_Click(object sender, RoutedEventArgs e)
         {
-            SystemCommands.CloseWindow(this);
-        }
-        #endregion 
+            int count = TabControl.Items.Count;
+            while (count > 0)
+            {
+                TabItemExt item = TabControl.Items[0] as TabItemExt;
+
+                MainPage mainPage = item.Content as MainPage;
+                if (mainPage.CanSave)
+                {
+                    string fileName = item.FileName;
+                    var message = string.Format("Do you want to save the changes in {0}?", fileName);
+                    var result = MessageBox.Show(message, "Alert", MessageBoxButton.YesNoCancel, MessageBoxImage.Question);
+
+                    if (result == MessageBoxResult.Yes)
+                    {
+                        mainPage.SaveFile();
+                        TabControl.Items.Remove(item);
+                        count--;
+                    }
+                    else if (result == MessageBoxResult.No)
+                    {
+                        TabControl.Items.Remove(item);
+                        count--;
+                    }
+                    else
+                    {
+                        break;
+                    }
+                }
+                else
+                {
+                    TabControl.Items.Remove(item);
+                    count--;
+                }
+            }
 
+            if (count == 0)
+            {
+                SystemCommands.CloseWindow(this);
+            }
+        }
     }
 }