Explorar o código

【系统菜单】选中文本后,编辑-拼写检查下的2个功能应该高亮能用(还有一些bug)

tangchao hai 1 ano
pai
achega
99e275ad0a

+ 6 - 0
PDF Office/PDF Master/Class/PDFWindowController/PDFListView/CPDFKitExtensions/CPDFSelectionExtensions/CPDFSelection+PDFListView.h

@@ -16,4 +16,10 @@
 
 
 - (NSString *)PDFListViewCleanedString;
 - (NSString *)PDFListViewCleanedString;
 
 
+- (CPDFPage *)safePage:(CPDFPage *)page;
+- (CPDFPage *)safeFirstPage;
+- (CPDFPage *)safeLastPage;
+- (BOOL)hasCharacters;
+- (NSUInteger)safeIndexOfLastCharacterOnPage:(CPDFPage *)page;
+
 @end
 @end

+ 56 - 0
PDF Office/PDF Master/Class/PDFWindowController/PDFListView/CPDFKitExtensions/CPDFSelectionExtensions/CPDFSelection+PDFListView.m

@@ -19,5 +19,61 @@
     return [[[self selectionsByLine] valueForKey:@"string"] componentsJoinedByString:@" "];
     return [[[self selectionsByLine] valueForKey:@"string"] componentsJoinedByString:@" "];
 }
 }
 
 
+- (CPDFPage *)safePage:(CPDFPage *)page {
+    if ([self respondsToSelector:@selector(numberOfTextRangesOnPage:)] && [self respondsToSelector:@selector(rangeAtIndex:onPage:)]) {
+        NSInteger i, count = [self numberOfTextRangesOnPage:page];
+        for (i = 0; i < count; i++) {
+            if ([self rangeAtIndex:i onPage:page].length > 0)
+                return page;
+        }
+    }
+//    else if ([self respondsToSelector:@selector(indexOfCharactersOnPage:)]) {
+//        NSIndexSet *indexes = [self indexOfCharactersOnPage:page];
+//        if (indexes && [indexes firstIndex] != NSNotFound)
+//            return page;
+//    }
+    else {
+        if (NSIsEmptyRect([self boundsForPage:page]) == NO)
+            return page;
+    }
+    return nil;
+}
+
+- (CPDFPage *)safeFirstPage {
+    for (CPDFPage *page in [self pages]) {
+        if ((page == [self safePage:page]))
+            return page;
+    }
+    return nil;
+}
+
+- (CPDFPage *)safeLastPage {
+    for (CPDFPage *page in [[self pages] reverseObjectEnumerator]) {
+        if ((page == [self safePage:page]))
+            return page;
+    }
+    return nil;
+}
+
+- (BOOL)hasCharacters {
+    return [self safeFirstPage] != nil;
+}
+
+- (NSUInteger)safeIndexOfLastCharacterOnPage:(CPDFPage *)page {
+    if ([self respondsToSelector:@selector(numberOfTextRangesOnPage:)] && [self respondsToSelector:@selector(rangeAtIndex:onPage:)]) {
+        NSInteger i, count = [self numberOfTextRangesOnPage:page];
+        for (i = count - 1; i >= 0; i--) {
+            NSRange range = [self rangeAtIndex:i onPage:page];
+            if (range.length > 0)
+                return NSMaxRange(range) - 1;
+        }
+    }
+//    else if ([self respondsToSelector:@selector(indexOfCharactersOnPage:)]) {
+//        NSIndexSet *indexes = [self indexOfCharactersOnPage:page];
+//        if (indexes)
+//            return [indexes lastIndex];
+//    }
+    return NSNotFound;
+}
 
 
 @end
 @end

+ 3 - 0
PDF Office/PDF Master/Class/PDFWindowController/PDFListView/CPDFListViewExtension/CPDFListView+Extension.h

@@ -14,6 +14,9 @@
 
 
 @interface CPDFListView (Extension)
 @interface CPDFListView (Extension)
 
 
+- (void)setSpellingTag:(NSInteger)spellingTag;
+- (NSInteger)spellingTag;
+
 - (CPDFMarkupAnnotation *)addPDFSelection:(CPDFSelection *)currentSelection annotationTyoe:(CAnnotationType)annotationType;
 - (CPDFMarkupAnnotation *)addPDFSelection:(CPDFSelection *)currentSelection annotationTyoe:(CAnnotationType)annotationType;
 
 
 - (CPDFAnnotation *)addPDFStampAnotationWithPagePoint:(CGPoint)pagePoint withPage:(CPDFPage *)page;
 - (CPDFAnnotation *)addPDFStampAnotationWithPagePoint:(CGPoint)pagePoint withPage:(CPDFPage *)page;

+ 61 - 0
PDF Office/PDF Master/Class/PDFWindowController/PDFListView/CPDFListViewExtension/CPDFListView+Extension.m

@@ -17,6 +17,8 @@
 #import "CPDFListSignatureAnnotation+Private.h"
 #import "CPDFListSignatureAnnotation+Private.h"
 #import "CStampSignatureObject.h"
 #import "CStampSignatureObject.h"
 #import "NSGeometry+PDFListView.h"
 #import "NSGeometry+PDFListView.h"
+#import "CPDFSelection+PDFListView.h"
+#import <objc/runtime.h>
 
 
 @implementation CPDFListView (Extension)
 @implementation CPDFListView (Extension)
 
 
@@ -103,4 +105,63 @@
     return annotation;
     return annotation;
 }
 }
 
 
+- (void)checkSpelling:(id)sender {
+    CPDFSelection *selection = [self currentSelection];
+    CPDFPage *page;
+    NSUInteger idx, i, first, iMax = [[self document] pageCount];
+    BOOL didWrap = NO;
+    NSRange range;
+
+    if ([selection hasCharacters]) {
+        page = [selection safeLastPage];
+        idx = [selection safeIndexOfLastCharacterOnPage:page];
+        if (idx == NSNotFound)
+            idx = 0;
+    } else {
+        page = [self currentPage];
+        idx = 0;
+    }
+    
+    if (self.spellingTag == 0) {
+        self.spellingTag = [NSSpellChecker uniqueSpellDocumentTag];
+    }
+
+    i = first = [page pageIndex];
+    while (YES) {
+        range = [[NSSpellChecker sharedSpellChecker] checkSpellingOfString:[page string] startingAt:0 language:nil wrap:NO inSpellDocumentWithTag:self.spellingTag wordCount:NULL];
+        if (range.location != NSNotFound) break;
+        if (didWrap && i == first) break;
+        if (++i >= iMax) {
+            i = 0;
+            didWrap = YES;
+        }
+        page = [[self document] pageAtIndex:i];
+        idx = 0;
+    }
+
+    if (range.location != NSNotFound) {
+        selection = [page selectionForRange:range];
+        [self setCurrentSelection:selection];
+        [self goToRect:[selection boundsForPage:page] onPage:page];
+        [[NSSpellChecker sharedSpellChecker] updateSpellingPanelWithMisspelledWord:[selection string]];
+    } else NSBeep();
+}
+
+- (void)showGuessPanel:(id)sender {
+    [self checkSpelling:sender];
+    [[[NSSpellChecker sharedSpellChecker] spellingPanel] orderFront:self];
+}
+
+- (void)ignoreSpelling:(id)sender {
+    [[NSSpellChecker sharedSpellChecker] ignoreWord:[[sender selectedCell] stringValue] inSpellDocumentWithTag:self.spellingTag];
+}
+
+- (void)setSpellingTag:(NSInteger)spellingTag {
+    objc_setAssociatedObject(self, @selector(spellingTag), @(spellingTag), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+}
+
+- (NSInteger)spellingTag {
+    return [objc_getAssociatedObject(self, @selector(spellingTag)) integerValue];
+}
+
 @end
 @end

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

@@ -1126,6 +1126,9 @@ import Cocoa
     // 清理数据 [eg. 通知]
     // 清理数据 [eg. 通知]
     public func clearData() {
     public func clearData() {
         self.removeNotifications()
         self.removeNotifications()
+        if (self.listView.spellingTag() > 0) {
+            NSSpellChecker.shared.closeSpellDocument(withTag: self.listView.spellingTag())
+        }
     }
     }
     
     
     public func clearSecureOptions() {
     public func clearSecureOptions() {

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

@@ -80,3 +80,4 @@
 //广告
 //广告
 #import "KMRecommondManager.h"
 #import "KMRecommondManager.h"
 #import "KMCoverButton.h"
 #import "KMCoverButton.h"
+#import "CPDFListView+Extension.h"

+ 1 - 0
PDF Office/PDF Master/PDF_Master Pro-Bridging-Header.h

@@ -57,3 +57,4 @@
 //广告
 //广告
 #import "KMRecommondManager.h"
 #import "KMRecommondManager.h"
 #import "KMCoverButton.h"
 #import "KMCoverButton.h"
+#import "CPDFListView+Extension.h"

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

@@ -81,3 +81,4 @@
 //广告
 //广告
 #import "KMRecommondManager.h"
 #import "KMRecommondManager.h"
 #import "KMCoverButton.h"
 #import "KMCoverButton.h"
+#import "CPDFListView+Extension.h"