Browse Source

【编辑工具】安全 权限密码弹窗更换

lizhe 1 year ago
parent
commit
8e66089dd2

+ 1 - 1
PDF Office/PDF Master/Class/PDFTools/Merge/OCPart/KMPDFEditAppendWindow.m

@@ -675,7 +675,7 @@ static KMPDFEditAppendWindow *windowController = nil;
     if ([_lockFilePathArr count] > _lockFileIndex) {
         NSString *filePath = [_lockFilePathArr objectAtIndex:_lockFileIndex];
         __weak typeof(self) weakSelf = self;
-        [KMPasswordInputWindow openWindowWithWindow:self.window type:KMPasswordInputWindowTypeOwner url:[NSURL fileURLWithPath:filePath] callback:^(enum KMPasswordInputWindowResult result, NSString * _Nullable password) {
+        [KMPasswordInputWindow openWindowWithWindow:self.window type:KMPasswordInputWindowTypeOwner url:[NSURL fileURLWithPath:filePath] password:@"" callback:^(enum KMPasswordInputWindowResult result, NSString * _Nullable password) {
             if (password.length > 0) {
                 KMFileAttribute *file = [[KMFileAttribute alloc] init];
                 file.filePath = filePath;

+ 59 - 0
PDF Office/PDF Master/Class/PDFTools/Secure/View/KMSecureAlertView.swift

@@ -0,0 +1,59 @@
+//
+//  KMSecureAlertView.swift
+//  PDF Reader Pro
+//
+//  Created by lizhe on 2024/1/24.
+//
+
+import Cocoa
+
+typealias KMSecureAlertViewCloseAction = (_ view: KMSecureAlertView) -> Void
+typealias KMSecureAlertViewPasswordAction = (_ view: KMSecureAlertView) -> Void
+
+class KMSecureAlertView: KMBaseXibView {
+    @IBOutlet var tipsLabel: NSTextField!
+    @IBOutlet var rightBox: NSBox!
+    @IBOutlet var rightBtn: NSButton!
+
+    var closeAction: KMSecureAlertViewCloseAction?
+    var passwordAction: KMSecureAlertViewPasswordAction?
+    
+    var isClosePromptView: Bool = false
+
+    override func setup() {
+        self.wantsLayer = true
+        self.layer?.backgroundColor = KMAppearance.Else.tipbarColor().cgColor
+
+        self.tipsLabel.stringValue = NSLocalizedString("This document has a permission password.", comment: "")
+        self.tipsLabel.textColor = KMAppearance.Layout.w0Color()
+        self.rightBox.borderWidth = 1.0
+        self.rightBox.borderColor = KMAppearance.Layout.w70Color()
+        self.rightBtn.title = " \(NSLocalizedString("Enter Password", comment: ""))  "
+        if self.rightBtn.responds(to: #selector(setter: NSButton.bezelColor)) {
+            self.rightBtn.bezelColor = KMAppearance.Interactive.m0Color()
+        }
+    }
+
+    @IBAction func closedAction(_ sender: Any) {
+        self.isClosePromptView = true
+        self.closeAction?(self)
+        self.removeFromSuperview()
+    }
+
+    @IBAction func passwordAction(_ sender: Any) {
+        self.passwordAction?(self)
+    }
+
+    func show(in pdfView: CPDFView) {
+        if self.isClosePromptView || !pdfView.document!.isEncrypted {
+            if self.superview != nil {
+                self.removeFromSuperview()
+            }
+            return
+        }
+        DispatchQueue.main.async {
+            self.frame = NSRect(x: 0, y: pdfView.frame.size.height - 40, width: pdfView.frame.size.width, height: 40)
+            pdfView.addSubview(self)
+        }
+    }
+}

+ 243 - 0
PDF Office/PDF Master/Class/PDFTools/Secure/View/KMSecureAlertView.xib

@@ -0,0 +1,243 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22505" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22505"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMSecureAlertView" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <connections>
+                <outlet property="rightBox" destination="fox-7f-luO" id="cxp-9M-HHA"/>
+                <outlet property="rightBtn" destination="KVl-Yp-4je" id="xYm-Oz-oaP"/>
+                <outlet property="tipsLabel" destination="euZ-Fa-9Qh" id="RrU-ZO-OCT"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe">
+            <rect key="frame" x="0.0" y="0.0" width="726" height="45"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <customView translatesAutoresizingMaskIntoConstraints="NO" id="2Rr-wx-8Mn">
+                    <rect key="frame" x="0.0" y="0.0" width="726" height="45"/>
+                    <subviews>
+                        <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="73N-N2-WlQ">
+                            <rect key="frame" x="8" y="14" width="18" height="18"/>
+                            <buttonCell key="cell" type="bevel" bezelStyle="rounded" image="KMImageNamePrivateLock" imagePosition="only" alignment="center" inset="2" id="Ead-O4-X3y">
+                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                <font key="font" metaFont="system"/>
+                            </buttonCell>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="18" id="Wur-z0-Itx"/>
+                                <constraint firstAttribute="width" constant="18" id="uaN-jb-EM1"/>
+                            </constraints>
+                        </button>
+                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="euZ-Fa-9Qh">
+                            <rect key="frame" x="34" y="14" width="308" height="17"/>
+                            <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="This document contains interactive form fields." id="bUz-l5-SSk">
+                                <font key="font" metaFont="system" size="14"/>
+                                <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                            </textFieldCell>
+                        </textField>
+                        <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3cq-b1-dvh">
+                            <rect key="frame" x="702" y="15" width="16" height="16"/>
+                            <buttonCell key="cell" type="bevel" bezelStyle="rounded" image="KMImageNameCloseBtn" imagePosition="only" alignment="center" inset="2" id="MGb-Yn-2gq">
+                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                <font key="font" metaFont="system"/>
+                            </buttonCell>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="16" id="4YO-0A-rqT"/>
+                                <constraint firstAttribute="width" constant="16" id="qhI-rl-Bhh"/>
+                            </constraints>
+                            <connections>
+                                <action selector="closedAction:" target="-2" id="JU6-mN-vCX"/>
+                            </connections>
+                        </button>
+                        <box boxType="custom" cornerRadius="1" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="fox-7f-luO">
+                            <rect key="frame" x="536" y="8" width="156" height="29"/>
+                            <view key="contentView" id="3wW-Cr-wCM">
+                                <rect key="frame" x="1" y="1" width="154" height="27"/>
+                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                <subviews>
+                                    <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="KVl-Yp-4je">
+                                        <rect key="frame" x="8" y="2" width="138" height="24"/>
+                                        <buttonCell key="cell" type="square" title="Disable Highlight Effect" bezelStyle="shadowlessSquare" image="buttonCell:KTy-3m-4G4:image" imagePosition="overlaps" alignment="center" imageScaling="proportionallyDown" inset="2" id="KTy-3m-4G4">
+                                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                            <font key="font" metaFont="cellTitle"/>
+                                        </buttonCell>
+                                        <color key="contentTintColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+                                        <constraints>
+                                            <constraint firstAttribute="height" constant="24" id="Aax-eL-sKt"/>
+                                        </constraints>
+                                        <connections>
+                                            <action selector="passwordAction:" target="-2" id="QfN-Hj-Fyh"/>
+                                        </connections>
+                                    </button>
+                                </subviews>
+                                <constraints>
+                                    <constraint firstItem="KVl-Yp-4je" firstAttribute="leading" secondItem="3wW-Cr-wCM" secondAttribute="leading" constant="8" id="AVH-6w-drS"/>
+                                    <constraint firstAttribute="trailing" secondItem="KVl-Yp-4je" secondAttribute="trailing" constant="8" id="X2I-dH-d3d"/>
+                                    <constraint firstItem="KVl-Yp-4je" firstAttribute="centerY" secondItem="3wW-Cr-wCM" secondAttribute="centerY" id="y4l-F5-EI3"/>
+                                </constraints>
+                            </view>
+                        </box>
+                    </subviews>
+                    <constraints>
+                        <constraint firstItem="3cq-b1-dvh" firstAttribute="centerY" secondItem="2Rr-wx-8Mn" secondAttribute="centerY" id="7dO-jk-qDr"/>
+                        <constraint firstAttribute="trailing" secondItem="3cq-b1-dvh" secondAttribute="trailing" constant="8" id="L41-xO-Gjd"/>
+                        <constraint firstItem="3cq-b1-dvh" firstAttribute="leading" secondItem="fox-7f-luO" secondAttribute="trailing" constant="10" id="Rys-Jz-yfn"/>
+                        <constraint firstItem="fox-7f-luO" firstAttribute="top" secondItem="2Rr-wx-8Mn" secondAttribute="top" constant="8" id="UDH-Fv-7rM"/>
+                        <constraint firstItem="73N-N2-WlQ" firstAttribute="leading" secondItem="2Rr-wx-8Mn" secondAttribute="leading" constant="8" id="b9l-j9-2Tl"/>
+                        <constraint firstItem="euZ-Fa-9Qh" firstAttribute="leading" secondItem="73N-N2-WlQ" secondAttribute="trailing" constant="10" id="fDS-uA-BLR"/>
+                        <constraint firstItem="fox-7f-luO" firstAttribute="centerY" secondItem="2Rr-wx-8Mn" secondAttribute="centerY" id="gtk-Zr-Kmy"/>
+                        <constraint firstItem="euZ-Fa-9Qh" firstAttribute="centerY" secondItem="2Rr-wx-8Mn" secondAttribute="centerY" id="khJ-IA-BZR"/>
+                        <constraint firstItem="73N-N2-WlQ" firstAttribute="centerY" secondItem="2Rr-wx-8Mn" secondAttribute="centerY" id="zch-ZF-PTJ"/>
+                    </constraints>
+                </customView>
+            </subviews>
+            <constraints>
+                <constraint firstItem="2Rr-wx-8Mn" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="4mX-kj-fFZ"/>
+                <constraint firstAttribute="bottom" secondItem="2Rr-wx-8Mn" secondAttribute="bottom" id="4q8-fd-wpb"/>
+                <constraint firstAttribute="trailing" secondItem="2Rr-wx-8Mn" secondAttribute="trailing" id="UFm-fa-DBI"/>
+                <constraint firstItem="2Rr-wx-8Mn" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="cbP-c5-acg"/>
+            </constraints>
+            <point key="canvasLocation" x="222" y="0.5"/>
+        </customView>
+    </objects>
+    <resources>
+        <image name="KMImageNameCloseBtn" width="16" height="16"/>
+        <image name="KMImageNamePrivateLock" width="17" height="17"/>
+        <image name="buttonCell:KTy-3m-4G4:image" width="1" height="1">
+            <mutableData key="keyedArchiveRepresentation">
+YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05T
+S2V5ZWRBcmNoaXZlctEICVRyb290gAGvEBELDBkaHxQkKSoxNDdBSUpOUVUkbnVsbNYNDg8QERITFBUW
+FxhWTlNTaXplXk5TUmVzaXppbmdNb2RlViRjbGFzc1xOU0ltYWdlRmxhZ3NWTlNSZXBzV05TQ29sb3KA
+AhAAgBASIMMAAIADgAtWezEsIDF90hsPHB5aTlMub2JqZWN0c6EdgASACtIbDyAjoiEigAWABoAJ0w8l
+JicoFF8QFE5TVElGRlJlcHJlc2VudGF0aW9uXxAZTlNJbnRlcm5hbExheW91dERpcmVjdGlvboAIgAdP
+EQjETU0AKgAAAAoAAAAQAQAAAwAAAAEAAQAAAQEAAwAAAAEAAQAAAQIAAwAAAAIACAAIAQMAAwAAAAEA
+AQAAAQYAAwAAAAEAAQAAAQoAAwAAAAEAAQAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEA
+AgAAARYAAwAAAAEAAQAAARcABAAAAAEAAAACARwAAwAAAAEAAQAAASgAAwAAAAEAAgAAAVIAAwAAAAEA
+AQAAAVMAAwAAAAIAAQABh3MABwAAB/QAAADQAAAAAAAAB/RhcHBsAiAAAG1udHJHUkFZWFlaIAfQAAIA
+DgAMAAAAAGFjc3BBUFBMAAAAAG5vbmUAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWRlc2MAAADAAAAAb2RzY20A
+AAEwAAAGZmNwcnQAAAeYAAAAOHd0cHQAAAfQAAAAFGtUUkMAAAfkAAAADmRlc2MAAAAAAAAAFUdlbmVy
+aWMgR3JheSBQcm9maWxlAAAAAAAAAAAAAAAVR2VuZXJpYyBHcmF5IFByb2ZpbGUAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAB8AAAAMc2tTSwAAACoA
+AAGEZW5VUwAAACgAAAGuY2FFUwAAACwAAAHWdmlWTgAAACwAAAICcHRCUgAAACoAAAIudWtVQQAAACwA
+AAJYZnJGVQAAACoAAAKEaHVIVQAAAC4AAAKuemhUVwAAABAAAALcbmJOTwAAACwAAALsa29LUgAAABgA
+AAMYY3NDWgAAACQAAAMwaGVJTAAAACAAAANUcm9STwAAACQAAAN0ZGVERQAAADoAAAOYaXRJVAAAAC4A
+AAPSc3ZTRQAAAC4AAAQAemhDTgAAABAAAAQuamFKUAAAABYAAAQ+ZWxHUgAAACQAAARUcHRQTwAAADgA
+AAR4bmxOTAAAACoAAASwZXNFUwAAACgAAATadGhUSAAAACQAAAUCdHJUUgAAACIAAAUmZmlGSQAAACwA
+AAVIaHJIUgAAADoAAAV0cGxQTAAAADYAAAWucnVSVQAAACYAAAXkYXJFRwAAACgAAAYKZGFESwAAADQA
+AAYyAFYBYQBlAG8AYgBlAGMAbgD9ACAAcwBpAHYA/QAgAHAAcgBvAGYAaQBsAEcAZQBuAGUAcgBpAGMA
+IABHAHIAYQB5ACAAUAByAG8AZgBpAGwAZQBQAGUAcgBmAGkAbAAgAGQAZQAgAGcAcgBpAHMAIABnAGUA
+bgDoAHIAaQBjAEMepQB1ACAAaADsAG4AaAAgAE0A4AB1ACAAeADhAG0AIABDAGgAdQBuAGcAUABlAHIA
+ZgBpAGwAIABDAGkAbgB6AGEAIABHAGUAbgDpAHIAaQBjAG8EFwQwBDMEMAQ7BEwEPQQ4BDkAIAQ/BEAE
+PgREBDAEOQQ7ACAARwByAGEAeQBQAHIAbwBmAGkAbAAgAGcA6QBuAOkAcgBpAHEAdQBlACAAZwByAGkA
+cwDBAGwAdABhAGwA4QBuAG8AcwAgAHMAegD8AHIAawBlACAAcAByAG8AZgBpAGyQGnUocHCWjoJyX2lj
+z4/wAEcAZQBuAGUAcgBpAHMAawAgAGcAcgDlAHQAbwBuAGUAcAByAG8AZgBpAGzHfLwYACAARwByAGEA
+eQAg1QS4XNMMx3wATwBiAGUAYwBuAP0AIAFhAGUAZAD9ACAAcAByAG8AZgBpAGwF5AXoBdUF5AXZBdwA
+IABHAHIAYQB5ACAF2wXcBdwF2QBQAHIAbwBmAGkAbAAgAGcAcgBpACAAZwBlAG4AZQByAGkAYwBBAGwA
+bABnAGUAbQBlAGkAbgBlAHMAIABHAHIAYQB1AHMAdAB1AGYAZQBuAC0AUAByAG8AZgBpAGwAUAByAG8A
+ZgBpAGwAbwAgAGcAcgBpAGcAaQBvACAAZwBlAG4AZQByAGkAYwBvAEcAZQBuAGUAcgBpAHMAawAgAGcA
+cgDlAHMAawBhAGwAZQBwAHIAbwBmAGkAbGZukBpwcF6mY8+P8GWHTvZOAIIsMLAw7DCkMNcw7TDVMKEw
+pDDrA5MDtQO9A7kDugPMACADwAPBA78DxgOvA7sAIAOzA7oDwQO5AFAAZQByAGYAaQBsACAAZwBlAG4A
+6QByAGkAYwBvACAAZABlACAAYwBpAG4AegBlAG4AdABvAHMAQQBsAGcAZQBtAGUAZQBuACAAZwByAGkA
+agBzAHAAcgBvAGYAaQBlAGwAUABlAHIAZgBpAGwAIABnAHIAaQBzACAAZwBlAG4A6QByAGkAYwBvDkIO
+Gw4jDkQOHw4lDkwOKg41DkAOFw4yDhcOMQ5IDicORA4bAEcAZQBuAGUAbAAgAEcAcgBpACAAUAByAG8A
+ZgBpAGwAaQBZAGwAZQBpAG4AZQBuACAAaABhAHIAbQBhAGEAcAByAG8AZgBpAGkAbABpAEcAZQBuAGUA
+cgBpAQ0AawBpACAAcAByAG8AZgBpAGwAIABzAGkAdgBpAGgAIAB0AG8AbgBvAHYAYQBVAG4AaQB3AGUA
+cgBzAGEAbABuAHkAIABwAHIAbwBmAGkAbAAgAHMAegBhAHIAbwFbAGMAaQQeBDEESQQ4BDkAIARBBDUE
+QARLBDkAIAQ/BEAEPgREBDgEOwRMBkUGRAZBACAGKgY5BjEGSgZBACAARwByAGEAeQAgBicGRAY5BicG
+RQBHAGUAbgBlAHIAZQBsACAAZwByAOUAdABvAG4AZQBiAGUAcwBrAHIAaQB2AGUAbABzAGUAAHRleHQA
+AAAAQ29weXJpZ2h0IDIwMDcgQXBwbGUgSW5jLiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4AWFlaIAAAAAAA
+APNRAAEAAAABFsxjdXJ2AAAAAAAAAAEBzQAA0issLS5aJGNsYXNzbmFtZVgkY2xhc3Nlc18QEE5TQml0
+bWFwSW1hZ2VSZXCjLS8wWk5TSW1hZ2VSZXBYTlNPYmplY3TSKywyM1dOU0FycmF5ojIw0issNTZeTlNN
+dXRhYmxlQXJyYXmjNTIw1Tg5OjsPPD0+P0BXTlNXaGl0ZVxOU0NvbXBvbmVudHNcTlNDb2xvclNwYWNl
+XxASTlNDdXN0b21Db2xvclNwYWNlRDAgMABDMCAwEAOADIAP1EJDRA9FRkdIVE5TSURVTlNJQ0NXTlNN
+b2RlbBAJgA0QAIAOTxERnAAAEZxhcHBsAgAAAG1udHJHUkFZWFlaIAfcAAgAFwAPAC4AD2Fjc3BBUFBM
+AAAAAG5vbmUAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWRlc2MAAADAAAAAeWRzY20AAAE8AAAIGmNwcnQAAAlY
+AAAAI3d0cHQAAAl8AAAAFGtUUkMAAAmQAAAIDGRlc2MAAAAAAAAAH0dlbmVyaWMgR3JheSBHYW1tYSAy
+LjIgUHJvZmlsZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAB8AAAAMc2tTSwAAAC4AAAGE
+ZGFESwAAADoAAAGyY2FFUwAAADgAAAHsdmlWTgAAAEAAAAIkcHRCUgAAAEoAAAJkdWtVQQAAACwAAAKu
+ZnJGVQAAAD4AAALaaHVIVQAAADQAAAMYemhUVwAAABoAAANMa29LUgAAACIAAANmbmJOTwAAADoAAAOI
+Y3NDWgAAACgAAAPCaGVJTAAAACQAAAPqcm9STwAAACoAAAQOZGVERQAAAE4AAAQ4aXRJVAAAAE4AAASG
+c3ZTRQAAADgAAATUemhDTgAAABoAAAUMamFKUAAAACYAAAUmZWxHUgAAACoAAAVMcHRQTwAAAFIAAAV2
+bmxOTAAAAEAAAAXIZXNFUwAAAEwAAAYIdGhUSAAAADIAAAZUdHJUUgAAACQAAAaGZmlGSQAAAEYAAAaq
+aHJIUgAAAD4AAAbwcGxQTAAAAEoAAAcuYXJFRwAAACwAAAd4cnVSVQAAADoAAAekZW5VUwAAADwAAAfe
+AFYBYQBlAG8AYgBlAGMAbgDhACAAcwBpAHYA4QAgAGcAYQBtAGEAIAAyACwAMgBHAGUAbgBlAHIAaQBz
+AGsAIABnAHIA5QAgADIALAAyACAAZwBhAG0AbQBhAC0AcAByAG8AZgBpAGwARwBhAG0AbQBhACAAZABl
+ACAAZwByAGkAcwBvAHMAIABnAGUAbgDoAHIAaQBjAGEAIAAyAC4AMgBDHqUAdQAgAGgA7ABuAGgAIABN
+AOAAdQAgAHgA4QBtACAAQwBoAHUAbgBnACAARwBhAG0AbQBhACAAMgAuADIAUABlAHIAZgBpAGwAIABH
+AGUAbgDpAHIAaQBjAG8AIABkAGEAIABHAGEAbQBhACAAZABlACAAQwBpAG4AegBhAHMAIAAyACwAMgQX
+BDAEMwQwBDsETAQ9BDAAIABHAHIAYQB5AC0EMwQwBDwEMAAgADIALgAyAFAAcgBvAGYAaQBsACAAZwDp
+AG4A6QByAGkAcQB1AGUAIABnAHIAaQBzACAAZwBhAG0AbQBhACAAMgAsADIAwQBsAHQAYQBsAOEAbgBv
+AHMAIABzAHoA/AByAGsAZQAgAGcAYQBtAG0AYQAgADIALgAykBp1KHBwlo5RSV6mADIALgAygnJfaWPP
+j/DHfLwYACDWjMDJACCsELnIACAAMgAuADIAINUEuFzTDMd8AEcAZQBuAGUAcgBpAHMAawAgAGcAcgDl
+ACAAZwBhAG0AbQBhACAAMgAsADIALQBwAHIAbwBmAGkAbABPAGIAZQBjAG4A4QAgAWEAZQBkAOEAIABn
+AGEAbQBhACAAMgAuADIF0gXQBd4F1AAgBdAF5AXVBegAIAXbBdwF3AXZACAAMgAuADIARwBhAG0AYQAg
+AGcAcgBpACAAZwBlAG4AZQByAGkAYwEDACAAMgAsADIAQQBsAGwAZwBlAG0AZQBpAG4AZQBzACAARwBy
+AGEAdQBzAHQAdQBmAGUAbgAtAFAAcgBvAGYAaQBsACAARwBhAG0AbQBhACAAMgAsADIAUAByAG8AZgBp
+AGwAbwAgAGcAcgBpAGcAaQBvACAAZwBlAG4AZQByAGkAYwBvACAAZABlAGwAbABhACAAZwBhAG0AbQBh
+ACAAMgAsADIARwBlAG4AZQByAGkAcwBrACAAZwByAOUAIAAyACwAMgAgAGcAYQBtAG0AYQBwAHIAbwBm
+AGkAbGZukBpwcF6mfPtlcAAyAC4AMmPPj/Blh072TgCCLDCwMOwwpDCsMPMw3gAgADIALgAyACAw1zDt
+MNUwoTCkMOsDkwO1A70DuQO6A8wAIAOTA7oDwQO5ACADkwOsA7wDvAOxACAAMgAuADIAUABlAHIAZgBp
+AGwAIABnAGUAbgDpAHIAaQBjAG8AIABkAGUAIABjAGkAbgB6AGUAbgB0AG8AcwAgAGQAYQAgAEcAYQBt
+AG0AYQAgADIALAAyAEEAbABnAGUAbQBlAGUAbgAgAGcAcgBpAGoAcwAgAGcAYQBtAG0AYQAgADIALAAy
+AC0AcAByAG8AZgBpAGUAbABQAGUAcgBmAGkAbAAgAGcAZQBuAOkAcgBpAGMAbwAgAGQAZQAgAGcAYQBt
+AG0AYQAgAGQAZQAgAGcAcgBpAHMAZQBzACAAMgAsADIOIw4xDgcOKg41DkEOAQ4hDiEOMg5ADgEOIw4i
+DkwOFw4xDkgOJw5EDhsAIAAyAC4AMgBHAGUAbgBlAGwAIABHAHIAaQAgAEcAYQBtAGEAIAAyACwAMgBZ
+AGwAZQBpAG4AZQBuACAAaABhAHIAbQBhAGEAbgAgAGcAYQBtAG0AYQAgADIALAAyACAALQBwAHIAbwBm
+AGkAaQBsAGkARwBlAG4AZQByAGkBDQBrAGkAIABHAHIAYQB5ACAARwBhAG0AbQBhACAAMgAuADIAIABw
+AHIAbwBmAGkAbABVAG4AaQB3AGUAcgBzAGEAbABuAHkAIABwAHIAbwBmAGkAbAAgAHMAegBhAHIAbwFb
+AGMAaQAgAGcAYQBtAG0AYQAgADIALAAyBjoGJwZFBicAIAAyAC4AMgAgBkQGSAZGACAGMQZFBicGLwZK
+ACAGOQYnBkUEHgQxBEkEMARPACAEQQQ1BEAEMARPACAEMwQwBDwEPAQwACAAMgAsADIALQQ/BEAEPgRE
+BDgEOwRMAEcAZQBuAGUAcgBpAGMAIABHAHIAYQB5ACAARwBhAG0AbQBhACAAMgAuADIAIABQAHIAbwBm
+AGkAbABlAAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBJbmMuLCAyMDEyAABYWVogAAAAAAAA81EAAQAA
+AAEWzGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBo
+AG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEB
+AQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHR
+AdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALr
+AvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARV
+BGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYW
+BicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgy
+CEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAqu
+CsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2O
+DakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDX
+EPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSL
+FK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihiv
+GNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1H
+HXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJV
+IoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfc
+KA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3h
+LhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRl
+NJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtr
+O6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3
+QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsM
+S1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1Oq
+U/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzW
+XSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaS
+ZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDg
+cTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vC
+fCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7
+h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NN
+k7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6
+oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1E
+rbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsu
+u6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5
+yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo
+2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui8
+6Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4
++cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//0issS0xcTlNDb2xvclNwYWNlok0wXE5TQ29sb3JTcGFjZdIr
+LE9QV05TQ29sb3KiTzDSKyxSU1dOU0ltYWdlolIwAAgAEQAaACQAKQAyADcASQBMAFEAUwBnAG0AegCB
+AJAAlwCkAKsAswC1ALcAuQC+AMAAwgDJAM4A2QDbAN0A3wDkAOcA6QDrAO0A9AELAScBKQErCfMJ+AoD
+CgwKHwojCi4KNwo8CkQKRwpMClsKXwpqCnIKfwqMCqEKpgqqCqwKrgqwCrkKvgrECswKzgrQCtIK1Bx0
+HHkchhyJHJYcmxyjHKYcqxyzAAAAAAAAAgEAAAAAAAAAVAAAAAAAAAAAAAAAAAAAHLY
+</mutableData>
+        </image>
+    </resources>
+</document>

+ 9 - 15
PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController.swift

@@ -1135,19 +1135,13 @@ let LOCKED_KEY  = "locked"
     public func showSecureLimitTip() {
         self.hiddenSecureLimitTip()
         
-        let view: NSView = self.view
-        let tip = KMSecureLimitAlertView()
-        let size = NSSize(width: 379, height: 154)
-        tip.frame = NSMakeRect(view.frame.size.width-size.width-16, view.frame.size.height-size.height-50, size.width, size.height)
-        tip.autoresizingMask = [.minXMargin, .minYMargin]
-        view.addSubview(tip)
+        let tip = KMSecureAlertView()
+        tip.show(in: self.listView)
+        tip.closeAction = { [unowned self] view in
+            self.hiddenSecureLimitTip()
+        }
         
-        tip.itemClick = { [unowned self] index in
-            if (index == 1) {
-                self.hiddenSecureLimitTip()
-                return
-            }
-            
+        tip.passwordAction = { [unowned self] view in
             if (self.listView.document.allowsPrinting == false || self.listView.document.allowsCopying == false) {
                 KMPasswordInputWindow.openWindow(window: self.view.window!, type: .owner, url: self.listView.document.documentURL) { [weak self] result, password in
                     if result == .cancel { /// 关闭
@@ -1165,10 +1159,10 @@ let LOCKED_KEY  = "locked"
     
     public func hiddenSecureLimitTip() {
         let view: NSView = self.view
-        var tip: KMSecureLimitAlertView?
+        var tip: KMSecureAlertView?
         for subview in view.subviews {
-            if (subview.isKind(of: KMSecureLimitAlertView.self)) {
-                tip = (subview as! KMSecureLimitAlertView)
+            if (subview.isKind(of: KMSecureAlertView.self)) {
+                tip = (subview as! KMSecureAlertView)
                 break
             }
         }

+ 16 - 0
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -2407,6 +2407,12 @@
 		ADFA8F0D2B579957002595A4 /* KMSearchFindView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADFA8F0C2B579957002595A4 /* KMSearchFindView.xib */; };
 		ADFA8F0E2B579957002595A4 /* KMSearchFindView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADFA8F0C2B579957002595A4 /* KMSearchFindView.xib */; };
 		ADFA8F0F2B579957002595A4 /* KMSearchFindView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADFA8F0C2B579957002595A4 /* KMSearchFindView.xib */; };
+		ADFA8F112B60E01C002595A4 /* KMSecureAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFA8F102B60E01C002595A4 /* KMSecureAlertView.swift */; };
+		ADFA8F122B60E01C002595A4 /* KMSecureAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFA8F102B60E01C002595A4 /* KMSecureAlertView.swift */; };
+		ADFA8F132B60E01C002595A4 /* KMSecureAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFA8F102B60E01C002595A4 /* KMSecureAlertView.swift */; };
+		ADFA8F152B60E02B002595A4 /* KMSecureAlertView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADFA8F142B60E02B002595A4 /* KMSecureAlertView.xib */; };
+		ADFA8F162B60E02B002595A4 /* KMSecureAlertView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADFA8F142B60E02B002595A4 /* KMSecureAlertView.xib */; };
+		ADFA8F172B60E02B002595A4 /* KMSecureAlertView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADFA8F142B60E02B002595A4 /* KMSecureAlertView.xib */; };
 		ADFCEB322B4F78150001EBAF /* KMFileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB312B4F78150001EBAF /* KMFileManager.swift */; };
 		ADFCEB332B4F78150001EBAF /* KMFileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB312B4F78150001EBAF /* KMFileManager.swift */; };
 		ADFCEB342B4F78150001EBAF /* KMFileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB312B4F78150001EBAF /* KMFileManager.swift */; };
@@ -5801,6 +5807,8 @@
 		ADFA8F032B5666B6002595A4 /* KMAotuFlowExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMAotuFlowExtension.swift; sourceTree = "<group>"; };
 		ADFA8F082B579945002595A4 /* KMSearchFindView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSearchFindView.swift; sourceTree = "<group>"; };
 		ADFA8F0C2B579957002595A4 /* KMSearchFindView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMSearchFindView.xib; sourceTree = "<group>"; };
+		ADFA8F102B60E01C002595A4 /* KMSecureAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSecureAlertView.swift; sourceTree = "<group>"; };
+		ADFA8F142B60E02B002595A4 /* KMSecureAlertView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMSecureAlertView.xib; sourceTree = "<group>"; };
 		ADFCEB312B4F78150001EBAF /* KMFileManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMFileManager.swift; sourceTree = "<group>"; };
 		ADFCEB352B4F78220001EBAF /* KMFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMFile.swift; sourceTree = "<group>"; };
 		ADFCEB3A2B4FB8C80001EBAF /* FirebaseRemoteConfig.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = FirebaseRemoteConfig.framework; sourceTree = "<group>"; };
@@ -11043,6 +11051,8 @@
 				BB6DD8242934D056001F0544 /* KMSecureEncryptSuccessTipView.swift */,
 				BBA8B7A92935DC120097D183 /* KMRemovePasswordResultTipView.swift */,
 				BB8115FA29924A5F0008F536 /* KMSecureEncryptCheckCellView.swift */,
+				ADFA8F102B60E01C002595A4 /* KMSecureAlertView.swift */,
+				ADFA8F142B60E02B002595A4 /* KMSecureAlertView.xib */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -13036,6 +13046,7 @@
 				BBADCF642AF3CB92004ECE0C /* KMWatermarkCollectionViewItem.xib in Resources */,
 				ADC31FAC2A0E0C3900ED44A2 /* KMEditPropertyAlignmentView.xib in Resources */,
 				BB6BA4C82B0B4A4200462CAE /* KMLeftSideEmptyFileViewController.xib in Resources */,
+				ADFA8F152B60E02B002595A4 /* KMSecureAlertView.xib in Resources */,
 				ADD1B6F82946C0CA00C3FFF7 /* KMPrintChoosePageSizeMultipageView.xib in Resources */,
 				BBC745ED295F067B0072C2ED /* KMCropSettingWindowController.xib in Resources */,
 				BB1B0AE62B4FC6E900889528 /* KMOpenFileGuideProperty.xib in Resources */,
@@ -13503,6 +13514,7 @@
 				AD2BF2332B5620150029F03F /* SF-Pro-Text-Semibold.otf in Resources */,
 				AD3AAD1F2B0B5B4400DE5FE7 /* KMCompareCoveringWindowController.xib in Resources */,
 				BB24D4AB2977BE6700041659 /* KMRedactConfirmWindowController.xib in Resources */,
+				ADFA8F162B60E02B002595A4 /* KMSecureAlertView.xib in Resources */,
 				BB1EC8022967B26700EC0BC3 /* KMPDFEditViewController.xib in Resources */,
 				ADAFDA5F2AEB455500F084BC /* KMHomeContentView.xib in Resources */,
 				AD1D48532AFB8510007AC1F0 /* KMMergeTableViewCell.xib in Resources */,
@@ -14016,6 +14028,7 @@
 				BBE9D09D2AF0CEEB002E83CE /* KMBatchOperateCompressViewController.xib in Resources */,
 				BBA19F3429ADAC81001A285A /* signPicture_hover.pdf in Resources */,
 				89E4E77E2967B370002DBA6F /* KMDynamicStampViewController.xib in Resources */,
+				ADFA8F172B60E02B002595A4 /* KMSecureAlertView.xib in Resources */,
 				BBC2BCCB295DA8F30036B983 /* KMCropPreviewController.xib in Resources */,
 				BB1B0AE82B4FC6E900889528 /* KMOpenFileGuideProperty.xib in Resources */,
 				ADD272D629B9CFE20032B5D6 /* KMLightNoNetworkView.xib in Resources */,
@@ -15246,6 +15259,7 @@
 				BB24D4A72977BE6700041659 /* KMRedactConfirmWindowController.swift in Sources */,
 				9F0CB4F1298655BC00007028 /* KMDesignToken+ItemSpacing.swift in Sources */,
 				8997010E28F40842009AF911 /* KMOutlineViewController.swift in Sources */,
+				ADFA8F112B60E01C002595A4 /* KMSecureAlertView.swift in Sources */,
 				BBFDFA932AF328B200E08AA2 /* KMBatchOperateManager.swift in Sources */,
 				BB2F61502966A91D001CB369 /* KMBackgroundPropertyHomeController.swift in Sources */,
 				BB10FAEE2AFE233C00F18D65 /* KMLineInspector.swift in Sources */,
@@ -16210,6 +16224,7 @@
 				F3599174292B62F5000D25DE /* CStringConstants.m in Sources */,
 				BBC8A7692B05EB8000FA9377 /* KMThumbnailTableviewCell.swift in Sources */,
 				89752DEB293875FC003FF08E /* KMMainToolbarController.swift in Sources */,
+				ADFA8F122B60E01C002595A4 /* KMSecureAlertView.swift in Sources */,
 				BB147012299DC0D100784A6A /* OIDError.m in Sources */,
 				9F1FE50E29407B2B00E952CA /* KMUploadFilePanel.swift in Sources */,
 				BBA93D2E29BEBAA60044E0DD /* KMPreferenceEnum.swift in Sources */,
@@ -16507,6 +16522,7 @@
 				BB1B0A9F2B4FB88100889528 /* IAPProductsManager.m in Sources */,
 				9F0CB4B72977BC1000007028 /* KMPropertiesPanelPreviewSubVC.swift in Sources */,
 				BB3A81B72AC2C0F4006FC66C /* NSObject+KMExtension.swift in Sources */,
+				ADFA8F132B60E01C002595A4 /* KMSecureAlertView.swift in Sources */,
 				BBBAECF62B57672200266BD3 /* SKPresentationOptionsSheetController.swift in Sources */,
 				BB88106F2B4F771D00AFA63E /* KMVerificationInfoViewController.m in Sources */,
 				BB9E2F752A495BCD000DC68D /* KMConvertSettingLimitTipView.swift in Sources */,