Selaa lähdekoodia

【综合】自定义工具栏 裁剪工具Icon未暗黑兼容(已修复)

tangchao 11 kuukautta sitten
vanhempi
commit
38a50f8e39

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1144 - 0
PDF Office/PDF Master/Class/Common/OC/ExportAccessory/ExportAccessoryView.xib


+ 53 - 0
PDF Office/PDF Master/Class/Common/OC/ExportAccessory/SKExportAccessoryController.h

@@ -0,0 +1,53 @@
+//
+//  SKExportAccessoryController.h
+//  Skim
+//
+//  Created by Christiaan on 9/27/12.
+/*
+ This software is Copyright (c) 2012-2018
+ Christiaan Hofman. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the
+    distribution.
+
+ - Neither the name of Christiaan Hofman nor the names of any
+    contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import <Cocoa/Cocoa.h>
+//#import "SKViewController.h"
+
+
+@interface SKExportAccessoryController : NSViewController {
+    NSMatrix *matrix;
+    NSTextField *labelField;
+}
+
+@property (nonatomic, retain) IBOutlet NSMatrix *matrix;
+@property (nonatomic, retain) IBOutlet NSTextField *labelField;
+
+- (void)addFormatPopUpButton:(NSPopUpButton *)popupButton;
+
+@end

+ 102 - 0
PDF Office/PDF Master/Class/Common/OC/ExportAccessory/SKExportAccessoryController.m

@@ -0,0 +1,102 @@
+//
+//  SKExportAccessoryController.m
+//  Skim
+//
+//  Created by Christiaan on 9/27/12.
+/*
+ This software is Copyright (c) 2012-2018
+ Christiaan Hofman. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the
+    distribution.
+
+ - Neither the name of Christiaan Hofman nor the names of any
+    contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SKExportAccessoryController.h"
+#import "NSGraphics_SKExtensions.h"
+
+#define MARGIN_X 16.0
+#define MARGIN_Y 16.0
+#define POPUP_MATRIX_OFFSET 3.0
+
+@implementation SKExportAccessoryController
+
+@synthesize matrix, labelField;
+
+- (void)dealloc {
+//    SKDESTROY(matrix);
+//    SKDESTROY(labelField);
+//    [super dealloc];
+}
+
+- (NSString *)nibName {
+    return @"ExportAccessoryView";
+}
+
+- (void)loadView {
+    [super loadView];
+    [matrix sizeToFit];
+    SKAutoSizeLabelField(labelField, matrix, NO);
+}
+
+- (void)addFormatPopUpButton:(NSPopUpButton *)popupButton {
+    // find the largest item and size popup to fit
+    CGFloat width = 0.0, maxWidth = 0.0;
+    NSSize size = NSMakeSize(1000.0, 1000.0);
+    NSDictionary *attrs = [NSDictionary dictionaryWithObjectsAndKeys:[popupButton font], NSFontAttributeName, nil];
+    NSUInteger i, iNum = [popupButton numberOfItems], iMax = 0;
+    for (i = 0; i < iNum; i++) {
+        width = NSWidth([[popupButton itemTitleAtIndex:i] boundingRectWithSize:size options:0 attributes:attrs]);
+        if (width > maxWidth) {
+            maxWidth = width;
+            iMax = i;
+        }
+    }
+    i = [popupButton indexOfSelectedItem];
+    [popupButton selectItemAtIndex:iMax];
+    [popupButton sizeToFit];
+    [popupButton selectItemAtIndex:i];
+
+    NSView *view = [self view];
+    NSRect frame = [view frame];
+    NSRect matrixFrame = [matrix frame];
+    NSRect popupFrame = [popupButton frame];
+    
+    popupFrame.origin.x = NSMinX(matrixFrame) - POPUP_MATRIX_OFFSET;
+    popupFrame.origin.y = NSMaxY(matrixFrame) + MARGIN_Y;
+    popupFrame.size.width = fmax(NSWidth(popupFrame), NSWidth(matrixFrame) + 2.0 * POPUP_MATRIX_OFFSET);
+    frame.size.width = fmax(NSMaxX(popupFrame) + MARGIN_X - POPUP_MATRIX_OFFSET, NSMaxX(matrixFrame) + MARGIN_X);
+    
+//    if (RUNNING_AFTER(10_7))
+        [popupButton setValue:[NSNumber numberWithBool:NO] forKeyPath:@"constraints.active"];
+    [popupButton setAutoresizingMask:NSViewWidthSizable | NSViewMinYMargin];
+    [popupButton setFrame:popupFrame];
+    [view setFrame:frame];
+    [view addSubview:popupButton];
+}
+
+@end

+ 124 - 0
PDF Office/PDF Master/Class/Document/KMMainDocument.swift

@@ -13,6 +13,12 @@ import CoreFoundation
     case email           = 2
 }
 
+@objc enum KMExportOption: Int {
+    case `default` = 0
+    case withoutNotes
+    case withEmbeddedNotes
+}
+
 typealias KMMainDocumentCloudUploadHanddler = (@escaping(Bool, String)->()) -> ()
 @objcMembers class KMMainDocument: CTTabContents {
     struct MDFlags {
@@ -23,6 +29,9 @@ typealias KMMainDocumentCloudUploadHanddler = (@escaping(Bool, String)->()) -> (
         var needsPasswordToConvert: UInt32 // assuming this is a 1-bit field, change to appropriate data type
     }
     
+    static let kLastExportedTypeKey = "SKLastExportedType"
+    static let kLastExportedOptionKey = "SKLastExportedOption"
+    
     var mainViewController: KMMainViewController?
     var homeWindowController: KMHomeWindowController?
     var homeViewController: KMHomeViewController?
@@ -65,6 +74,8 @@ typealias KMMainDocumentCloudUploadHanddler = (@escaping(Bool, String)->()) -> (
         }
     }
     
+    var exportAccessoryC: SKExportAccessoryController?
+    
     weak var watermarkSaveDelegate: AnyObject?
     private var _trackEvents = IndexSet()
     
@@ -288,6 +299,86 @@ typealias KMMainDocumentCloudUploadHanddler = (@escaping(Bool, String)->()) -> (
         }
     }
     
+    override func saveTo(_ sender: Any?) {
+        guard let pdfDoc = self.mainViewController?.listView.document else {
+            NSSound.beep()
+            return
+        }
+        if pdfDoc.allowsPrinting == false || pdfDoc.allowsCopying == false {
+            Task {
+                _ = await KMAlertTool.runModel(message: NSLocalizedString("This is a secured document. Editing is not permitted.", comment: ""))
+            }
+            return
+        }
+        
+        let idx = (sender as? NSMenuItem)?.tag ?? 0
+        var typeName = KMPDFDocumentType
+        if idx == 0 {
+            typeName = KMPDFDocumentType
+        } else if idx == 1 {
+            typeName = KMPDFBundleDocumentType
+        } else if idx == 2 {
+            typeName = KMNotesDocumentType
+        } else if idx == 3 {
+            typeName = KMNotesTextDocumentType
+        } else if idx == 4 {
+            typeName = KMNotesRTFDocumentType
+        } else if idx == 5 {
+            typeName = KMNotesRTFDDocumentType
+        } else if idx == 6 {
+            typeName = KMNotesDocumentType
+        }
+        
+        KMDataManager.ud_set(typeName, forKey: Self.kLastExportedTypeKey)
+        super.saveTo(sender)
+    }
+    
+    override func prepareSavePanel(_ savePanel: NSSavePanel) -> Bool {
+        var success = super.prepareSavePanel(savePanel)
+        let exportUsingPanel = self.mdFlags?.exportUsingPanel ?? 0
+        if success && exportUsingPanel > 0 {
+//             *formatPopup = [[savePanel accessoryView] subviewOfClass:[NSPopUpButton class]];
+            var formatPopup: NSPopUpButton?
+            let svs = savePanel.accessoryView?.subviews ?? []
+            for sv in svs {
+                if let data = sv as? NSPopUpButton {
+                    formatPopup = data
+                    break
+                }
+            }
+            
+            if (formatPopup != nil) {
+                let lastExportedType = KMDataManager.ud_string(forKey: Self.kLastExportedTypeKey)
+//                NSInteger lastExportedOption = [[NSUserDefaults standardUserDefaults] integerForKey:SKLastExportedOptionKey];
+                var lastExportedOption = KMDataManager.ud_integer(forKey: Self.kLastExportedOptionKey)
+                if lastExportedOption == 0 {
+                    lastExportedOption = KMExportOption.withEmbeddedNotes.rawValue
+                }
+                if (lastExportedType != nil) {
+                    let idx = formatPopup?.indexOfItem(withRepresentedObject: lastExportedType) ?? -1
+                    let selectedIdx = formatPopup?.indexOfSelectedItem ?? 0
+                    if idx != -1 && idx != selectedIdx {
+                        formatPopup?.selectItem(at: idx)
+                        formatPopup?.sendAction(formatPopup?.action, to: formatPopup?.target)
+//                        [savePanel setAllowedFileTypes:[NSArray arrayWithObjects:[self fileNameExtensionForType:lastExportedType saveOperation:NSSaveToOperation], nil]];
+                        if let data = self.fileNameExtension(forType: lastExportedType!, saveOperation: .saveToOperation) {
+                            savePanel.allowedFileTypes = [data]
+                        }
+                    }
+                }
+                self.mdFlags?.exportOption = UInt32(lastExportedOption)
+//
+                self.exportAccessoryC = SKExportAccessoryController()
+                self.exportAccessoryC?.addFormatPopUpButton(formatPopup)
+                self.exportAccessoryC?.matrix.target = self
+                self.exportAccessoryC?.matrix.action = #selector(changeExportOption)
+                savePanel.accessoryView = self.exportAccessoryC?.view
+                self._updateExportAccessoryView()
+            }
+        }
+        return success
+    }
+    
     override func runModalSavePanel(for saveOperation: NSDocument.SaveOperationType, delegate: Any?, didSave didSaveSelector: Selector?, contextInfo: UnsafeMutableRawPointer?) {
         if (self.isNewCreated) {
 //            if let data = self.mainViewController, !data.isPDFDocumentEdited && !data.needSave && !self.isDocumentEdited {
@@ -460,6 +551,10 @@ typealias KMMainDocumentCloudUploadHanddler = (@escaping(Bool, String)->()) -> (
         return false
     }
     
+    func changeExportOption(_ sender: NSMatrix?) {
+        self.mdFlags?.exportOption = UInt32(sender?.selectedCell()?.tag ?? 0)
+    }
+    
     // MARK: Private Methods
 
     func pdfChangedNotification(_ notification: Notification) -> Void {
@@ -908,6 +1003,35 @@ typealias KMMainDocumentCloudUploadHanddler = (@escaping(Bool, String)->()) -> (
     private func _km_runModalSavePanel(for saveOperation: NSDocument.SaveOperationType, delegate: Any?, didSave didSaveSelector: Selector?, contextInfo: UnsafeMutableRawPointer?) {
         super.runModalSavePanel(for: saveOperation, delegate: delegate, didSave: didSaveSelector, contextInfo: contextInfo)
     }
+    
+    private func _updateExportAccessoryView() {
+        let typeName = self.fileTypeFromLastRunSavePanel ?? ""
+        let matrix = self.exportAccessoryC?.matrix
+        matrix?.selectCell(withTag: Int(self.mdFlags?.exportOption ?? 0))
+        
+        if self._canAttachNotesForType(typeName) {
+            matrix?.isHidden = false
+            let ws = NSWorkspace.shared
+            let isLocked = self.mainViewController?.listView.document.isLocked ?? false
+            let allowsPrinting = self.mainViewController?.listView.document.allowsPrinting ?? false
+            if ws.type(typeName, conformsToType: KMPDFDocumentType) && isLocked == false && allowsPrinting {
+                (matrix?.cell(withTag: KMExportOption.withEmbeddedNotes.rawValue))?.isEnabled = true
+            } else {
+                (matrix?.cell(withTag: KMExportOption.withEmbeddedNotes.rawValue))?.isEnabled = false
+                if let data = self.mdFlags?.exportOption, data == KMExportOption.withEmbeddedNotes.rawValue {
+                    self.mdFlags?.exportOption = UInt32(KMExportOption.default.rawValue)
+                    matrix?.selectCell(withTag: KMExportOption.default.rawValue)
+                }
+            }
+        } else {
+            matrix?.isHidden = true
+        }
+    }
+    
+    private func _canAttachNotesForType(_ typeName: String) -> Bool {
+        let ws = NSWorkspace.shared
+        return ws.type(typeName, conformsToType: KMPDFDocumentType) || ws.type(typeName, conformsToType: KMPostScriptDocumentType) || ws.type(typeName, conformsToType: KMDVIDocumentType) || ws.type(typeName, conformsToType: KMXDVDocumentType)
+    }
 }
 
 extension KMMainDocument {

+ 18 - 1
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController+Note.swift

@@ -388,6 +388,19 @@ extension KMLeftSideViewController {
             self.noteTypeDict[Self.Key.noteFilterAuther] = !isAuther
         }
         UserDefaults.standard.sync_setValue(self.noteTypeDict, forKey: Self.Key.noteTableColumn)
+        
+        // 更新数据
+        var models: [KMBotaAnnotationModel] = []
+        if self.noteSearchMode {
+            models = self.noteSearchArray
+        } else {
+            models = self.annoListModel?.datas ?? []
+        }
+        for model in models {
+            model.showPage = self.annoListIsShowPage()
+            model.showTime = self.annoListIsShowTime()
+            model.showAuthor = self.annoListIsShowAnther()
+        }
             
         let selectRow = self.noteOutlineView.selectedRow
         self.noteOutlineView.reloadData()
@@ -477,7 +490,11 @@ extension KMLeftSideViewController {
     }
     
     @objc func editThisAnnotation(_ sender: AnyObject?) {
-        KMPrint("editThisAnnotation ...")
+        guard let annotation = (sender as? NSMenuItem)?.representedObject as? CPDFAnnotation else {
+            NSSound.beep()
+            return
+        }
+        self.listView?.edit(annotation)
     }
     
     @objc func editNoteFromTable(_ sender: AnyObject?) {

+ 1 - 1
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMToolbarViewController.swift

@@ -588,7 +588,7 @@ extension KMToolbarViewController : KMToolbarViewDelegate,NSToolbarItemValidatio
                     KMToolbarToolCompressItemIdentifier, KMToolbarToolSecureItemIdentifier, KMToolbarToolWatermarkItemIdentifier,
                     KMToolbarToolBackgroundItemIdentifier, KMToolbarToolHeaderFooterItemIdentifier, KMToolbarToolBatesItemIdentifier,
                     KMToolbarAIItemIdentifier,
-                    KMToolbarToolCropItemIdentifier,
+                    KMToolbarCropIdentifier,
                     KMToolbarConversionWordItemIdentifier, KMToolbarConversionExcelItemIdentifier, KMToolbarConversionPPTItemIdentifier,
                     KMToolbarConversionRTFItemIdentifier, KMToolbarConversionCSVItemIdentifier, KMToolbarConversionHTMLItemIdentifier,
                     KMToolbarConversionTextItemIdentifier, KMToolbarConversionImageItemIdentifier,

+ 1 - 0
PDF Office/PDF Master/Class/README.md

@@ -81,6 +81,7 @@
 
 ## 注释工具
 * 笔记 CPDFListAnnotationNoteWindowController
+* 便签 CPDFListEditAnnotationViewController
 
 * 自定义注释工具 KMToolbarCustomWindowController
 

+ 1 - 0
PDF Office/PDF Master/PDF_Reader_Pro DMG-Bridging-Header.h

@@ -113,3 +113,4 @@
 #import "KMStatusBar.h"
 #import "SKPDFSynchronizer.h"
 #import "SKVersionNumber.h"
+#import "SKExportAccessoryController.h"

+ 1 - 0
PDF Office/PDF Master/PDF_Reader_Pro Edition-Bridging-Header.h

@@ -109,3 +109,4 @@
 #import "KMStatusBar.h"
 #import "SKPDFSynchronizer.h"
 #import "SKVersionNumber.h"
+#import "SKExportAccessoryController.h"

+ 2 - 0
PDF Office/PDF Master/PDF_Reader_Pro-Bridging-Header.h

@@ -109,3 +109,5 @@
 #import "KMStatusBar.h"
 #import "SKPDFSynchronizer.h"
 #import "SKVersionNumber.h"
+#import "SKExportAccessoryController.h"
+

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

@@ -4142,6 +4142,12 @@
 		BB96A0B82AFCE45800559E24 /* WaitingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB96A0B72AFCE45800559E24 /* WaitingView.swift */; };
 		BB96A0B92AFCE45800559E24 /* WaitingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB96A0B72AFCE45800559E24 /* WaitingView.swift */; };
 		BB96A0BA2AFCE45800559E24 /* WaitingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB96A0B72AFCE45800559E24 /* WaitingView.swift */; };
+		BB97BE242BC3E02D00BECEA8 /* SKExportAccessoryController.m in Sources */ = {isa = PBXBuildFile; fileRef = BB97BE222BC3E02D00BECEA8 /* SKExportAccessoryController.m */; };
+		BB97BE252BC3E02D00BECEA8 /* SKExportAccessoryController.m in Sources */ = {isa = PBXBuildFile; fileRef = BB97BE222BC3E02D00BECEA8 /* SKExportAccessoryController.m */; };
+		BB97BE262BC3E02D00BECEA8 /* SKExportAccessoryController.m in Sources */ = {isa = PBXBuildFile; fileRef = BB97BE222BC3E02D00BECEA8 /* SKExportAccessoryController.m */; };
+		BB97BE272BC3E02D00BECEA8 /* ExportAccessoryView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB97BE232BC3E02D00BECEA8 /* ExportAccessoryView.xib */; };
+		BB97BE282BC3E02D00BECEA8 /* ExportAccessoryView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB97BE232BC3E02D00BECEA8 /* ExportAccessoryView.xib */; };
+		BB97BE292BC3E02D00BECEA8 /* ExportAccessoryView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB97BE232BC3E02D00BECEA8 /* ExportAccessoryView.xib */; };
 		BB981E522AD4F638001988CA /* KMCoverButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB981E502AD4F637001988CA /* KMCoverButton.swift */; };
 		BB981E532AD4F638001988CA /* KMCoverButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB981E502AD4F637001988CA /* KMCoverButton.swift */; };
 		BB981E542AD4F638001988CA /* KMCoverButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB981E502AD4F637001988CA /* KMCoverButton.swift */; };
@@ -6839,6 +6845,9 @@
 		BB96A0AF2AFCD56100559E24 /* KMToolCompareWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMToolCompareWindowController.swift; sourceTree = "<group>"; };
 		BB96A0B32AFCD56B00559E24 /* KMToolCompareWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMToolCompareWindowController.xib; sourceTree = "<group>"; };
 		BB96A0B72AFCE45800559E24 /* WaitingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaitingView.swift; sourceTree = "<group>"; };
+		BB97BE212BC3E02D00BECEA8 /* SKExportAccessoryController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SKExportAccessoryController.h; sourceTree = "<group>"; };
+		BB97BE222BC3E02D00BECEA8 /* SKExportAccessoryController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SKExportAccessoryController.m; sourceTree = "<group>"; };
+		BB97BE232BC3E02D00BECEA8 /* ExportAccessoryView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ExportAccessoryView.xib; sourceTree = "<group>"; };
 		BB981E502AD4F637001988CA /* KMCoverButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMCoverButton.swift; sourceTree = "<group>"; };
 		BB981E512AD4F638001988CA /* KMPageIndicator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMPageIndicator.swift; sourceTree = "<group>"; };
 		BB981E582AD4F70D001988CA /* KMWelcomeWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMWelcomeWindowController.swift; sourceTree = "<group>"; };
@@ -11738,6 +11747,7 @@
 		BB5F8A0329BB04EF00365ADB /* OC */ = {
 			isa = PBXGroup;
 			children = (
+				BB97BE202BC3E02D00BECEA8 /* ExportAccessory */,
 				BB8D52A22BA29A5C00D5CB31 /* VersionNumber */,
 				BBA8B66C2B9027A900CB07B0 /* CheckFileUpdate */,
 				BB30D47F2B90249D00702541 /* StatusBar */,
@@ -12377,6 +12387,16 @@
 			path = Property;
 			sourceTree = "<group>";
 		};
+		BB97BE202BC3E02D00BECEA8 /* ExportAccessory */ = {
+			isa = PBXGroup;
+			children = (
+				BB97BE212BC3E02D00BECEA8 /* SKExportAccessoryController.h */,
+				BB97BE222BC3E02D00BECEA8 /* SKExportAccessoryController.m */,
+				BB97BE232BC3E02D00BECEA8 /* ExportAccessoryView.xib */,
+			);
+			path = ExportAccessory;
+			sourceTree = "<group>";
+		};
 		BB9807F829CA93A900BEEB81 /* Welcome */ = {
 			isa = PBXGroup;
 			children = (
@@ -13774,6 +13794,7 @@
 				BB24D4AA2977BE6700041659 /* KMRedactConfirmWindowController.xib in Resources */,
 				ADDF838C2B391A5D00A81A4E /* DSignatureFileListCellView.xib in Resources */,
 				BB0FE0552B734DD1001E0F88 /* AIUserInfoController.xib in Resources */,
+				BB97BE272BC3E02D00BECEA8 /* ExportAccessoryView.xib in Resources */,
 				BBAFC84D298519F700D0648E /* KMSavePanelAccessoryController.xib in Resources */,
 				BB0FE0402B734DD1001E0F88 /* AITypeChooseView.xib in Resources */,
 				F3A9DC81294309D80074E5D2 /* CPDFListEditAnnotationViewController.xib in Resources */,
@@ -14283,6 +14304,7 @@
 				AD867F9929D955D200F00440 /* KMBOTAOutlineCellView.xib in Resources */,
 				BB1BFF662AE9FBA8003EB179 /* KMBatchOperateWindowController.xib in Resources */,
 				AD2BF2292B5608700029F03F /* Assets.xcassets in Resources */,
+				BB97BE282BC3E02D00BECEA8 /* ExportAccessoryView.xib in Resources */,
 				BB65A0832AF8FEA1003A27A0 /* KMBatchOperateRemoveHeaderFooterViewController.xib in Resources */,
 				BB4F7E9A2B0C858D0077EC8C /* KMNoteTypeCollectionViewItem.xib in Resources */,
 				ADDF83842B391A5D00A81A4E /* DSignatureSaveTypeViewController.xib in Resources */,
@@ -15129,6 +15151,7 @@
 				AD055E8F2B88304E0035F824 /* BookmarkSheet.xib in Resources */,
 				9F3D819829A33A290087B5AD /* KMDesignDropdown.xib in Resources */,
 				BBC8A7772B0640C200FA9377 /* KMBotaSearchViewController.xib in Resources */,
+				BB97BE292BC3E02D00BECEA8 /* ExportAccessoryView.xib in Resources */,
 				BB1B0B002B4FC6E900889528 /* KMOpenFileFunctionView.xib in Resources */,
 				8997010B28F4082C009AF911 /* KMFromViewController.xib in Resources */,
 				BB328B622B55512F00B382C6 /* KMVerificationMessageViewController.xib in Resources */,
@@ -15621,6 +15644,7 @@
 				ADDF83232B391A5C00A81A4E /* CDSDrawView.m in Sources */,
 				BB3A66A72B078CA400575343 /* KMNoteOutlineView.swift in Sources */,
 				9F1FE4BD29406E4700E952CA /* URLDropTarget.m in Sources */,
+				BB97BE242BC3E02D00BECEA8 /* SKExportAccessoryController.m in Sources */,
 				9F0CB5052986561E00007028 /* KMDesignToken+BorderRight.swift in Sources */,
 				ADDF83562B391A5C00A81A4E /* DSignatureCreateViewController.swift in Sources */,
 				AD0FA50A29A9E74200EDEB50 /* KMLoginInputPasswordView.swift in Sources */,
@@ -17188,6 +17212,7 @@
 				9FF0D0592B6A43750018A732 /* KMPDFAnnotationButtonWidgetSub.swift in Sources */,
 				ADB2D6FA294882AE0029D2B3 /* KMTextFieldStepperView.swift in Sources */,
 				BB1969CE2B2833DA00922736 /* KMProgressWindowController.swift in Sources */,
+				BB97BE252BC3E02D00BECEA8 /* SKExportAccessoryController.m in Sources */,
 				BBC3483C2955A60B008D2CD1 /* KMBackgroundPropertyInfoController.swift in Sources */,
 				ADDF832A2B391A5C00A81A4E /* CPDFSelection+PDFListView.m in Sources */,
 				AD7D5CCC2B95728C006562CD /* KMBookmarkOutlineTitleCellView.swift in Sources */,
@@ -17967,6 +17992,7 @@
 				BB6013822AD38E0100A76FB2 /* CPDFTextAnnotation+PDFListView.swift in Sources */,
 				BB1331502AD78DC0008F6791 /* KMPDFMergeSizeTabelViewCell.swift in Sources */,
 				AD055E2F2B70B3D50035F824 /* KMBookmarkSheetController.swift in Sources */,
+				BB97BE262BC3E02D00BECEA8 /* SKExportAccessoryController.m in Sources */,
 				BB42A5DA2B8F0F860092C524 /* KMTabbingHintWindowController.swift in Sources */,
 				ADDDCE232B43A32A005B4AB5 /* AppSandboxFileAccessPersist.m in Sources */,
 				AD199DFA2B26A36500D56FEE /* KMPrintPosterPreviewView.swift in Sources */,

+ 17 - 1
PDF Office/PDF Reader Pro.xcodeproj/xcuserdata/kdanmobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -560,7 +560,7 @@
             endingColumnNumber = "9223372036854775807"
             startingLineNumber = "949"
             endingLineNumber = "949"
-            landmarkName = "-doDragWithEvent:"
+            landmarkName = "-doDragTextWithEvent:"
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
@@ -580,5 +580,21 @@
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "EDA42966-3DBB-4AED-9FA7-83CAECFDE67B"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "PDF Master/Class/Document/KMMainDocument.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "336"
+            endingLineNumber = "336"
+            landmarkName = "prepareSavePanel(_:)"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
    </Breakpoints>
 </Bucket>