123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815 |
- //
- // CPDFDigtalView.m
- // PDF Reader Pro Edition
- //
- // Created by Niehaoyu on 2023/10/10.
- //
- #import "CPDFDigtalView.h"
- #import "CPDFAnnotation+PDFListView.h"
- #import "NSGeometry+PDFListView.h"
- #import "CPDFListViewConfig.h"
- #define HANDLE_SIZE 4.0
- #define MIN_NOTE_SIZE 8.0
- @implementation CPDFDigtalView
- - (void)drawRect:(NSRect)dirtyRect {
- [super drawRect:dirtyRect];
-
- // Drawing code here.
- }
- - (id)initWithFrame:(NSRect)frameRect {
- self = [super initWithFrame:frameRect];
- if (self) {
- [self setUp];
- }
- return self;
- }
- - (id)initWithCoder:(NSCoder *)decoder {
- self = [super initWithCoder:decoder];
- if (self) {
- [self setUp];
- }
- return self;
- }
- - (void)setUp {
-
- self.annotationType = CAnnotationTypeSignature;
- self.activeAnnotations = [NSMutableArray array];
- }
- - (void)setDocument:(CPDFDocument *)document {
- [super setDocument:document];
-
- NSArray *signatures = document.signatures;
-
- NSMutableArray *tempArr = [NSMutableArray array];
- for (CPDFSignature *signature in signatures) {
- if(signature.signers.count > 0) {
- [signature verifySignatureWithDocument:document];
- [tempArr addObject:signature];
- }
- }
- self.signatures = tempArr;
- }
- - (CPDFPage *)pageAndPoint:(NSPoint *)point forEvent:(NSEvent *)event nearest:(BOOL)nearest {
- NSPoint p = [self convertPoint:[event locationInWindow] fromView:nil];
- CPDFPage *page = [self pageForPoint:p nearest:nearest];
- if (page && point)
- *point = [self convertPoint:p toPage:page];
- return page;
- }
- - (void)setCursorForMouse:(NSEvent *)theEvent {
- if (theEvent == nil)
- theEvent = [NSEvent mouseEventWithType:NSEventTypeMouseMoved
- location:[[self window] mouseLocationOutsideOfEventStream]
- modifierFlags:[NSEvent standardPDFListViewModifierFlags]
- timestamp:0
- windowNumber:[[self window] windowNumber]
- context:nil
- eventNumber:0
- clickCount:1
- pressure:0.0];
- [self setCursorForAreaOfInterest:[self areaOfInterestForMouse:theEvent]];
- }
- - (CPDFAnnotation *)activeAnnotation {
- return self.activeAnnotations.lastObject;
- }
- - (void)mouseDown:(NSEvent *)theEvent {
- [self setCursorForMouse:theEvent];
-
- NSPoint point = NSZeroPoint;
- CPDFAreaOfInterest area = [self areaOfInterestForMouse:theEvent];
- NSPoint newpoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];
- area = [self areaOfInterestForPoint:newpoint];
- CPDFAnnotation *newActiveAnnotation = nil;
- if ([[self document] isLocked]) {
- [super mouseDown:theEvent];
- } else if ([self doClickAnnotationWithEvent:theEvent forAnnotation:&newActiveAnnotation]) {
- [self doDragAnnotationWithEvent:theEvent forAnnotation:newActiveAnnotation];
- } else {
- [self doDragAddAnnotationWithEvent:theEvent];
- }
-
- }
- - (BOOL)doClickAnnotationWithEvent:(NSEvent *)theEvent forAnnotation:(CPDFAnnotation **)annotation{
- CPDFAnnotation *newActiveAnnotation = nil;
- NSPoint point = NSZeroPoint;
- CPDFPage *page = [self pageAndPoint:&point forEvent:theEvent nearest:YES];
-
-
- NSMutableArray *currentActiveAnnotations = [NSMutableArray array];
- for (CPDFAnnotation *an in self.activeAnnotations) {
- if([an.page isEqual:page]) {
- if(!([an isKindOfClass:[CPDFMarkupAnnotation class]] || [an isKindOfClass:[CPDFTextAnnotation class]])) {
- [currentActiveAnnotations addObject:an];
- }
- }
- }
-
- newActiveAnnotation = [self doSelectAnnotationWithEvent:theEvent];
- *annotation = newActiveAnnotation;
- return !!newActiveAnnotation;
- }
- - (CPDFAnnotation *)doSelectAnnotationWithEvent:(NSEvent *)theEvent {
- CPDFAnnotation *newActiveAnnotation = nil;
- NSPoint point = NSZeroPoint;
- CPDFPage *page = [self pageAndPoint:&point forEvent:theEvent nearest:YES];
- id annotations = [page annotations];
-
- for (CPDFAnnotation *annotation in annotations) {
- if ([annotation hitTest:point] && [annotation annotationShouldDisplay] ) {
- newActiveAnnotation = annotation;
- break;
- }
- }
-
- return newActiveAnnotation;
- }
- - (void)doDragAnnotationWithEvent:(NSEvent *)theEvent forAnnotation:(CPDFAnnotation *)newActiveAnnotation {
- BOOL isContains = YES;
- if (self.activeAnnotations.count == 0 || ![self.activeAnnotations containsObject:newActiveAnnotation]) {
- isContains = NO;
- }
-
- NSRect originalBounds = [newActiveAnnotation bounds];
- BOOL isLine = [newActiveAnnotation isKindOfClass:[CPDFLineAnnotation class]];
- NSPoint pagePoint = NSZeroPoint;
- CPDFPage *page = [self pageAndPoint:&pagePoint forEvent:theEvent nearest:YES];
- NSPoint originalStartPoint = NSZeroPoint;
- NSPoint originalEndPoint = NSZeroPoint;
-
- BOOL draggedAnnotation = NO;
- NSEvent *lastMouseEvent = theEvent;
- NSPoint offset = CPDFListViewSubstractPoints(pagePoint, originalBounds.origin);
- NSUInteger eventMask = NSEventMaskLeftMouseUp | NSEventMaskLeftMouseDragged;
- CGFloat mouseOffset = [self unitWidthOnPage:page];
-
-
- while (YES) {
- theEvent = [[self window] nextEventMatchingMask:eventMask];
- if ([theEvent type] == NSEventTypeLeftMouseUp) {
- if(draggedAnnotation) {
- if (!isContains)
- [self.selectAnnotations removeAllObjects];
- } else {
- if(self.activeAnnotations.count == 1 &&
- self.activeAnnotation == newActiveAnnotation &&
- ([newActiveAnnotation isKindOfClass:[CPDFTextAnnotation class]] || [newActiveAnnotation isKindOfClass:[CPDFFreeTextAnnotation class]])) {
- [self editAnnotation:newActiveAnnotation];
- break;
- }
-
- if(!isContains) {
- [self updateActiveAnnotations:@[newActiveAnnotation]];
- }
- [self editAnnotation:newActiveAnnotation];
- }
- [self setNeedsDisplayAnnotationViewForPage:page];
- break;
- } else if ([theEvent type] == NSEventTypeLeftMouseDragged) {
- NSPoint point = NSZeroPoint;
- [self pageAndPoint:&point forEvent:theEvent nearest:YES];
- CGRect zRect = CGRectMake(pagePoint.x-2*mouseOffset, pagePoint.y-2*mouseOffset, 4*mouseOffset, 4*mouseOffset);
- if (CGRectContainsPoint(zRect, point)) {continue;}
-
- lastMouseEvent = theEvent;
- draggedAnnotation = YES;
- if(!isContains) {
- [self dragAnnotationReferenceLine:newActiveAnnotation];
-
- [self.selectAnnotations removeAllObjects];
- [self.selectAnnotations addObject:newActiveAnnotation];
-
- [self doMoveAnnotation:newActiveAnnotation withEvent:lastMouseEvent offset:offset];
- } else {
-
- if ([newActiveAnnotation isKindOfClass:[CPDFStampAnnotation class]] ||
- [newActiveAnnotation isKindOfClass:[CPDFFreeTextAnnotation class]] ||
- [newActiveAnnotation isKindOfClass:[CPDFSignatureAnnotation class]] ||
- [newActiveAnnotation isKindOfClass:[CPDFWidgetAnnotation class]]) {
- [newActiveAnnotation updateAppearanceStream];
- }
- }
- [self dragAnnotationReferenceLine:newActiveAnnotation];
-
- [self setNeedsDisplayAnnotationViewForPage:page];
- }
- }
-
- [self performSelector:@selector(setCursorForMouse:) withObject:theEvent afterDelay:0];
-
- }
- - (void)doMoveAnnotation:(CPDFAnnotation *)activeAnnotation withEvent:(NSEvent *)theEvent offset:(NSPoint)offset {
- // Move annotation.
- [[[self documentView] contentView] autoscroll:theEvent];
-
- NSPoint point = NSZeroPoint;
- CPDFPage *newActivePage = [self pageAndPoint:&point forEvent:theEvent nearest:YES];
-
- if (newActivePage) { // newActivePage should never be nil, but just to be sure
- if (newActivePage != [activeAnnotation page]) {
- return;
- }
-
- NSRect newBounds = [activeAnnotation bounds];
- newBounds.origin = CPDFListViewIntegralPoint(CPDFListViewSubstractPoints(point, offset));
- // constrain bounds inside page bounds
-
- }
- }
- - (void)dragAnnotationReferenceLine:(CPDFAnnotation *)annotation {
-
- // if ([self isAlignedWithOtherForms:annotation] && annotation) {
- // CGRect bounds = annotation.bounds;
- // NSRect rect = [self convertRect:bounds fromPage:self.currentPage];
- // [self drawLineOfDashByCAShapeLayer:rect];
- // }
- }
- - (void)editAnnotation:(CPDFAnnotation *)annotation {
- if ([annotation isKindOfClass:[CPDFFreeTextAnnotation class]]) {
- [self editAnnotationFreeText:(CPDFFreeTextAnnotation *)annotation];
- [[self window] makeFirstResponder:self];
-
- [self setNeedsDisplayAnnotation:annotation];
- } else {
- if([annotation isKindOfClass:[CPDFSignatureWidgetAnnotation class]]) {
- if([self.pdfListViewDelegate respondsToSelector:@selector(PDFListViewEditAnnotation:forAnnotation:)]) {
- [self.pdfListViewDelegate PDFListViewEditAnnotation:self forAnnotation:annotation];
- }
- }
- }
- }
- - (void)doDragAddAnnotationWithEvent:(NSEvent *)theEvent {
- NSPoint pagePoint = NSZeroPoint;
- CPDFPage *page = [self pageAndPoint:&pagePoint forEvent:theEvent nearest:YES];
- NSRect originalBounds = CGRectZero;
- CGFloat mouseOffset = [self unitWidthOnPage:page];
- // [self setCursorForAreaOfInterest:CAreaOfInterestForResizeHandle(CMaxXEdgeMask | CMinYEdgeMask, page)];
- CPDFAnnotation *annotation = nil;
-
- originalBounds = CPDFListViewRectFromCenterAndSquareSize(CPDFListViewIntegralPoint(pagePoint), 0.0);
- CRectEdges resizeHandle = CMaxXEdgeMask | CMinYEdgeMask;
-
- BOOL draggedAnnotation = NO;
- NSEvent *lastMouseEvent = theEvent;
- NSUInteger eventMask = NSEventMaskLeftMouseUp | NSEventMaskLeftMouseDragged;
- while (YES) {
- theEvent = [[self window] nextEventMatchingMask:eventMask];
- if ([theEvent type] == NSEventTypeLeftMouseUp) {
- if (!draggedAnnotation) {
- if (annotation) {
- break;
- }
- if(CAnnotationTypeLine == self.annotationType ||
- CAnnotationTypeArrow == self.annotationType) {
-
- } else {
-
- CGFloat defaultWidth = 72;
- CGFloat defaultHeight = 32;
- NSSize defaultSize = ([page rotation] % 180 == 0) ? NSMakeSize(defaultWidth, defaultHeight) : NSMakeSize(defaultHeight, defaultWidth);
- CGRect bounds = CGRectZero;
-
- bounds = CPDFListViewRectFromCenterAndSize(CPDFListViewIntegralPoint(pagePoint), defaultSize);
-
- bounds = CPDFListViewConstrainRect(bounds, page.bounds,[CPDFListViewConfig defaultManager].annotationBorderOffset.floatValue);
- annotation = [self addAnnotationWithType:self.annotationType selection:nil page:page bounds:bounds];
- originalBounds = [annotation bounds];
-
- if(annotation) {
- [self updateActiveAnnotations:@[annotation]];
- [self setNeedsDisplayAnnotation:annotation];
- } else if(self.activeAnnotations.count >0) {
- [self updateActiveAnnotations:@[]];
- [self setNeedsDisplayAnnotationViewForPage:page];
- }
- }
- } else {
-
- }
-
- break;
- } else if ([theEvent type] == NSEventTypeLeftMouseDragged) {
- CGPoint zPoint = pagePoint;
- [self pageAndPoint:&zPoint forEvent:theEvent nearest:YES];
- CGRect zRect = CGRectMake(pagePoint.x-2*mouseOffset, pagePoint.y-2*mouseOffset, 4*mouseOffset, 4*mouseOffset);
- if (CGRectContainsPoint(zRect, zPoint)) {continue;}
-
- if (annotation == nil)
- annotation = [self addAnnotationWithType:self.annotationType selection:nil page:page bounds:CPDFListViewRectFromCenterAndSquareSize(originalBounds.origin, 0.0)];
-
- if(annotation) {
- [self updateActiveAnnotations:@[annotation]];
- } else if(self.activeAnnotations.count >0) {
- [self updateActiveAnnotations:@[]];
- [self setNeedsDisplayAnnotationViewForPage:page];
- }
- lastMouseEvent = theEvent;
- draggedAnnotation = YES;
-
- [self setNeedsDisplayAnnotationViewForPage:page];
- }
- [self doResizeAnnotationWithEvent:lastMouseEvent fromPoint:pagePoint originalBounds:originalBounds resizeHandle:&resizeHandle];
- }
- if (annotation) {
- [self setNeedsDisplayAnnotation:annotation];
-
- if ([self.pdfListViewDelegate respondsToSelector:@selector(PDFListViewAddAnnotation:forAddAnnotation:inPage:)]) {
- [self.pdfListViewDelegate PDFListViewAddAnnotation:self forAddAnnotation:annotation inPage:page];
- }
- }
-
- [self performSelector:@selector(setCursorForMouse:) withObject:theEvent afterDelay:0];
- }
- - (void)setNeedsDisplayAnnotation:(CPDFAnnotation *)annotation {
- if (annotation) {
- [self setNeedsDisplayAnnotationViewForPage:annotation.page];
- } else {
- [self setNeedsDisplayAnnotationViewForVisiblePages];
- }
- }
- - (CGFloat)unitWidthOnPage:(CPDFPage *)page {
- return NSWidth([self convertRect:NSMakeRect(0.0, 0.0, 1.0, 1.0) toPage:page]);
- }
- - (CPDFAnnotation *)addAnnotationWithType:(CAnnotationType)annotationType selection:(CPDFSelection *)selection page:(CPDFPage *)page bounds:(NSRect)bounds {
- CPDFAnnotation *annotation = nil;
-
- NSString *text = [selection PDFListViewCleanedString];
-
- BOOL isInitial = NO;
- if(selection) {
- CGRect noteRect = selection.bounds;
- isInitial = NSEqualSizes(noteRect.size, NSZeroSize);
- } else {
- isInitial = NSEqualSizes(bounds.size, NSZeroSize);
- }
-
- if (isInitial)
- bounds = CPDFListViewRectFromCenterAndSquareSize(bounds.origin, 8.0);
- switch (annotationType) {
- case CAnnotationTypeSignature:
- annotation = [[CPDFSignatureWidgetAnnotation alloc] initPDFListViewNoteWithDocument:self.document];
- annotation.bounds = bounds;
- break;
- default:
- break;
- }
- if (annotation) {
- if (annotationType != CAnnotationTypeLine && annotationType != CAnnotationTypeArrow && annotationType != CAnnotationTypeInk && [text length] > 0)
- [annotation setString:text];
- [self addAnnotation:annotation toPage:page];
- }
- return annotation;
- }
- - (void)updateActiveAnnotations:(NSArray<CPDFAnnotation *> *)activeAnnotations {
- [self refreshActiveAnnotations:activeAnnotations isRight:NO];
- }
- - (void)addAnnotation:(CPDFAnnotation *)annotation toPage:(CPDFPage *)page {
- // [[[self undoManager] prepareWithInvocationTarget:self] removeAnnotation:annotation];
-
- [annotation setModificationDate:[NSDate date]];
- //widget设置作者与fieldName冲突
- if (![annotation isKindOfClass:[CPDFWidgetAnnotation class]]) {
- [annotation setUserName:CPDFKitShareConfig.annotationAuthor?:NSFullUserName()];
- }
- [page addAnnotation:annotation];
- [self setNeedsDisplayAnnotation:annotation];
- [[self undoManager] setActionName:NSLocalizedString(@"Add Note", @"Undo action name")];
- }
- - (void)refreshActiveAnnotations:(NSArray<CPDFAnnotation *> *)activeAnnotations isRight:(BOOL)isRight {
- if(activeAnnotations) {
- NSArray *selectTure = [activeAnnotations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF in %@", self.activeAnnotations]];
- BOOL isSame = NO;
- if(self.activeAnnotations.count == activeAnnotations.count && self.activeAnnotations.count == selectTure.count) isSame = YES;
-
- if(!isSame) {
- self.activeAnnotations = [NSMutableArray arrayWithArray:activeAnnotations];
- }
- } else if (!activeAnnotations && self.activeAnnotations.count > 0) {
- [self.activeAnnotations removeAllObjects];
- }
- }
- - (void)doResizeAnnotationWithEvent:(NSEvent *)theEvent fromPoint:(NSPoint)originalPagePoint originalBounds:(NSRect)originalBounds resizeHandle:(CRectEdges *)resizeHandlePtr {
- CPDFAnnotation *activeAnnotation = self.activeAnnotation;
- NSPoint pagePoint = NSZeroPoint;
- CPDFPage *page = activeAnnotation?activeAnnotation.page:[self pageAndPoint:&pagePoint forEvent:theEvent nearest:YES];
- NSRect newBounds = originalBounds;
- NSRect pageBounds = [page boundsForBox:[self displayBox]];
- NSPoint currentPagePoint = [self convertPoint:[theEvent locationInPDFListView:self] toPage:page];
- NSPoint relPoint = CPDFListViewSubstractPoints(currentPagePoint, originalPagePoint);
- CRectEdges resizeHandle = *resizeHandlePtr;
-
- if (NSEqualSizes(originalBounds.size, NSZeroSize)) {
- CRectEdges currentResizeHandle = (relPoint.x < 0.0 ? CMinXEdgeMask : CMaxXEdgeMask) | (relPoint.y <= 0.0 ? CMinYEdgeMask : CMaxYEdgeMask);
- if (currentResizeHandle != resizeHandle) {
- *resizeHandlePtr = resizeHandle = currentResizeHandle;
- // [self setCursorForAreaOfInterest:CAreaOfInterestForResizeHandle(resizeHandle, page)];
- }
- }
-
- BOOL isRadioOrCheckButton = NO;
- if ([activeAnnotation isKindOfClass:[CPDFButtonWidgetAnnotation class]]) {
- CPDFButtonWidgetAnnotation *annotation = (CPDFButtonWidgetAnnotation *)activeAnnotation;
- if (CPDFWidgetRadioButtonControl == annotation.controlType ||
- CPDFWidgetCheckBoxControl == annotation.controlType) {
- isRadioOrCheckButton = YES;
- }
- }
-
- CGFloat minWidth = MIN_NOTE_SIZE;
- CGFloat minHeight = MIN_NOTE_SIZE;
- CGFloat offsetPageSet = 2;
- if ((resizeHandle & CMaxXEdgeMask)) {
- newBounds.size.width += relPoint.x;
- if (NSMaxX(newBounds)+offsetPageSet > NSMaxX(pageBounds))
- newBounds.size.width = NSMaxX(pageBounds) - NSMinX(newBounds)-offsetPageSet;
- if (NSWidth(newBounds) < minWidth) {
- newBounds.size.width = minWidth;
- }
- } else if ((resizeHandle & CMinXEdgeMask)) {
- newBounds.origin.x += relPoint.x;
- newBounds.size.width -= relPoint.x;
- if (NSMinX(newBounds)-offsetPageSet < NSMinX(pageBounds)) {
- newBounds.size.width = NSMaxX(newBounds) - NSMinX(pageBounds)-offsetPageSet;
- newBounds.origin.x = NSMinX(pageBounds)+offsetPageSet;
- }
- if (NSWidth(newBounds) < minWidth) {
- newBounds.origin.x = NSMaxX(newBounds) - minWidth;
- newBounds.size.width = minWidth;
- }
- }
- if ((resizeHandle & CMaxYEdgeMask)) {
- newBounds.size.height += relPoint.y;
- if (NSMaxY(newBounds)+ offsetPageSet > NSMaxY(pageBounds)) {
- newBounds.size.height = NSMaxY(pageBounds) - NSMinY(newBounds)- offsetPageSet;
- }
- if (NSHeight(newBounds) < minHeight) {
- newBounds.size.height = minHeight;
- }
-
- } else if ((resizeHandle & CMinYEdgeMask)) {
- newBounds.origin.y += relPoint.y;
- newBounds.size.height -= relPoint.y;
- if (NSMinY(newBounds)-offsetPageSet < NSMinY(pageBounds)) {
- newBounds.size.height = NSMaxY(newBounds) - NSMinY(pageBounds)-offsetPageSet;
- newBounds.origin.y = NSMinY(pageBounds)+offsetPageSet;
- }
- if (NSHeight(newBounds) < minHeight) {
- newBounds.origin.y = NSMaxY(newBounds) - minHeight;
- newBounds.size.height = minHeight;
- }
- }
-
- [activeAnnotation setBounds:NSIntegralRect(newBounds)];
-
- if ([activeAnnotation isKindOfClass:[CPDFFreeTextAnnotation class]]) {
- [self updateAnnotationFreeTextBounds:(CPDFFreeTextAnnotation *)activeAnnotation];
- }
- }
- #pragma mark - NSMenu
- - (NSMenu *)menuForEvent:(NSEvent *)event {
- if (self.annotationType == CAnnotationTypeInk || self.annotationType == CAnnotationTypeEraser) {
- return nil;
- }
- NSMenu *menu = [super menuForEvent:event];
- if(!menu)
- menu = [[NSMenu alloc] init];
-
- NSPoint pagePoint = NSZeroPoint;
- CPDFPage *page = [self pageAndPoint:&pagePoint forEvent:event nearest:YES];
- NSMenuItem * copyItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Copy", @"PDFListView") action:@selector(copy:) keyEquivalent:@"c"];
-
- NSMenuItem * pasteItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Paste", @"PDFListView") action:@selector(menuItemClick_Paste:) keyEquivalent:@"v"];
- pasteItem.representedObject = event;
- NSMenuItem * cutItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Cut", @"PDFListView") action:@selector(cut:) keyEquivalent:@"x"];
-
- NSMenuItem * deleteItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Delete", @"PDFListView") action:@selector(delete:) keyEquivalent:@""];
-
- NSMenu *subMenu = nil;
- NSMenuItem * arrangementItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Arrangement", @"PDFListView") action:nil keyEquivalent:@""];
- subMenu = [[NSMenu alloc] init];
-
- NSMenuItem * bringForwardItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Bring Forward", @"PDFListView") action:@selector(menuItemClick_BringForward:) keyEquivalent:@""];
- NSMenuItem * sendBackForwardItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Send Backward", @"PDFListView") action:@selector(menuItemClick_SendBackward:) keyEquivalent:@""];
- NSMenuItem * bringFrontItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Bring to Front", @"PDFListView") action:@selector(menuItemClick_BringFront:) keyEquivalent:@""];
- NSMenuItem * sendBackItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Send to Back", @"PDFListView") action:@selector(menuItemClick_SendBack:) keyEquivalent:@""];
- [subMenu addItem:bringForwardItem];
- [subMenu addItem:sendBackForwardItem];
- [subMenu addItem:bringFrontItem];
- [subMenu addItem:sendBackItem];
- arrangementItem.submenu = subMenu;
-
- NSMenuItem * editNoteItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Edit Note", @"PDFListView") action:@selector(menuItemClick_EditNote:) keyEquivalent:@""];
- if(0) {
-
-
- } else {
- CPDFAnnotation *annotation = nil;
-
- for (CPDFAnnotation *tAnnotation in page.annotations) {
- if ([tAnnotation hitTest:pagePoint]) {
- annotation = tAnnotation;
- break;
- }
- }
-
- if (annotation && [annotation isKindOfClass:[CPDFWidgetAnnotation class]] ){
-
- }
-
- if(annotation) {
- if(![self.activeAnnotations containsObject:annotation]) {
- [self updateIsRightActiveAnnotations:@[annotation]];
- [self setNeedsDisplayAnnotation:annotation];
- }
- }
-
- if(annotation && [annotation isKindOfClass:[CPDFWidgetAnnotation class]]) {
- annotation = nil;
- } else if(annotation && [annotation isKindOfClass:[CPDFRedactAnnotation class]]) {
- annotation = nil;
- } else if (annotation && [annotation isKindOfClass:[CPDFInkAnnotation class]] && [self annotationType] == CAnnotationTypeInk) {
- annotation = nil;
- }
-
- CPDFSelection *selection = [self creatImageCurrentSelectionForPoint:[event locationInPDFListView:self]];
- if(selection && CPDFSelectionTypeImage == [selection selectionType] && !self.activeAnnotation){
- self.currentSelection = selection;
- }
-
- NSMenu *subMenu = [[NSMenu alloc] init];
- if(self.activeAnnotations.count == 1) {
- // NSMenuItem * lineStyleItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Line Style", @"PDFListView") action:@selector(menuItemClick_LineStyle:) keyEquivalent:@""];
- //
- // subMenu = [[NSMenu alloc] init];
- // NSMenuItem * lineSolidItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Solid", @"PDFListView") action:@selector(menuItemClick_LineStyle:) keyEquivalent:@""];
- // lineSolidItem.tag = CPDFBorderStyleSolid;
- // NSMenuItem * lineDashedItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Dashed", @"PDFListView") action:@selector(menuItemClick_LineStyle:) keyEquivalent:@""];
- // lineDashedItem.tag = CPDFBorderStyleDashed;
- //
- // [subMenu addItem:lineSolidItem];
- // [subMenu addItem:lineDashedItem];
- // lineStyleItem.submenu = subMenu;
- //
- // NSMenuItem * changeColorItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Color...", @"PDFListView") action:@selector(menuItemClick_ChangeColor:) keyEquivalent:@""];
- // [menu insertItem:arrangementItem atIndex:0];
- // [menu insertItem:[NSMenuItem separatorItem] atIndex:0];
- // if([self.activeAnnotation isKindOfClass:[CPDFMarkupAnnotation class]] ||
- // [self.activeAnnotation isKindOfClass:[CPDFStampAnnotation class]] ||
- // [self.activeAnnotation isKindOfClass:[CPDFSignatureAnnotation class]]) {
- // [menu insertItem:editNoteItem atIndex:0];
- // } else if ([self.activeAnnotation isKindOfClass:[CPDFInkAnnotation class]]) {
- // [menu insertItem:editNoteItem atIndex:0];
- // [menu insertItem:lineStyleItem atIndex:0];
- // [menu insertItem:changeColorItem atIndex:0];
- // } else if ([self.activeAnnotation isKindOfClass:[CPDFTextAnnotation class]]) {
- // [menu insertItem:editNoteItem atIndex:0];
- // [menu insertItem:changeColorItem atIndex:0];
- // } else if ([self.activeAnnotation isKindOfClass:[CPDFSquareAnnotation class]] ||
- // [self.activeAnnotation isKindOfClass:[CPDFCircleAnnotation class]] ||
- // [self.activeAnnotation isKindOfClass:[CPDFLineAnnotation class]]) {
- // [menu insertItem:editNoteItem atIndex:0];
- // if([self.activeAnnotation isKindOfClass:[CPDFLineAnnotation class]]) {
- // NSMenuItem * directionItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Direction", @"PDFListView") action:nil keyEquivalent:@""];
- // subMenu = [[NSMenu alloc]init];
- //
- // NSMenuItem * lineHorizontalItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Horizontal", @"PDFListView") action:@selector(menuItemClick_LineHorizontal:) keyEquivalent:@""];
- // NSMenuItem * lineVerticalItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Vertical", @"PDFListView") action:@selector(menuItemClick_LineVertical:) keyEquivalent:@""];
- // [subMenu addItem:lineHorizontalItem];
- // [subMenu addItem:lineVerticalItem];
- // directionItem.submenu = subMenu;
- //
- // [menu insertItem:directionItem atIndex:0];
- // }
- // [menu insertItem:lineStyleItem atIndex:0];
- // [menu insertItem:changeColorItem atIndex:0];
- // }
- if ([self.activeAnnotation isKindOfClass:[CPDFSignatureWidgetAnnotation class]]) {
- CPDFSignatureWidgetAnnotation *aa = (CPDFSignatureWidgetAnnotation *)self.activeAnnotation;
- CPDFSignature *aaa = aa.signature;
- [menu insertItem:[NSMenuItem separatorItem] atIndex:0];
- [menu insertItem:deleteItem atIndex:0];
- }
- // if(![self.activeAnnotation isKindOfClass:[CPDFMarkupAnnotation class]]) {
- // if ([[NSPasteboard generalPasteboard] canReadObjectForClasses:[NSArray arrayWithObjects:[CPDFAnnotation class], [NSString class],[NSImage class], nil] options:[NSDictionary dictionary]]) {
- // [menu insertItem:pasteItem atIndex:0];
- // }
- // [menu insertItem:cutItem atIndex:0];
- // }
- // [menu insertItem:copyItem atIndex:0];
- __block typeof(self) blockSelf = self;
-
- } else if (self.activeAnnotations.count > 1) {
- BOOL isMarkupAn = NO;
- for (CPDFAnnotation *annotation in self.activeAnnotations) {
- if([annotation isKindOfClass:[CPDFMarkupAnnotation class]]) {
- isMarkupAn = YES;
- break;
- }
- }
-
- // [menu insertItem:arrangementItem atIndex:0];
- [menu insertItem:[NSMenuItem separatorItem] atIndex:0];
- [menu insertItem:deleteItem atIndex:0];
- if(!isMarkupAn) {
- [menu insertItem:cutItem atIndex:0];
- [menu insertItem:copyItem atIndex:0];
- }
- } else if (self.currentSelection) {
- if(CPDFSelectionTypeImage == [self.currentSelection selectionType]) {
- NSMenuItem * exportImageItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Export…", nil) action:@selector(menuItemClick_ExportImage:) keyEquivalent:@""];
- [menu insertItem:exportImageItem atIndex:0];
- [menu insertItem:[NSMenuItem separatorItem] atIndex:0];
- }
- if ([[NSPasteboard generalPasteboard] canReadObjectForClasses:[NSArray arrayWithObjects:[CPDFAnnotation class], [NSString class],[NSImage class], nil] options:[NSDictionary dictionary]]) {
- [menu insertItem:pasteItem atIndex:0];
- }
- [menu insertItem:copyItem atIndex:0];
- } else if (!self.activeAnnotation) {
- // NSMenuItem * pageDisplayItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Page Display", @"PDFListView") action:nil keyEquivalent:@""];
- // subMenu = [[NSMenu alloc] init];
- //
- // NSMenuItem * twoPagesContinuousItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Two Pages Continuous", @"PDFListView") action:@selector(menuItemClick_TwoPagesContinuous:) keyEquivalent:@""];
- // NSMenuItem * twoPagesItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Two Pages", @"PDFListView") action:@selector(menuItemClick_TwoPages:) keyEquivalent:@""];
- // NSMenuItem * singlePageContinuousItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Single Page Continuous", @"PDFListView") action:@selector(menuItemClick_SinglePagesContinuous:) keyEquivalent:@""];
- // NSMenuItem * singlePageItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Single Page", @"PDFListView") action:@selector(menuItemClick_SinglePage:) keyEquivalent:@""];
- // NSMenuItem * bookModeItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Book Mode", @"PDFListView") action:@selector(menuItemClick_BookMode:) keyEquivalent:@""];
- // switch (self.displayViewMode) {
- // case CPDFDisplayViewSinglePageContinuous:
- // singlePageContinuousItem.state = NSControlStateValueOn;
- // break;
- // case CPDFDisplayViewTwoUp:
- // if (self.displaysAsBook)
- // bookModeItem.state = NSControlStateValueOn;
- // else
- // twoPagesItem.state = NSControlStateValueOn;
- // break;
- // case CPDFDisplayViewTwoUpContinuous:
- // if (self.displaysAsBook)
- // bookModeItem.state = NSControlStateValueOn;
- // else
- // twoPagesContinuousItem.state = NSControlStateValueOn;
- // break;
- // default:
- // case CPDFDisplayViewSinglePage:
- // singlePageItem.state = NSControlStateValueOn;
- // break;
- // }
- //
- // [subMenu addItem:singlePageItem];
- // [subMenu addItem:singlePageContinuousItem];
- // [subMenu addItem:twoPagesItem];
- // [subMenu addItem:twoPagesContinuousItem];
- // [subMenu addItem:bookModeItem];
- // pageDisplayItem.submenu = subMenu;
- //
- // [menu insertItem:pageDisplayItem atIndex:0];
- //
- // NSMenuItem *zoomItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Zoom", @"PDFListView") action:nil keyEquivalent:@""];
- // subMenu = [[NSMenu alloc]init];
- //
- // NSMenuItem * fitWidthItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Fit Width", @"PDFListView") action:@selector(menuItemClick_FitWidth:) keyEquivalent:@""];
- // NSMenuItem * automaticallyItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Automatically Resize", @"PDFListView") action:@selector(menuItemClick_AutomaticallyResize:) keyEquivalent:@""];
- // NSMenuItem * actualSizeItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Actual Size", @"PDFListView") action:@selector(menuItemClick_ActualSize:) keyEquivalent:@""];
- // NSMenuItem * zoomInItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Zoom In", @"PDFListView") action:@selector(menuItemClick_ZoomIn:) keyEquivalent:@""];
- // NSMenuItem * zoomOutItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Zoom Out", @"PDFListView") action:@selector(menuItemClick_ZoomOut:) keyEquivalent:@""];
- //
- // NSMenuItem * hidenShowNoteItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Hide Notes", @"PDFListView") action:@selector(menuItemClick_HidenorShowNote:) keyEquivalent:@""];
- //
- // if (self.autoScales) {
- // automaticallyItem.state = NSControlStateValueOn;
- // } else if (self.scaleFactor == 1.0) {
- // actualSizeItem.state = NSControlStateValueOn;
- // }
- //
- //
- //
- // [subMenu addItem:fitWidthItem];
- // [subMenu addItem:automaticallyItem];
- // [subMenu addItem:actualSizeItem];
- // [subMenu addItem:zoomInItem];
- // [subMenu addItem:zoomOutItem];
- // zoomItem.submenu = subMenu;
- // [menu insertItem:zoomItem atIndex:0];
- //
- // [menu insertItem:[NSMenuItem separatorItem] atIndex:0];
- // [menu insertItem:hidenShowNoteItem atIndex:0];
- // [menu insertItem:[NSMenuItem separatorItem] atIndex:0];
- // [menu insertItem:pasteItem atIndex:0];
- }
- }
-
- // if ([self.pdfListViewDelegate respondsToSelector:@selector(PDFListViewMenuForEvent:forEvent:clickMenu:)]) {
- // [self.pdfListViewDelegate PDFListViewMenuForEvent:self forEvent:event clickMenu:&menu];
- // }
-
- return menu;
- }
- - (void)updateIsRightActiveAnnotations:(NSArray<CPDFAnnotation *> *)activeAnnotations {
- [self refreshActiveAnnotations:activeAnnotations isRight:YES];
- }
- - (IBAction)delete:(id)sender {
- if (self.activeAnnotations.count > 0 ) {
- NSMutableArray *tarr = [NSMutableArray arrayWithArray:self.activeAnnotations];
- for (CPDFAnnotation * an in tarr) {
- // if(self.hoverAnnotation == an) {
- // self.hoverAnnotation = nil;
- // }
- [self removeAnnotation:an];
- [[self undoManager] setActionName:NSLocalizedString(@"Remove Note", @"Undo action name")];
- if([an isKindOfClass:[CPDFFreeTextAnnotation class]]) {
- CPDFFreeTextAnnotation *freeTextAn = (CPDFFreeTextAnnotation *)an;
- if ([self isEditWithCurrentFreeText:freeTextAn]) {
- [self commitEditAnnotationFreeText:freeTextAn];
- }
- }
- }
- [self removeActiveAnnotations:tarr];
- } else {
- NSBeep();
- }
- }
- - (void)removeAnnotation:(CPDFAnnotation *)annotation {
- CPDFAnnotation *wasAnnotation = annotation;
- CPDFPage *page = wasAnnotation.page;
-
- [[[self undoManager] prepareWithInvocationTarget:self] addAnnotation:wasAnnotation toPage:page];
-
- [page removeAnnotation:wasAnnotation];
- [self annotationsChangedOnPage:page];
- [self setNeedsDisplayAnnotation:wasAnnotation];
- // dispatch_async(dispatch_get_main_queue(), ^{
- // [[NSNotificationCenter defaultCenter] postNotificationName:CPDFListViewDidRemoveAnnotationNotification object:self
- // userInfo:[NSDictionary dictionaryWithObjectsAndKeys:wasAnnotation, CPDFListViewAnnotationKey, page, CPDFListViewPageKey, nil]];
- // });
- //
- // if([self.pdfListViewDelegate respondsToSelector:@selector(PDFListViewRemoveAnnotations:forRemoveAnnotations:inPage:)])
- // [self.pdfListViewDelegate PDFListViewRemoveAnnotations:self forRemoveAnnotations:@[annotation] inPage:page];
- }
- - (void)removeActiveAnnotations:(NSArray<CPDFAnnotation *> *)removeAnnotations {
- BOOL isContains = NO;
- NSMutableArray *tarr = [NSMutableArray arrayWithArray:self.activeAnnotations];
- [tarr removeObjectsInArray:removeAnnotations];
- self.activeAnnotations = tarr;
- isContains = YES;
- // if(isContains) {
- // if([self.pdfListViewDelegate respondsToSelector:@selector(PDFListViewChangeatioActiveAnnotations:forActiveAnnotations:isRightMenu:)])
- // [self.pdfListViewDelegate PDFListViewChangeatioActiveAnnotations:self forActiveAnnotations:self.activeAnnotations isRightMenu:NO];
- //
- // dispatch_async(dispatch_get_main_queue(), ^{
- // [[NSNotificationCenter defaultCenter] postNotificationName:CPDFListViewActiveAnnotationsChangeNotification object:self];
- // });
- // }
- }
- @end
|