Browse Source

安全-设置密码

liuaoran 2 years ago
parent
commit
7230d132fe

+ 37 - 55
PDF Office/Helper/PasswordBoxHelper.cs

@@ -3,86 +3,68 @@ using System.Windows.Controls;
 
 namespace PDF_Office.Helper
 {
-    public class PasswordBoxHelper
+      public class PasswordBoxHelper
     {
-        public static readonly DependencyProperty PasswordProperty = DependencyProperty.RegisterAttached(
-            "UserPassword", typeof(string), typeof(PasswordBoxHelper), new PropertyMetadata(string.Empty, OnPasswordPropertyChanged));
+        // 包含两个依赖附加属性 Password   Attach
+        public static readonly DependencyProperty PasswordProperty = DependencyProperty.RegisterAttached("Password", typeof(string), typeof(PasswordBoxHelper),
+              new PropertyMetadata(new PropertyChangedCallback(OnPropertyChanged)));
 
-        private static void OnPasswordPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+        public static string GetPassword(DependencyObject d)
         {
-            PasswordBox passwordBox = d as PasswordBox;
-            passwordBox.PasswordChanged -= PasswordChanged;
-            if (!GetIsUpdating(passwordBox))
-            {
-                /*从Password往控件方向更新绑定值*/
-                passwordBox.Password = e.NewValue.ToString();
-            }
-
-            passwordBox.PasswordChanged += PasswordChanged;
+            return (string)d.GetValue(PasswordProperty);
         }
-
-        public static void SetPassword(DependencyObject element, string value)
+        public static void SetPassword(DependencyObject d, string value)
         {
-            element.SetValue(PasswordProperty, value);
+            d.SetValue(PasswordProperty, value);
         }
 
-        public static string GetPassword(DependencyObject element)
+        public static readonly DependencyProperty AttachProperty = DependencyProperty.RegisterAttached("Attach", typeof(string), typeof(PasswordBoxHelper),
+            new PropertyMetadata(new PropertyChangedCallback(OnAttachChanged)));
+
+        public static string GetAttach(DependencyObject d)
         {
-            return (string)element.GetValue(PasswordProperty);
+            return (string)d.GetValue(PasswordProperty);
         }
-
-        public static readonly DependencyProperty AttachProperty = DependencyProperty.RegisterAttached(
-            "Attach", typeof(bool), typeof(PasswordBoxHelper), new PropertyMetadata(false, Attach));
-
-        private static void Attach(DependencyObject d, DependencyPropertyChangedEventArgs e)
+        public static void SetAttach(DependencyObject d, string value)
         {
-            if (!(d is PasswordBox passwordBox))
-            {
-                return;
-            }
+            d.SetValue(PasswordProperty, value);
+        }
 
-            if ((bool)e.OldValue)
-            {
-                passwordBox.PasswordChanged -= PasswordChanged;
-            }
+        public static readonly DependencyProperty DisplayTextProperty = DependencyProperty.RegisterAttached("DisplayText", typeof(string), typeof(PasswordBoxHelper));
 
-            if ((bool)e.NewValue)
-            {
-                /*当控件的值发生变化的时候,更新Password的值*/
-                passwordBox.PasswordChanged += PasswordChanged;
-            }
+        public static string GetDisplayText(DependencyObject d)
+        {
+            return (string)d.GetValue(PasswordProperty);
         }
-
-        private static void PasswordChanged(object sender, RoutedEventArgs e)
+        public static void SetDisplayText(DependencyObject d, string value)
         {
-            PasswordBox passwordBox = sender as PasswordBox;
-            /*IsUpdating的作用类似一把互斥锁,因涉及到双向绑定更新*/
-            SetIsUpdating(passwordBox, true);
-            SetPassword(passwordBox, passwordBox.Password);
-            SetIsUpdating(passwordBox, false);
+            d.SetValue(PasswordProperty, value);
         }
 
-        public static void SetAttach(DependencyObject element, bool value)
+        static bool _isUpdating = false;
+        private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
         {
-            element.SetValue(AttachProperty, value);
+            PasswordBox pb = (d as PasswordBox);
+            pb.PasswordChanged -= Pb_PasswordChanged;
+            if (!_isUpdating)
+                (d as PasswordBox).Password = e.NewValue.ToString();
+            pb.PasswordChanged += Pb_PasswordChanged;
         }
 
-        public static bool GetAttach(DependencyObject element)
+        private static void OnAttachChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
         {
-            return (bool)element.GetValue(AttachProperty);
+            PasswordBox pb = (d as PasswordBox);
+            pb.PasswordChanged += Pb_PasswordChanged;
         }
 
-        public static readonly DependencyProperty IsUpdatingProperty = DependencyProperty.RegisterAttached(
-            "IsUpdating", typeof(bool), typeof(PasswordBoxHelper), new PropertyMetadata(default(bool)));
 
-        public static void SetIsUpdating(DependencyObject element, bool value)
-        {
-            element.SetValue(IsUpdatingProperty, value);
-        }
 
-        public static bool GetIsUpdating(DependencyObject element)
+        private static void Pb_PasswordChanged(object sender, RoutedEventArgs e)
         {
-            return (bool)element.GetValue(IsUpdatingProperty);
+            PasswordBox pb = (sender as PasswordBox);
+            _isUpdating = true;
+            SetPassword(pb, pb.Password);
+            _isUpdating = false;
         }
     }
 }

+ 39 - 1
PDF Office/Model/Dialog/ToolsDialogs/SaftyDialogs/SetPasswordDialogModel.cs

@@ -1,7 +1,9 @@
 using ComPDFKit.PDFDocument;
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Linq;
+using System.Runtime.CompilerServices;
 using System.Text;
 using System.Threading.Tasks;
 
@@ -13,7 +15,7 @@ namespace PDF_Office.Model.Dialog.ToolsDialogs.SaftyDialogs
 
         public bool CanEdit { get; set; }
 
-        public static string PasswordForOpen { get; set; }
+        public static string PasswordForOpen = "";
 
         public static string PasswordForEdit { get; set; }
 
@@ -33,6 +35,42 @@ namespace PDF_Office.Model.Dialog.ToolsDialogs.SaftyDialogs
             ExceptAbstrat
         }
 
+        public enum EnumNeedPassword
+        {
+            StatusNeedOpenPassword = 1 << 0,
+            StatusNeedPermissionsPassword = 1 << 1
+        }
+
+        public enum EnumPermissionsMod
+        {
+            StatusUnknown = 0,
+            StatusRestrictPrinting = 1 << 0,
+            StatusRestrictCopying = 1 << 1
+        }
+
+        public static CPDFPermissionsInfo CreatePermissionsInfo(EnumPermissionsMod enumPermissionsMod)
+        {
+            CPDFPermissionsInfo permissionsInfo = new CPDFPermissionsInfo();
+            permissionsInfo.AllowsDocumentAssembly = true;
+            permissionsInfo.AllowsDocumentChanges = true;
+            permissionsInfo.AllowsPrinting = true;
+            permissionsInfo.AllowsCopying= true;
+            permissionsInfo.AllowsCommenting= true;
+            permissionsInfo.AllowsFormFieldEntry= true;
+            permissionsInfo.AllowsHighQualityPrinting= true;
+            permissionsInfo.AllowsFormFieldEntry = true;
+            if ((enumPermissionsMod & EnumPermissionsMod.StatusRestrictPrinting) > 0)
+            {
+                permissionsInfo.AllowsPrinting = false;
+                permissionsInfo.AllowsHighQualityPrinting = false;
+            }
+            if ((enumPermissionsMod & EnumPermissionsMod.StatusRestrictCopying) > 0)
+            {
+                permissionsInfo.AllowsCopying = false;
+            }
+            return permissionsInfo;
+        }
+
         ///<returns>
         ///生成带有指定权限的CPDFPermissionsInfo对象
         ///</returns>

+ 8 - 0
PDF Office/ViewModels/Dialog/ToolsDialogs/SaftyDialogs/DeleteSafetySettingsDialogViewModel.cs

@@ -15,6 +15,13 @@ namespace PDF_Office.ViewModels.Dialog.ToolsDialogs.SaftyDialogs
         DeleteSafetySettintgsModel deleteSafetySettintgsModel;
         public IDialogService dialogs;
         private CPDFDocument document;
+
+        private string _deleteSecurityMsg;
+        public string DeleteSecurityMsg
+        {
+            get { return _deleteSecurityMsg; }
+            set { SetProperty(ref _deleteSecurityMsg, value); }
+        }
         #endregion
 
         #region 委托声明
@@ -173,6 +180,7 @@ namespace PDF_Office.ViewModels.Dialog.ToolsDialogs.SaftyDialogs
             if (doc != null)
             {
                 document = doc;
+                DeleteSecurityMsg = "Are you sure you want to remove the security settings for”" + document.FileName + "” documents?";
             }
         }
         #endregion

+ 333 - 8
PDF Office/ViewModels/Dialog/ToolsDialogs/SaftyDialogs/SetPasswordDialogViewModel.cs

@@ -1,4 +1,5 @@
 using ComPDFKit.PDFDocument;
+using PDF_Office.CustomControl;
 using PDF_Office.Model;
 using PDF_Office.Model.Dialog.ToolsDialogs.SaftyDialogs;
 using Prism.Commands;
@@ -6,8 +7,14 @@ using Prism.Mvvm;
 using Prism.Services.Dialogs;
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+using System.Windows;
 using System.Windows.Forms;
-using Forms = System.Windows.Forms;
+using System.Windows.Controls;
+using CheckBox = System.Windows.Controls.CheckBox;
+using System.Drawing.Printing;
+using static PDF_Office.Model.Dialog.ToolsDialogs.SaftyDialogs.SetPasswordDialogModel;
 
 namespace PDF_Office.ViewModels.Dialog.ToolsDialogs.SaftyDialogs
 {
@@ -16,7 +23,6 @@ namespace PDF_Office.ViewModels.Dialog.ToolsDialogs.SaftyDialogs
         #region 参数和属性
         private SetPasswordDialogModel setPasswordDialogModel = new SetPasswordDialogModel();
         private CPDFDocument document;
-
         private bool _canOpen;
         public bool CanOpen
         {
@@ -39,6 +45,8 @@ namespace PDF_Office.ViewModels.Dialog.ToolsDialogs.SaftyDialogs
             }
         }
 
+        private EnumPermissionsMod enumPermissionsMod = EnumPermissionsMod.StatusUnknown|EnumPermissionsMod.StatusRestrictPrinting|EnumPermissionsMod.StatusRestrictCopying;
+
         private string _changeMod = "0";
         ///<value>
         ///"0"为ChangeMod.None;
@@ -80,23 +88,181 @@ namespace PDF_Office.ViewModels.Dialog.ToolsDialogs.SaftyDialogs
                 SetProperty(ref _isEnableConfirm, value);
             }
         }
+
+        private bool _enableConfirm = false;
+        public bool EnableConfirm
+        {
+            get { return _enableConfirm; }
+            set { SetProperty(ref _enableConfirm, value); }
+        }
+
+        private string _openPassword = "";
+        public string OpenPassword
+        {
+            get { return _openPassword; }
+            set
+            {
+                SetProperty(ref _openPassword, value);
+                CheckEnableConfirmEncrypt();
+            }
+        }
+
+        private string _permissionsPassword = "";
+        public string PermissionsPassword
+        {
+            get { return _permissionsPassword; }
+            set
+            {
+                SetProperty(ref _permissionsPassword, value);
+                CheckEnableConfirmEncrypt();
+            }
+        }
+
+        private string _openPasswordMsg = "Open Password";
+        public string OpenPasswordMsg
+        {
+            get { return _openPasswordMsg; }
+            set
+            {
+                SetProperty(ref _openPasswordMsg, value);
+            }
+        }
+        private string _permissionsPasswordMsg = "Permission Password";
+        public string PermissionsPasswordMsg
+        {
+            get { return _permissionsPasswordMsg; }
+            set
+            {
+                SetProperty(ref _permissionsPasswordMsg, value);
+            }
+        }
+
+        private Visibility _openTextVisibility = Visibility.Collapsed;
+        public Visibility OpenTextVisibility
+        {
+            get { return _openTextVisibility; }
+            set
+            {
+                SetProperty(ref _openTextVisibility, value);
+            }
+        }
+
+        private Visibility _openPasswordVisibility = Visibility.Visible;
+        public Visibility OpenPasswordVisibility
+        {
+            get { return _openPasswordVisibility; }
+            set
+            {
+                if (value == Visibility.Visible)
+                {
+                    OpenTextVisibility = Visibility.Collapsed;
+                }
+                else
+                {
+                    OpenTextVisibility = Visibility.Visible;
+                }
+                SetProperty(ref _openPasswordVisibility, value);
+            }
+        }
+
+        private Visibility _permissionsPasswordVisibility = Visibility.Visible;
+        public Visibility PermissionsPasswordVisibility
+        {
+            get { return _permissionsPasswordVisibility; }
+            set
+            {
+                if (value == Visibility.Visible)
+                {
+                    PermissionsTextVisibility = Visibility.Collapsed;
+                }
+                else
+                {
+                    PermissionsTextVisibility = Visibility.Visible;
+                }
+                SetProperty(ref _permissionsPasswordVisibility, value);
+            }
+        }
+
+        private Visibility _permissionsTextVisibility = Visibility.Collapsed;
+        public Visibility PermissionsTextVisibility
+        {
+            get { return _permissionsTextVisibility; }
+            set { SetProperty(ref _permissionsTextVisibility, value); }
+        }
+
+        private bool? _isRestrictPrinting;
+        public bool? IsRestrictPrinting
+        {
+            get { return _isRestrictPrinting; }
+            set { SetProperty(ref _isRestrictPrinting, value); }
+        }
+
+        private bool? _isRestrictCopying;
+        public bool? IsRestrictCopying
+        {
+            get { return _isRestrictCopying; }
+            set { SetProperty(ref _isRestrictCopying, value); }
+        }
+
+        private bool _needOpenPassword;
+        public bool NeedOpenPassword
+        {
+            get { return _needOpenPassword; }
+            set { SetProperty(ref _needOpenPassword, value); }
+        }
+
+        private bool _needPermissionsPassword;
+        public bool NeedPermissionsPassword
+        {
+            get { return _needPermissionsPassword; }
+            set { SetProperty(ref _needPermissionsPassword, value); }
+        }
+
+        private bool _isOpenPasswordDisplayed;
+        public bool IsOpenPasswordDisplayed
+        {
+            get { return _isOpenPasswordDisplayed; }
+            set { SetProperty(ref _isOpenPasswordDisplayed, value); }
+        }
+
+        private bool _isPermissionsPasswordDisplayed;
+        public bool IsPermissionsPasswordDisplayed
+        {
+            get { return _isPermissionsPasswordDisplayed; }
+            set { SetProperty(ref _isPermissionsPasswordDisplayed, value); }
+        }
+
+
         #endregion
 
         #region 委托声明
+        public DelegateCommand<object> DisplayPasswordCommand { get; set; }
+        public DelegateCommand<object> SetOpenPasswordCommand { get; set; }
+        public DelegateCommand<object> SetPermissionsPasswordCommand { get; set; }
+        public DelegateCommand<object> SetRestrictCommand { get; set; }
+        public DelegateCommand EncryptCommand { get; set; }
+
+
         public DelegateCommand DelegateSetOpenCommand { get; set; }
         public DelegateCommand DelegateSetEditCommand { get; set; }
         public DelegateCommand DelegateCanOpenTextChangedCommand { get; set; }
         public DelegateCommand DelegateCanEditTextChangedCommand { get; set; }
         public DelegateCommand DelegateConfirmEncryptCommand { get; set; }
-        public DelegateCommand DelegateCancelEncryptCommand { get; set; }
+        public DelegateCommand CancelEncryptCommand { get; set; }
         #endregion
 
         public SetPasswordDialogViewModel()
         {
             SetPasswordDialogModel.PasswordForOpen = "";
             SetPasswordDialogModel.PasswordForEdit = "";
+            DisplayPasswordCommand = new DelegateCommand<object>(DisplayPassword);
+            SetOpenPasswordCommand = new DelegateCommand<object>(SetOpenPassword);
+            SetPermissionsPasswordCommand = new DelegateCommand<object>(SetPermissionsPassword);
+            SetRestrictCommand = new DelegateCommand<object>(SetRestrict);
+            EncryptCommand = new DelegateCommand(Encrypt);
+            CancelEncryptCommand = new DelegateCommand(CancelEncrypt);
+
             DelegateConfirmEncryptCommand = new DelegateCommand(ConfirmEncrypt);
-            DelegateCancelEncryptCommand = new DelegateCommand(CancelEncrypt);
             DelegateSetOpenCommand = new DelegateCommand(SetCanOpen);
             DelegateSetEditCommand = new DelegateCommand(SetCanEdit);
             DelegateCanOpenTextChangedCommand = new DelegateCommand(CanOpenTextChanged);
@@ -125,6 +291,27 @@ namespace PDF_Office.ViewModels.Dialog.ToolsDialogs.SaftyDialogs
             IsEnabledConfirm = "False";
         }
 
+        private void CheckEnableConfirmEncrypt()
+        {
+            EnableConfirm = true;
+            if (!(NeedOpenPassword || NeedPermissionsPassword))
+            {
+                EnableConfirm = false;
+            }
+            if (NeedOpenPassword && string.IsNullOrEmpty(OpenPassword))
+            {
+                EnableConfirm = false;
+            }
+            if (NeedPermissionsPassword && string.IsNullOrEmpty(PermissionsPassword))
+            {
+                EnableConfirm = false;
+            }
+            if (NeedPermissionsPassword && (!((bool)IsRestrictCopying || (bool)IsRestrictPrinting)))
+            {
+                EnableConfirm = false;
+            }
+        }
+
         private void InitPermissionsDictionary(ref Dictionary<string, SetPasswordDialogModel.PrintMod> GetPrintMod, ref Dictionary<string, SetPasswordDialogModel.ChangeMod> GetChangeMod)
         {
             GetPrintMod.Add("0", SetPasswordDialogModel.PrintMod.None);
@@ -160,14 +347,108 @@ namespace PDF_Office.ViewModels.Dialog.ToolsDialogs.SaftyDialogs
         public void CanEditTextChanged()
         {
             CheckCanConfirmEncrypt();
-        } 
+        }
+
+        public void DisplayPassword(object e)
+        {
+            var chk = e as CheckBox;
+            if (chk != null)
+            {
+                if (chk.Name == "DisplayOpenPasswordChk")
+                {
+                    if (chk.IsChecked == true)
+                    {
+                        OpenPasswordVisibility = Visibility.Collapsed;
+                    }
+                    else
+                    {
+                        OpenPasswordVisibility = Visibility.Visible;
+                    }
+                }
+                else
+                {
+                    if (chk.IsChecked == true)
+                    {
+                        PermissionsPasswordVisibility = Visibility.Collapsed;
+                    }
+                    else
+                    {
+                        PermissionsPasswordVisibility = Visibility.Visible;
+                    }
+                }
+            }
+        }
+
+        public void SetOpenPassword(object e)
+        {
+            var chk = e as CheckBox;
+            if (chk != null)
+            {
+                IsOpenPasswordDisplayed = false;
+                OpenPasswordVisibility = Visibility.Visible;
+            }
+            CheckEnableConfirmEncrypt();
+        }
+
+        public void SetPermissionsPassword(object e)
+        {
+            var chk = e as CheckBox;
+            if (chk != null)
+            {
+                IsPermissionsPasswordDisplayed = false;
+                PermissionsPasswordVisibility = Visibility.Visible;
+                if (chk.IsChecked == true)
+                {
+                    IsRestrictPrinting = true;
+                    IsRestrictCopying = true;
+                }
+                else
+                {
+                    IsRestrictPrinting = false;
+                    IsRestrictCopying = false;
+                }
+            }
+            CheckEnableConfirmEncrypt();
+        }
+
+        public void SetRestrict(object e)
+        {
+            var chk = e as CheckBox;
+            if (chk != null)
+            {
+
+                if ((bool)chk.IsChecked)
+                {
+                    if (chk.Tag.ToString() == "Printing")
+                    {
+                        enumPermissionsMod |= EnumPermissionsMod.StatusRestrictPrinting;
+                    }
+                    else if (chk.Tag.ToString() == "Copying")
+                    {
+                        enumPermissionsMod |= EnumPermissionsMod.StatusRestrictCopying;
+                    }
+                }
+                else
+                {
+                    if (chk.Tag.ToString() == "Printing")
+                    {
+                        enumPermissionsMod -= EnumPermissionsMod.StatusRestrictPrinting;
+                    }
+                    else if (chk.Tag.ToString() == "Copying")
+                    {
+                        enumPermissionsMod -= EnumPermissionsMod.StatusRestrictCopying;
+                    }
+                }
+            }
+            CheckEnableConfirmEncrypt();
+        }
 
         public void ConfirmEncrypt()
         {
             string openPassword = "";
             string editPassword = "";
             FolderBrowserDialog folderDialog = new FolderBrowserDialog();
-            Forms.SaveFileDialog sfd = new Forms.SaveFileDialog();
+            System.Windows.Forms.SaveFileDialog sfd = new System.Windows.Forms.SaveFileDialog();
             /*
              *设置这个对话框的起始保存路径
              */
@@ -180,7 +461,7 @@ namespace PDF_Office.ViewModels.Dialog.ToolsDialogs.SaftyDialogs
              *调用ShowDialog()方法显示该对话框,该方法的返回值代表用户是否点击了确定按钮
              **/
             sfd.FileName = document.FileName + "_SetPassword.pdf";
-            if (sfd.ShowDialog() == Forms.DialogResult.OK)
+            if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
             {
                 /*
                  * 做一些工作
@@ -207,10 +488,54 @@ namespace PDF_Office.ViewModels.Dialog.ToolsDialogs.SaftyDialogs
                 document.Encrypt(openPassword, editPassword, permissionsInfo);
 
                 document.WriteToFilePath(sfd.FileName);
-                MessageBox.Show(sfd.FileName + " 保存成功");
+                MessageBoxEx.Show(sfd.FileName + " 保存成功");
                 RequestClose?.Invoke(new Prism.Services.Dialogs.DialogResult(ButtonResult.Cancel));
             }
         }
+
+        public void Encrypt()
+        {
+            string openPassword = "";
+            string permissionsPassword = "";
+            FolderBrowserDialog folderDialog = new FolderBrowserDialog();
+            System.Windows.Forms.SaveFileDialog sfd = new System.Windows.Forms.SaveFileDialog();
+            /*
+             *设置这个对话框的起始保存路径
+             */
+            sfd.InitialDirectory = document.FilePath;
+            /*
+             *设置保存的文件的类型,注意过滤器的语法 例子:“文件类型|*.后缀名;*.后缀名;”
+             */
+            sfd.Filter = "PDF|*.pdf;";
+            /*
+             *调用ShowDialog()方法显示该对话框,该方法的返回值代表用户是否点击了确定按钮
+             **/
+            sfd.FileName = document.FileName + "_SetPassword.pdf";
+            if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+            {
+                CPDFPermissionsInfo permissionsInfo = new CPDFPermissionsInfo();
+                if (NeedOpenPassword)
+                {
+                    if (!string.IsNullOrEmpty(OpenPassword))
+                    {
+                        openPassword= OpenPassword;
+                    }
+                }
+                if (NeedPermissionsPassword){
+                    if (!string.IsNullOrEmpty(PermissionsPassword))
+                    {
+                        permissionsPassword = PermissionsPassword;
+                        permissionsInfo = CreatePermissionsInfo(enumPermissionsMod);
+                    }
+                }
+                document.Encrypt(openPassword, permissionsPassword, permissionsInfo);
+
+                document.WriteToFilePath(sfd.FileName);
+                MessageBoxEx.Show(sfd.FileName + " 保存成功");
+                RequestClose?.Invoke(new Prism.Services.Dialogs.DialogResult(ButtonResult.Cancel));
+            }
+        }
+
         public void CancelEncrypt() =>
             RequestClose?.Invoke(new Prism.Services.Dialogs.DialogResult(ButtonResult.Cancel));
         #endregion

+ 7 - 7
PDF Office/Views/Dialog/ToolsDialogs/SaftyDialogs/DeleteSafetySettingsDialog.xaml

@@ -3,24 +3,24 @@
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:prism="http://prismlibrary.com/"             
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
-             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"           
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:saftydialogs="clr-namespace:PDF_Office.ViewModels.Dialog.ToolsDialogs.SaftyDialogs" d:DataContext="{d:DesignInstance Type=saftydialogs:DeleteSafetySettingsDialogViewModel}"
              prism:ViewModelLocator.AutoWireViewModel="True"
-             d:DesignHeight="168"
-             d:DesignWidth="340"
+             Height="156"
+             Width="392"
              mc:Ignorable="d">
     <Grid>
         <Grid.RowDefinitions>
             <RowDefinition Name="HeadRow" Height="88" />
             <RowDefinition Height="80"/>
         </Grid.RowDefinitions>
-        <TextBlock Grid.Row="0" Text="确认删除本文档的安全性设置?" FontSize="20" TextWrapping="Wrap" Width="220" Height="50" Block.TextAlignment="Center"/>
-        <StackPanel Grid.Row="1"  Orientation="Horizontal" HorizontalAlignment="Center">
-            <Button Background="WhiteSmoke" Width="100" Height="25" Margin="40,0,20,0" Command="{Binding DelegateCheckPasswordCommand}">
+        <TextBlock Grid.Row="0" Text="{Binding DeleteSecurityMsg, Mode=TwoWay}" TextWrapping="Wrap" FontSize="14" Margin="16,32,16,0" Block.TextAlignment="Center"/>
+        <StackPanel Grid.Row="1"  Orientation="Horizontal" HorizontalAlignment="Right">
+            <Button Background="WhiteSmoke" Width="100" Height="25" Margin="0,0,16,0" Command="{Binding DelegateCheckPasswordCommand}">
                 <Border>
                     <TextBlock Text="确定" ></TextBlock>
                 </Border>
             </Button>
-            <Button Background="WhiteSmoke" Width="100" Height="25" Margin="0,0,40,0" Command="{Binding DelegateCancelCommand}">
+            <Button Background="WhiteSmoke" Width="100" Height="25" Margin="0,0,16,0" Command="{Binding DelegateCancelCommand}">
                 <Border>
                     <TextBlock Text="取消" ></TextBlock>
                 </Border>

+ 264 - 18
PDF Office/Views/Dialog/ToolsDialogs/SaftyDialogs/SetPasswordDialog.xaml

@@ -3,24 +3,227 @@
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+             xmlns:help="clr-namespace:PDF_Office.Helper"
              xmlns:prism="http://prismlibrary.com/"             
-
-            xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" xmlns:i="http://schemas.microsoft.com/xaml/behaviors" xmlns:cus="clr-namespace:PDF_Office.CustomControl"
+            xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" xmlns:i="http://schemas.microsoft.com/xaml/behaviors" xmlns:cus="clr-namespace:PDF_Office.CustomControl" xmlns:saftydialogs="clr-namespace:PDF_Office.ViewModels.Dialog.ToolsDialogs.SaftyDialogs" d:DataContext="{d:DesignInstance Type=saftydialogs:SetPasswordDialogViewModel}"
              prism:ViewModelLocator.AutoWireViewModel="True"
              d:DesignHeight="314"
              d:DesignWidth="432"
+             prism:Dialog.WindowStyle="{StaticResource DialogWindowStyle}"
              mc:Ignorable="d">
     <UserControl.Resources>
-        <Style TargetType="PasswordBox" x:Key="PasswordBoxStyle">
+        <Style TargetType="CheckBox" x:Key="EyeCheckbox">
+            <Setter Property="Cursor" Value="Hand"></Setter>
+            <Setter Property="Template">
+                <Setter.Value>
+                    <ControlTemplate TargetType="{x:Type CheckBox}">
+                        <Grid>
+
+                            <Border Background="Transparent"
+                                BorderBrush="White"
+                                BorderThickness="1" 
+                                CornerRadius="0" 
+                                VerticalAlignment="Center"  >
+                                <Grid Height="{TemplateBinding Height}"
+                                  Width="{Binding ActualHeight,RelativeSource={RelativeSource Self}}">
+                                    <Ellipse x:Name="ellipse"
+                                         Fill="Blue" Margin="2" />
+                                </Grid>
+                            </Border>
+                        </Grid>
+                        <ControlTemplate.Triggers>
+                            <Trigger Property="IsChecked" Value="True">
+                                <Setter TargetName="ellipse" Property="Fill" Value="Red">
+                                </Setter>
+                            </Trigger>
+                            <Trigger Property="IsChecked" Value="False">
+                                <Setter TargetName="ellipse" Property="Fill" Value="Blue">
+                                </Setter>
+                            </Trigger>
+                        </ControlTemplate.Triggers>
+                    </ControlTemplate>
+                </Setter.Value>
+            </Setter>
+        </Style>
+        <Style TargetType="PasswordBox" x:Key="OpenPasswordBoxStyle">
+            <Setter Property="Height" Value="32"/>
+            <Setter Property="FontSize" Value="14"/>
+            <Setter Property="Template">
+                <Setter.Value>
+                    <ControlTemplate TargetType="PasswordBox">
+                        <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" 
+                                    BorderThickness="{TemplateBinding BorderThickness}" 
+                                    Background="{TemplateBinding Background}" 
+                                    SnapsToDevicePixels="True"
+                                    CornerRadius="5">
+                            <Grid>
+                                <Grid.ColumnDefinitions>
+                                    <ColumnDefinition></ColumnDefinition>
+                                    <ColumnDefinition Width="24"></ColumnDefinition>
+                                </Grid.ColumnDefinitions>
+                                <Grid Grid.Column="0">
+                                    <TextBlock Text="{TemplateBinding help:PasswordBoxHelper.DisplayText}" Grid.Column="1" VerticalAlignment="Center" Foreground="#BBB"
+                                           Name="markText" Visibility="Collapsed" FontSize="12" />
+                                    <ScrollViewer x:Name="PART_ContentHost" Focusable="false"
+                                                  HorizontalScrollBarVisibility="Hidden" 
+                                                  VerticalScrollBarVisibility="Hidden"
+                                                  VerticalAlignment="Center" MinHeight="20"/>
+                                </Grid>
+                            </Grid>
+                        </Border>
+
+                        <ControlTemplate.Triggers>
+                            <Trigger Property="IsEnabled" Value="false">
+                                <Setter Property="Opacity" TargetName="border" Value="0.56"/>
+                            </Trigger>
+                            <Trigger Property="IsMouseOver" Value="true">
+                                <Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
+                            </Trigger>
+                            <Trigger Property="IsKeyboardFocused" Value="true">
+                                <Setter Property="BorderBrush" TargetName="border" Value="#FF569DE5"/>
+                            </Trigger>
+                            <DataTrigger Binding="{Binding Path = OpenPassword}" Value="">
+                                <Setter Property="Visibility" TargetName="markText" Value="Visible"/>
+                            </DataTrigger>
+                        </ControlTemplate.Triggers>
+                    </ControlTemplate>
+                </Setter.Value>
+            </Setter>
+        </Style>
+
+        <Style TargetType="TextBox" x:Key="OpenPasswordTextBoxStyle">
+            <Setter Property="Height" Value="32"/>
+            <Setter Property="FontSize" Value="14"/>
+            <Setter Property="Template">
+                <Setter.Value>
+                    <ControlTemplate TargetType="TextBox">
+                        <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" 
+                                    BorderThickness="{TemplateBinding BorderThickness}" 
+                                    Background="{TemplateBinding Background}" 
+                                    SnapsToDevicePixels="True"
+                                    CornerRadius="5">
+                            <Grid>
+                                <Grid.ColumnDefinitions>
+                                    <ColumnDefinition></ColumnDefinition>
+                                    <ColumnDefinition Width="24"></ColumnDefinition>
+                                </Grid.ColumnDefinitions>
+                                <Grid Grid.Column="0">
+                                    <TextBlock Text="{TemplateBinding help:PasswordBoxHelper.DisplayText}" Grid.Column="1" VerticalAlignment="Center" Foreground="#BBB"
+                                           Name="markText" Visibility="Collapsed" FontSize="12" />
+                                    <ScrollViewer x:Name="PART_ContentHost" Focusable="false"
+                                                  HorizontalScrollBarVisibility="Hidden" 
+                                                  VerticalScrollBarVisibility="Hidden"
+                                                  VerticalAlignment="Center" MinHeight="20"/>
+                                </Grid>
+                            </Grid>
+                        </Border>
+
+                        <ControlTemplate.Triggers>
+                            <Trigger Property="IsEnabled" Value="false">
+                                <Setter Property="Opacity" TargetName="border" Value="0.56"/>
+                            </Trigger>
+                            <Trigger Property="IsMouseOver" Value="true">
+                                <Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
+                            </Trigger>
+                            <Trigger Property="IsKeyboardFocused" Value="true">
+                                <Setter Property="BorderBrush" TargetName="border" Value="#FF569DE5"/>
+                            </Trigger>
+                            <DataTrigger Binding="{Binding Path = OpenPassword}" Value="">
+                                <Setter Property="Visibility" TargetName="markText" Value="Visible"/>
+                            </DataTrigger>
+                        </ControlTemplate.Triggers>
+                    </ControlTemplate>
+                </Setter.Value>
+            </Setter>
+        </Style>
+
+        <Style TargetType="PasswordBox" x:Key="PermissionsPasswordBoxStyle">
+            <Setter Property="Height" Value="32"/>
+            <Setter Property="FontSize" Value="14"/>
             <Setter Property="Template">
                 <Setter.Value>
                     <ControlTemplate TargetType="PasswordBox">
-                        <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}"
-                                BorderThickness="{TemplateBinding BorderThickness}"
-                                Background="{TemplateBinding Background}"
-                                SnapsToDevicePixels="True" CornerRadius="4">
-                            <TextBlock Text="Open Password"></TextBlock>
+                        <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" 
+                                    BorderThickness="{TemplateBinding BorderThickness}" 
+                                    Background="{TemplateBinding Background}" 
+                                    SnapsToDevicePixels="True"
+                                    CornerRadius="5">
+                            <Grid>
+                                <Grid.ColumnDefinitions>
+                                    <ColumnDefinition></ColumnDefinition>
+                                    <ColumnDefinition Width="24"></ColumnDefinition>
+                                </Grid.ColumnDefinitions>
+                                <Grid Grid.Column="0">
+                                    <TextBlock Text="{TemplateBinding help:PasswordBoxHelper.DisplayText}" Grid.Column="1" VerticalAlignment="Center" Foreground="#BBB"
+                                           Name="markText" Visibility="Collapsed" FontSize="12" />
+                                    <ScrollViewer x:Name="PART_ContentHost" Focusable="false"
+                                                  HorizontalScrollBarVisibility="Hidden" 
+                                                  VerticalScrollBarVisibility="Hidden"
+                                                  VerticalAlignment="Center" MinHeight="20"/>
+                                </Grid>
+                            </Grid>
+                        </Border>
+
+                        <ControlTemplate.Triggers>
+                            <Trigger Property="IsEnabled" Value="false">
+                                <Setter Property="Opacity" TargetName="border" Value="0.56"/>
+                            </Trigger>
+                            <Trigger Property="IsMouseOver" Value="true">
+                                <Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
+                            </Trigger>
+                            <Trigger Property="IsKeyboardFocused" Value="true">
+                                <Setter Property="BorderBrush" TargetName="border" Value="#FF569DE5"/>
+                            </Trigger>
+                            <DataTrigger Binding="{Binding Path = PermissionsPassword}" Value="">
+                                <Setter Property="Visibility" TargetName="markText" Value="Visible"/>
+                            </DataTrigger>
+                        </ControlTemplate.Triggers>
+                    </ControlTemplate>
+                </Setter.Value>
+            </Setter>
+        </Style>
+
+        <Style TargetType="TextBox" x:Key="PermissionsPasswordTextBoxStyle">
+            <Setter Property="Height" Value="32"/>
+            <Setter Property="FontSize" Value="14"/>
+            <Setter Property="Template">
+                <Setter.Value>
+                    <ControlTemplate TargetType="TextBox">
+                        <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" 
+                                    BorderThickness="{TemplateBinding BorderThickness}" 
+                                    Background="{TemplateBinding Background}" 
+                                    SnapsToDevicePixels="True"
+                                    CornerRadius="5">
+                            <Grid>
+                                <Grid.ColumnDefinitions>
+                                    <ColumnDefinition></ColumnDefinition>
+                                    <ColumnDefinition Width="24"></ColumnDefinition>
+                                </Grid.ColumnDefinitions>
+                                <Grid Grid.Column="0">
+                                    <TextBlock Text="{TemplateBinding help:PasswordBoxHelper.DisplayText}" Grid.Column="1" VerticalAlignment="Center" Foreground="#BBB"
+                                           Name="markText" Visibility="Collapsed" FontSize="12" />
+                                    <ScrollViewer x:Name="PART_ContentHost" Focusable="false"
+                                                  HorizontalScrollBarVisibility="Hidden" 
+                                                  VerticalScrollBarVisibility="Hidden"
+                                                  VerticalAlignment="Center" MinHeight="20"/>
+                                </Grid>
+                            </Grid>
                         </Border>
+
+                        <ControlTemplate.Triggers>
+                            <Trigger Property="IsEnabled" Value="false">
+                                <Setter Property="Opacity" TargetName="border" Value="0.56"/>
+                            </Trigger>
+                            <Trigger Property="IsMouseOver" Value="true">
+                                <Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
+                            </Trigger>
+                            <Trigger Property="IsKeyboardFocused" Value="true">
+                                <Setter Property="BorderBrush" TargetName="border" Value="#FF569DE5"/>
+                            </Trigger>
+                            <DataTrigger Binding="{Binding Path = PermissionsPassword}" Value="">
+                                <Setter Property="Visibility" TargetName="markText" Value="Visible"/>
+                            </DataTrigger>
+                        </ControlTemplate.Triggers>
                     </ControlTemplate>
                 </Setter.Value>
             </Setter>
@@ -28,24 +231,67 @@
     </UserControl.Resources>
     <cus:DialogContent Header="Set Pasword">
         <cus:DialogContent.Content>
-            <Grid Margin="16,0,16,0">
+            <Grid Margin="16,0,16,0" Width="400">
                 <Grid.RowDefinitions>
-                    <RowDefinition></RowDefinition>
-                    <RowDefinition></RowDefinition>
-                    <RowDefinition></RowDefinition>
-                    <RowDefinition></RowDefinition>
+                    <RowDefinition Height="62"></RowDefinition>
+                    <RowDefinition  Height="78"></RowDefinition>
+                    <RowDefinition Height="60"></RowDefinition>
                 </Grid.RowDefinitions>
                 <StackPanel Orientation="Vertical">
-                    <CheckBox>
-                        <TextBlock Text="Document Open Password"></TextBlock>
+                    <CheckBox Name="OpenPasswordChk" IsChecked="{Binding NeedOpenPassword, Mode=TwoWay}" Command="{Binding SetOpenPasswordCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}">
+                        <TextBlock Text="Document Open Password" FontFamily="Segoe UI" FontSize="14"></TextBlock>
+                    </CheckBox>
+                    <Grid  Margin="0,8,0,16"  IsEnabled="{Binding ElementName=OpenPasswordChk, Path=IsChecked}"  >
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition></ColumnDefinition>
+                            <ColumnDefinition Width="24"></ColumnDefinition>
+                        </Grid.ColumnDefinitions>
+                        <PasswordBox Style="{StaticResource OpenPasswordBoxStyle}" help:PasswordBoxHelper.Password="{Binding OpenPassword, Mode=TwoWay , UpdateSourceTrigger=PropertyChanged}" help:PasswordBoxHelper.DisplayText="{Binding OpenPasswordMsg, Mode=TwoWay}" Grid.ColumnSpan="2">
+                        </PasswordBox>
+                        <TextBox Style="{StaticResource OpenPasswordTextBoxStyle}" Text="{Binding OpenPassword, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  Grid.ColumnSpan="2"  Visibility="{Binding OpenTextVisibility, Mode=TwoWay}" help:PasswordBoxHelper.DisplayText="{Binding OpenPasswordMsg, Mode=TwoWay}" ></TextBox>
+                        <CheckBox IsChecked="{Binding IsOpenPasswordDisplayed,Mode=TwoWay}" x:Name="DisplayOpenPasswordChk" Style="{StaticResource EyeCheckbox}" Height="16" Grid.Column="1" HorizontalAlignment="Left" Panel.ZIndex="1" Command="{Binding DisplayPasswordCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}"></CheckBox>
+                    </Grid>
+
+                    <CheckBox Grid.Column="1" Height="56" VerticalAlignment="Bottom"></CheckBox>
+                </StackPanel>
+                <StackPanel Orientation="Vertical" Grid.Row="1" Margin="0,16,0,0">
+                    <CheckBox Name="PermissionsPasswordChk" IsChecked="{Binding NeedPermissionsPassword, Mode=TwoWay}" Command="{Binding SetPermissionsPasswordCommand}" CommandParameter="{Binding RelativeSource = {RelativeSource Self}}">
+                        <TextBlock Text="Permissions" FontFamily="Segoe UI" FontSize="14"></TextBlock>
+                    </CheckBox>
+                    <Grid Height="32" Margin="0,8,0,16"  IsEnabled="{Binding ElementName=PermissionsPasswordChk, Path=IsChecked}"  >
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition></ColumnDefinition>
+                            <ColumnDefinition Width="24"></ColumnDefinition>
+                        </Grid.ColumnDefinitions>
+                        <PasswordBox Style="{StaticResource PermissionsPasswordBoxStyle}" help:PasswordBoxHelper.Password="{Binding PermissionsPassword, Mode=TwoWay , UpdateSourceTrigger=PropertyChanged}" help:PasswordBoxHelper.DisplayText="{Binding PermissionsPasswordMsg, Mode=TwoWay}" Grid.ColumnSpan="2" Visibility="{Binding PermissionsPasswordVisibility, Mode=TwoWay}">
+                        </PasswordBox>
+                        <TextBox Style="{StaticResource PermissionsPasswordTextBoxStyle}" Text="{Binding PermissionsPassword, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" help:PasswordBoxHelper.DisplayText="{Binding PermissionsPasswordMsg, Mode=TwoWay}"  Grid.ColumnSpan="2" Visibility="{Binding PermissionsTextVisibility, Mode=TwoWay}" ></TextBox>
+                        <CheckBox  IsChecked="{Binding IsPermissionsPasswordDisplayed,Mode=TwoWay}"   x:Name="DisplayPermissionsPasswordChk" Style="{StaticResource EyeCheckbox}" Height="16" Grid.Column="1" HorizontalAlignment="Left"  Panel.ZIndex="1"  Command="{Binding DisplayPasswordCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}"></CheckBox>
+                    </Grid>
+
+                </StackPanel  >
+                <StackPanel Grid.Row="2" Orientation="Vertical" IsEnabled="{Binding ElementName=PermissionsPasswordChk, Path=IsChecked}" >
+                    <CheckBox Margin="0,8,0,0" IsChecked="{Binding IsRestrictPrinting,Mode=TwoWay}" Command="{Binding SetRestrictCommand}"  CommandParameter="{Binding RelativeSource = {RelativeSource Self}}" Tag="Printing">
+                        <TextBlock Text="Restrict document printing"></TextBlock>
+                    </CheckBox>
+                    <CheckBox  Margin="0,8,0,0"  IsChecked="{Binding IsRestrictCopying}"  Command="{Binding SetRestrictCommand}"  CommandParameter="{Binding RelativeSource = {RelativeSource Self}}" Tag="Copying">
+                        <TextBlock Text="Restrict content copying"></TextBlock>
                     </CheckBox>
-                    <PasswordBox>
-                    </PasswordBox>
                 </StackPanel>
             </Grid>
         </cus:DialogContent.Content>
         <cus:DialogContent.BottmBar>
-            <Grid></Grid>
+            <Grid Width="400">
+                <Button  Width="80"  Height="32"  HorizontalAlignment="Left" Command="{Binding BatchCommand}">
+                    <TextBlock Text="Batch"></TextBlock>
+                </Button>
+                <Button  Width="80"  Height="32"  Margin="0,0,96,0"  HorizontalAlignment="Right" Command="{Binding EncryptCommand}"  IsEnabled="{Binding EnableConfirm, Mode=TwoWay}" RenderTransformOrigin="1.5,1192508.3">
+                    <TextBlock Text="Encrypt"></TextBlock>
+                </Button>
+                <Button  Width="80" Height="32" HorizontalAlignment="Right" Command="{Binding CancelEncryptCommand}">
+                    <TextBlock Text="Cancel"></TextBlock>
+                </Button>
+            </Grid>
         </cus:DialogContent.BottmBar>
     </cus:DialogContent>
 </UserControl>