Browse Source

Merge branch 'develop_PDFReaderProNew' of git.kdan.cc:Mac_PDF/PDF_Office into develop_PDFReaderProNew

liujiajie 11 months ago
parent
commit
aec8da8244
20 changed files with 1611 additions and 89 deletions
  1. 1 1
      PDF Office/PDF Master/Class/Batch/View/KMSlider.swift
  2. 1144 0
      PDF Office/PDF Master/Class/Common/OC/ExportAccessory/ExportAccessoryView.xib
  3. 51 0
      PDF Office/PDF Master/Class/Common/OC/ExportAccessory/SKExportAccessoryController.h
  4. 98 0
      PDF Office/PDF Master/Class/Common/OC/ExportAccessory/SKExportAccessoryController.m
  5. 129 0
      PDF Office/PDF Master/Class/Document/KMMainDocument.swift
  6. 9 2
      PDF Office/PDF Master/Class/PDFTools/PageEdit/Controller/KMPDFEditViewController.swift
  7. 0 1
      PDF Office/PDF Master/Class/PDFTools/Watermark/New/View/KMWatermarkView.xib
  8. 4 4
      PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Annotation/View/KMNoteTableViewCell.swift
  9. 69 57
      PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController+Note.swift
  10. 0 4
      PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController.swift
  11. 71 0
      PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Model/KMAnnotationModel.swift
  12. 1 1
      PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMToolbarViewController.swift
  13. 1 1
      PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift
  14. 1 1
      PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController.swift
  15. 1 0
      PDF Office/PDF Master/Class/README.md
  16. 1 0
      PDF Office/PDF Master/PDF_Reader_Pro DMG-Bridging-Header.h
  17. 1 0
      PDF Office/PDF Master/PDF_Reader_Pro Edition-Bridging-Header.h
  18. 2 0
      PDF Office/PDF Master/PDF_Reader_Pro-Bridging-Header.h
  19. 26 0
      PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj
  20. 1 17
      PDF Office/PDF Reader Pro.xcodeproj/xcuserdata/kdanmobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

+ 1 - 1
PDF Office/PDF Master/Class/Batch/View/KMSlider.swift

@@ -49,7 +49,7 @@ class KMSlider: NSSlider, NSPopoverDelegate{
         tipView.backgroundColor = NSColor.clear
         tipView.isEditable = false
         tipView.isSelectable = false
-        
+        tipView.alignment = .center
         let contentView = NSView()
         contentView.addSubview(tipView)
         

File diff suppressed because it is too large
+ 1144 - 0
PDF Office/PDF Master/Class/Common/OC/ExportAccessory/ExportAccessoryView.xib


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

@@ -0,0 +1,51 @@
+//
+//  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>
+
+@interface SKExportAccessoryController : NSViewController {
+    NSMatrix *matrix;
+    NSTextField *labelField;
+}
+
+@property (nonatomic, retain) IBOutlet NSMatrix *matrix;
+@property (nonatomic, retain) IBOutlet NSTextField *labelField;
+
+- (void)addFormatPopUpButton:(NSPopUpButton *)popupButton;
+
+@end

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

@@ -0,0 +1,98 @@
+//
+//  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 {}
+
+- (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

+ 129 - 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()
     
@@ -177,6 +188,7 @@ typealias KMMainDocumentCloudUploadHanddler = (@escaping(Bool, String)->()) -> (
         
         mainViewController = KMMainViewController.init()
         mainViewController?.myDocument = self
+        self.mdFlags = MDFlags(exportOption: 0, exportUsingPanel: 0, gettingFileType: 0, convertingNotes: 0, needsPasswordToConvert: 0)
         
         if ((self.fileURL?.path) != nil) {
             let pdfDocument = CPDFDocument.init(url: URL(fileURLWithPath: self.fileURL!.path))
@@ -288,7 +300,88 @@ 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 {
+        let 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.first?.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)
+                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?) {
+        self.mdFlags?.exportUsingPanel = saveOperation == .saveToOperation ? 1 : 0
+        self.mdFlags?.exportOption = UInt32(KMExportOption.default.rawValue)
         if (self.isNewCreated) {
 //            if let data = self.mainViewController, !data.isPDFDocumentEdited && !data.needSave && !self.isDocumentEdited {
                 self._km_runModalSavePanel(for: saveOperation, delegate: delegate, didSave: didSaveSelector, contextInfo: contextInfo)
@@ -460,6 +553,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 {
@@ -897,6 +994,9 @@ typealias KMMainDocumentCloudUploadHanddler = (@escaping(Bool, String)->()) -> (
     private func _km_save(to url: URL, ofType typeName: String, for saveOperation: NSDocument.SaveOperationType, delegate: Any?, didSave didSaveSelector: Selector?, contextInfo: UnsafeMutableRawPointer?) {
         self._saveToURL = url
         super.save(to: url, ofType: typeName, for: saveOperation, delegate: delegate, didSave: didSaveSelector, contextInfo: contextInfo)
+        
+        self.mdFlags?.exportUsingPanel = 0
+        self.mdFlags?.exportOption = UInt32(KMExportOption.default.rawValue)
     }
     
     private func _km_saveAs(_ sender: Any?) {
@@ -908,6 +1008,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 {

+ 9 - 2
PDF Office/PDF Master/Class/PDFTools/PageEdit/Controller/KMPDFEditViewController.swift

@@ -362,9 +362,16 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
             return
         }
         
-        self.dealPdfDocumentDidEditCallback(type: .delete)
         
-        super.deleteIndexPaths(indexpaths: indexpaths)
+        let msg = String(format: NSLocalizedString("Are you sure to delete page %@ ?", comment: ""), KMTools.parseIndexSet(indexSet: self.indexpathsToIndexs(indexpaths: indexpaths)))
+        Task {
+            let res = await KMAlertTool.runModel(message: msg, buttons: [NSLocalizedString("Delete", comment: ""), NSLocalizedString("Cancel", comment: "")])
+            if res == .alertFirstButtonReturn {
+                self.dealPdfDocumentDidEditCallback(type: .delete)
+                
+                super.deleteIndexPaths(indexpaths: indexpaths)
+            }
+        }
     }
     
     override func leftRotateAction() {

+ 0 - 1
PDF Office/PDF Master/Class/PDFTools/Watermark/New/View/KMWatermarkView.xib

@@ -112,7 +112,6 @@
                                                     <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                                     <size key="minSize" width="247" height="58"/>
                                                     <size key="maxSize" width="262" height="10000000"/>
-                                                    <color key="insertionPointColor" name="textInsertionPointColor" catalog="System" colorSpace="catalog"/>
                                                 </textView>
                                             </subviews>
                                         </clipView>

+ 4 - 4
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Annotation/View/KMNoteTableViewCell.swift

@@ -215,6 +215,8 @@ extension KMNoteTableViewCell {
 
         self.contentView.isHidden = false
         self.contentViewHidden(false)
+        // 默认折叠
+        let isFold = model?.isFold() ?? true
         
         if let data = note {
             if data.isKind(of: CPDFMarkupAnnotation.self) {
@@ -238,8 +240,7 @@ extension KMNoteTableViewCell {
                 }
                 self.annotationContentLabel.attributedStringValue = attributeStr
                 
-                let type = model?.foldType ?? .none
-                self.isFold = type != .unfold
+                self.isFold = isFold
                 if (contentString.isEmpty == false) {
                     self.contentViewHidden(false)
                 } else {
@@ -299,8 +300,7 @@ extension KMNoteTableViewCell {
                     self.noteContentLabel.stringValue = noteContent
                 }
                 
-                let type = model?.foldType ?? .none
-                self.isFold = type != .unfold
+                self.isFold = isFold
                 if (noteString.isEmpty == false || noteContent.isEmpty == false) {
                     self.contentView.isHidden = false
                 } else {

+ 69 - 57
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController+Note.swift

@@ -196,7 +196,7 @@ extension KMLeftSideViewController {
         guard let model = self.fetchAnnoModel(for: row) else {
             return
         }
-        var isFold = model.isFold()
+        let isFold = model.isFold()
         item = menu.addItem(title: KMLocalizedString("Expand", nil), action: #selector(unfoldNoteAction), target: self)
         item?.state = isFold ? .off : .on
         item?.representedObject = items
@@ -285,8 +285,9 @@ extension KMLeftSideViewController {
         expandAllItem?.representedObject = self.noteOutlineView
         let foldAllItem = menu.addItem(title: KMLocalizedString("Collapse All", nil), action: #selector(note_foldAllComments), target: self)
         foldAllItem?.representedObject = self.noteOutlineView
-        expandAllItem?.state = self.foldType == .unfold ? .on : .off
-        foldAllItem?.state = self.foldType == .fold ? .on : .off
+        let type = self.annoListModel?.foldType ?? .none
+        expandAllItem?.state = type == .unfold ? .on : .off
+        foldAllItem?.state = type == .fold ? .on : .off
 
         let showItem = menu.addItem(title: KMLocalizedString("Show Note", nil), action: nil, target: self)
         let subMenu = NSMenu()
@@ -351,24 +352,24 @@ extension KMLeftSideViewController {
     }
     
     @IBAction func note_expandAllComments(_ sender: AnyObject?) {
-        if (self.foldType == .unfold) { // 已全部展开
+        guard let model = self.annoListModel else {
             return
         }
-        // 设置全部展开的标识
-        self.foldType = .unfold
-        // 加载数据
-        self.loadUnfoldDate(.none)
-        // 刷新UI
+        if (model.foldType == .unfold) { // 已全部展开
+            return
+        }
+        model.foldType = .unfold
         self.noteOutlineView.reloadData()
     }
     
     @IBAction func note_foldAllComments(_ sender: AnyObject?) {
-        if (self.foldType == .fold) {
+        guard let model = self.annoListModel else {
             return
         }
-        self.foldType = .fold
-        self.loadUnfoldDate(.none)
-        
+        if (model.foldType == .fold) {
+            return
+        }
+        model.foldType = .fold
         self.noteOutlineView.reloadData()
     }
     
@@ -387,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()
@@ -409,11 +423,6 @@ extension KMLeftSideViewController {
             return
         }
 
-//        if self.allFoldNotes.count == self.canFoldNotes.count {
-//            self.foldType = .unfold
-//        } else {
-//            self.foldType = .none
-//        }
         model.foldType = .unfold
         let viewS = self.noteOutlineView.view(atColumn: 0, row: row, makeIfNecessary: true)
         (viewS as? KMNoteTableViewCell)?.isFold = false
@@ -429,12 +438,6 @@ extension KMLeftSideViewController {
             return
         }
         
-//        if (self.allFoldNotes.count == 0) {
-//            self.foldType = .fold
-//        } else {
-//            self.foldType = .none
-//        }
-        
         model.foldType = .fold
         let viewS = self.noteOutlineView.view(atColumn: 0, row: row, makeIfNecessary: true)
         (viewS as? KMNoteTableViewCell)?.isFold = true
@@ -487,11 +490,34 @@ 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?) {
-        KMPrint("editNoteFromTable ...")
+        guard let annotation = (sender as? NSMenuItem)?.representedObject as? CPDFAnnotation else {
+            NSSound.beep()
+            return
+        }
+        let model = fetchAnnoModel(for: annotation)
+        let row = self.noteOutlineView.row(forItem: model)
+        self.noteOutlineView.km_safe_selectRowIndexes(.init(integer: row), byExtendingSelection: false)
+        let noteIndex = self.noteOutlineView.column(withIdentifier: .init("note"))
+        if (noteIndex >= 0) {
+            self.noteOutlineView.scrollColumnToVisible(noteIndex)
+//
+            self.isRenameNoteOutline = true
+//            self.renamePDFOutline = [rightSideController.noteOutlineView itemAtRow:rightSideController.noteOutlineView.clickedRow];
+            let viewS = self.noteOutlineView.view(atColumn: 0, row: row, makeIfNecessary: true) as? KMNoteTableViewCell
+            let targrtTextField = viewS?.noteContentLabel
+            self.renamePDFOutlineTextField = targrtTextField
+            targrtTextField?.delegate = self
+            targrtTextField?.isEditable = true
+            targrtTextField?.becomeFirstResponder()
+        }
     }
     
     @IBAction func noteSortAction(_ sender: AnyObject?) {
@@ -528,14 +554,6 @@ extension KMLeftSideViewController {
         filterViewController.listView = self.listView
         filterViewController.view.layer?.backgroundColor = .clear
 
-        var notes = NSMutableArray()
-//        for section in self._annotations {
-//            if section.annotations?.count != 0 {
-//                for item in section.annotations! {
-//                    notes.add(item.annotation!)
-//                }
-//            }
-//        }
         filterViewController.setNotesArray(self.allAnnotations as NSArray)
         filterViewController.applyFilterCallback = { [weak self] typeArr, colorArr, authorArr, isEmpty in
             menu.cancelTracking()
@@ -572,6 +590,23 @@ extension KMLeftSideViewController {
         }
     }
     
+    func fetchAnnoModel(for anno: CPDFAnnotation) -> KMBotaAnnotationModel? {
+        if self.noteSearchMode { // 搜索模式
+            for model in self.noteSearchArray {
+                if anno.isEqual(to: model.anno) {
+                    return model
+                }
+            }
+        } else { // 常规模式(非搜索)
+            for model in self.annoListModel?.datas ?? [] {
+                if anno.isEqual(to: model.anno) {
+                    return model
+                }
+            }
+        }
+        return nil
+    }
+    
     @IBAction @objc  func sortTypeAction(_ sender: NSMenuItem) {
         let item = sender
         let tag = item.tag
@@ -884,27 +919,4 @@ extension KMLeftSideViewController {
             userDefaults.synchronize()
         }
     }
-    
-    func loadUnfoldDate(_ foldType: KMFoldType) {
-        var mutableArray: [CPDFAnnotation] = []
-        if self.noteSearchMode {
-            for model in self.noteSearchArray {
-                if let note = model.anno as? CPDFMarkupAnnotation {
-                    mutableArray.append(note)
-                }
-            }
-        } else {
-            for model in self.annoListModel?.datas ?? [] {
-                if let note = model.anno, note is CPDFMarkupAnnotation {
-                    mutableArray.append(note)
-                }
-            }
-        }
-//        for note in self.notes {
-//            if note is CPDFMarkupAnnotation {
-//                mutableArray.append(note)
-//            }
-//        }
-        self.canFoldNotes = mutableArray
-    }
 }

+ 0 - 4
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController.swift

@@ -148,8 +148,6 @@ class KMLeftSideViewController: KMSideViewController {
         }
     }
     
-    var canFoldNotes: [CPDFAnnotation] = []
-    
     var isRenameNoteOutline = false
 
     // 所有注释
@@ -201,8 +199,6 @@ class KMLeftSideViewController: KMSideViewController {
     var findPaneState: KMFindPaneState = .singular
     var searchResultIndex: Int = 0
     
-    var foldType: KMFoldType = .none
-    
     var leftMargin: CGFloat = 0
     
     private var _copysPages: [CPDFPage] = []

+ 71 - 0
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Model/KMAnnotationModel.swift

@@ -25,8 +25,79 @@ class KMBotaAnnotationModel: KMAnnotationModel {
         }
         return true
     }
+    
+    func canFold() -> Bool {
+        guard let data = self.anno else {
+            return false
+        }
+        if data is CPDFMarkupAnnotation {
+            return true
+        }
+        if data is CPDFTextAnnotation {
+            return true
+        }
+        return false
+    }
 }
 
 class KMAnnotationListModel: NSObject {
     var datas: [KMBotaAnnotationModel] = []
+    
+    // 默认全部折叠
+    var foldType: KMFoldType {
+        set {
+            for model in self.canFoldModel() {
+                if newValue != .none {
+                    model.foldType = newValue
+                }
+            }
+        }
+        get {
+            let canFolds = self.canFoldModel()
+            if canFolds.isEmpty {
+                return .none
+            }
+            
+            // 是否全部折叠
+            var isAll = true
+            for model in canFolds {
+                if model.isFold() == false {
+                    isAll = false
+                    break
+                }
+            }
+            if isAll {
+                return .fold
+            }
+            
+            // 是否全部展开
+            for model in canFolds {
+                if model.isFold() {
+                    isAll = false
+                    break
+                }
+            }
+            
+            return isAll ? .unfold : .none
+        }
+    }
+    
+    func canFoldModel() -> [KMBotaAnnotationModel] {
+        var models: [KMBotaAnnotationModel] = []
+        for model in self.datas {
+            if model.canFold() {
+                models.append(model)
+            }
+        }
+        return models
+    }
+    
+    func isAllFold() -> Bool {
+        for model in self.canFoldModel() {
+            if model.isFold() == false {
+                return false
+            }
+        }
+        return true
+    }
 }

+ 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 - 1
PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift

@@ -4275,7 +4275,7 @@ extension KMMainViewController : KMMainToolbarControllerDelegate {
                             self.view.window?.endSheet((self.currentWindowController.window)!)
                             self.currentWindowController = nil
                             
-                            KMBaseWindowController.checkPassword(url: self.document!.documentURL!, type: .owner) { [unowned self] success, resultPassword in
+                            KMBaseWindowController.checkPassword(url: self.document!.documentURL!, type: .owner, password: self.document?.password ?? "") { [unowned self] success, resultPassword in
                                 if success {
                                     
                                     let savePanelAccessoryViewController = KMSavePanelAccessoryController()

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

@@ -1465,7 +1465,7 @@ let LOCKED_KEY  = "locked"
                         if document != nil {
                             document!.setDocumentAttributes(attribute)
                             
-                            let path = fileURL.path.stringByAppendingPathComponent(url.lastPathComponent)
+                            let path = fileURL.path.stringByAppendingPathComponent(url.deletingPathExtension().lastPathComponent) + "_SetPassword" + "." + url.pathExtension
                             let success = document!.write(to: NSURL(fileURLWithPath: path) as URL, withOptions: options)
                             if success {
                                 self.view.window?.endSheet((self.currentWindowController.window)!)

+ 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 */,

+ 1 - 17
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,21 +580,5 @@
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "895BEF84-D904-4EAF-99F9-552EED31AB19"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController+Note.swift"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "358"
-            endingLineNumber = "358"
-            landmarkName = "note_expandAllComments(_:)"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
    </Breakpoints>
 </Bucket>