123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384 |
- //
- // KMTableView.swift
- // PDF Master
- //
- // Created by tangchao on 2023/11/16.
- //
- import Cocoa
- /*
- @protocol SKTableViewDelegate <NSTableViewDelegate>
- - (id <SKImageToolTipContext>)tableView:(NSTableView *)aTableView imageContextForRow:(NSInteger)rowIndex;
- - (NSArray *)tableView:(NSTableView *)aTableView typeSelectHelperSelectionStrings:(SKTypeSelectHelper *)aTypeSelectHelper;
- - (void)tableView:(NSTableView *)aTableView typeSelectHelper:(SKTypeSelectHelper *)aTypeSelectHelper didFailToFindMatchForSearchString:(NSString *)searchString;
- - (void)tableView:(NSTableView *)aTableView typeSelectHelper:(SKTypeSelectHelper *)aTypeSelectHelper updateSearchString:(NSString *)searchString;
- @end
- */
- @objc protocol KMBotaTableViewDelegate: NSTableViewDelegate {
- @objc optional func tableView(_ aTableView: NSTableView, deleteRowsWithIndexes rowIndexes: IndexSet)
- @objc optional func tableView(_ aTableView: NSTableView, canDeleteRowsWithIndexes rowIndexes: IndexSet) -> Bool
-
- @objc optional func tableView(_ aTableView: NSTableView, copyRowsWithIndexes rowIndexes: IndexSet)
- @objc optional func tableView(_ aTableView: NSTableView, canCopyRowsWithIndexes rowIndexes: IndexSet) -> Bool
-
- @objc optional func tableView(_ aTableView: NSTableView, pasteFromPasteboard pboard: NSPasteboard)
- @objc optional func tableView(_ aTableView: NSTableView, canPasteFromPasteboard pboard: NSPasteboard) -> Bool
-
- @objc optional func tableViewMoveLeft(_ aTableView: NSTableView)
- @objc optional func tableViewMoveRight(_ aTableView: NSTableView)
- }
- class KMBotaTableView: NSTableView {
- /*
- @interface SKTableView : NSTableView <SKTypeSelectDelegate> {
- NSMutableSet *trackingAreas;
- SKTypeSelectHelper *typeSelectHelper;
- BOOL supportsQuickLook;
- }
- @property (nonatomic, readonly) BOOL canDelete, canCopy, canPaste;
- @property (nonatomic) BOOL hasImageToolTips, supportsQuickLook;
- @property (nonatomic, retain) SKTypeSelectHelper *typeSelectHelper;
- - (void)delete:(id)sender;
- - (void)copy:(id)sender;
- - (void)paste:(id)sender;
- - (void)scrollToBeginningOfDocument:(id)sender;
- - (void)scrollToEndOfDocument:(id)sender;
- - (void)moveLeft:(id)sender;
- - (void)moveRight:(id)sender;
- - (id <SKTableViewDelegate>)delegate;
- - (void)setDelegate:(id <SKTableViewDelegate>)newDelegate;
- @end
- */
- override func draw(_ dirtyRect: NSRect) {
- super.draw(dirtyRect)
- // Drawing code here.
- }
-
- // override var delegate: NSTableViewDelegate? {
- // get {
- //
- // }
- // set {
- //
- // }
- // }
-
- /*
- @interface SKTableView (SKPrivate)
- - (void)rebuildTrackingAreas;
- @end
- @implementation SKTableView
- @synthesize typeSelectHelper, supportsQuickLook;
- @dynamic canDelete, canCopy, canPaste, hasImageToolTips;
- - (void)dealloc {
- [typeSelectHelper setDelegate:nil];
- SKDESTROY(typeSelectHelper);
- SKDESTROY(trackingAreas);
- [super dealloc];
- }
- - (void)setTypeSelectHelper:(SKTypeSelectHelper *)newTypeSelectHelper {
- if (typeSelectHelper != newTypeSelectHelper) {
- if ([typeSelectHelper delegate] == self)
- [typeSelectHelper setDelegate:nil];
- [typeSelectHelper release];
- typeSelectHelper = [newTypeSelectHelper retain];
- [typeSelectHelper setDelegate:self];
- }
- }
- - (void)reloadData {
- [super reloadData];
- [self rebuildTrackingAreas];
- [typeSelectHelper rebuildTypeSelectSearchCache];
- }
- - (void)keyDown:(NSEvent *)theEvent {
- unichar eventChar = [theEvent firstCharacter];
- NSUInteger modifierFlags = [theEvent deviceIndependentModifierFlags];
-
- if ((eventChar == NSNewlineCharacter || eventChar == NSEnterCharacter || eventChar == NSCarriageReturnCharacter) && modifierFlags == 0) {
- if ([self doubleAction] == NULL || [self sendAction:[self doubleAction] to:[self target]] == NO)
- NSBeep();
- } else if ((eventChar == NSDeleteCharacter || eventChar == NSDeleteFunctionKey) && modifierFlags == 0 && [self canDelete]) {
- [self delete:self];
- } else if ((eventChar == SKSpaceCharacter) && modifierFlags == 0) {
- if (supportsQuickLook == NO)
- [[self enclosingScrollView] pageDown:nil];
- else if ([QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible])
- [[QLPreviewPanel sharedPreviewPanel] orderOut:nil];
- else
- [[QLPreviewPanel sharedPreviewPanel] makeKeyAndOrderFront:nil];
- } else if ((eventChar == SKSpaceCharacter) && modifierFlags == NSShiftKeyMask) {
- if (supportsQuickLook == NO)
- [[self enclosingScrollView] pageUp:nil];
- } else if (eventChar == NSHomeFunctionKey && (modifierFlags & ~NSFunctionKeyMask) == 0) {
- [self scrollToBeginningOfDocument:nil];
- } else if (eventChar == NSEndFunctionKey && (modifierFlags & ~NSFunctionKeyMask) == 0) {
- [self scrollToEndOfDocument:nil];
- } else if (eventChar == NSLeftArrowFunctionKey && modifierFlags == 0) {
- [self moveLeft:nil];
- } else if (eventChar == NSRightArrowFunctionKey && modifierFlags == 0) {
- [self moveRight:nil];
- } else if ([typeSelectHelper handleEvent:theEvent] == NO) {
- [super keyDown:theEvent];
- }
- }
- - (void)scrollToBeginningOfDocument:(id)sender {
- if ([self numberOfRows])
- [self scrollRowToVisible:0];
- }
- - (void)scrollToEndOfDocument:(id)sender {
- if ([self numberOfRows])
- [self scrollRowToVisible:[self numberOfRows] - 1];
- }
- - (void)moveLeft:(id)sender {
- if ([[self delegate] respondsToSelector:@selector(tableViewMoveLeft:)])
- [[self delegate] tableViewMoveLeft:self];
- }
- - (void)moveRight:(id)sender {
- if ([[self delegate] respondsToSelector:@selector(tableViewMoveRight:)])
- [[self delegate] tableViewMoveRight:self];
- }
- - (BOOL)canDelete {
- NSIndexSet *indexes = [self selectedRowIndexes];
- if ([indexes count] && [[self delegate] respondsToSelector:@selector(tableView:deleteRowsWithIndexes:)]) {
- if ([[self delegate] respondsToSelector:@selector(tableView:canDeleteRowsWithIndexes:)])
- return [[self delegate] tableView:self canDeleteRowsWithIndexes:indexes];
- else
- return YES;
- }
- return NO;
- }
- - (void)delete:(id)sender {
- if ([self canDelete])
- [[self delegate] tableView:self deleteRowsWithIndexes:[self selectedRowIndexes]];
- else
- NSBeep();
- }
- - (BOOL)canCopy {
- NSIndexSet *indexes = [self selectedRowIndexes];
- if ([indexes count] && [[self delegate] respondsToSelector:@selector(tableView:copyRowsWithIndexes:)]) {
- if ([[self delegate] respondsToSelector:@selector(tableView:canCopyRowsWithIndexes:)])
- return [[self delegate] tableView:self canCopyRowsWithIndexes:indexes];
- else
- return YES;
- }
- return NO;
- }
- - (void)copy:(id)sender {
- if ([self canCopy])
- [[self delegate] tableView:self copyRowsWithIndexes:[self selectedRowIndexes]];
- else
- NSBeep();
- }
- - (BOOL)canPaste {
- if ([[self delegate] respondsToSelector:@selector(tableView:pasteFromPasteboard:)]) {
- if ([[self delegate] respondsToSelector:@selector(tableView:canPasteFromPasteboard:)])
- return [[self delegate] tableView:self canPasteFromPasteboard:[NSPasteboard generalPasteboard]];
- else
- return YES;
- }
- return NO;
- }
- - (void)paste:(id)sender {
- if ([self canPaste])
- [[self delegate] tableView:self pasteFromPasteboard:[NSPasteboard generalPasteboard]];
- else
- NSBeep();
- }
- - (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
- if ([menuItem action] == @selector(delete:))
- return [self canDelete];
- else if ([menuItem action] == @selector(copy:))
- return [self canCopy];
- else if ([menuItem action] == @selector(paste:))
- return [self canPaste];
- else if ([menuItem action] == @selector(selectAll:))
- return [self allowsMultipleSelection];
- else if ([menuItem action] == @selector(deselectAll:))
- return [self allowsEmptySelection];
- else if ([[SKTableView superclass] instancesRespondToSelector:@selector(validateMenuItem:)])
- return [super validateMenuItem:menuItem];
- return YES;
- }
- - (NSFont *)font {
- for (NSTableColumn *tc in [self tableColumns]) {
- NSCell *cell = [tc dataCell];
- if ([cell type] == NSTextCellType)
- return [cell font];
- }
- return nil;
- }
- - (void)setFont:(NSFont *)font {
- for (NSTableColumn *tc in [self tableColumns]) {
- NSCell *cell = [tc dataCell];
- if ([cell type] == NSTextCellType)
- [cell setFont:font];
- }
-
- [self setRowHeight:[font defaultViewLineHeight]];
- [self noteHeightOfRowsWithIndexesChanged:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [self numberOfRows])]];
- }
- - (NSImage *)dragImageForRowsWithIndexes:(NSIndexSet *)dragRows tableColumns:(NSArray *)tableColumns event:(NSEvent *)dragEvent offset:(NSPointPointer)dragImageOffset{
- return [super dragImageForRowsWithIndexes:dragRows tableColumns:[[self tableColumns] subarrayWithRange:NSMakeRange(0, 1)] event:dragEvent offset:dragImageOffset];
- }
- #pragma mark Tracking
- - (void)removeTrackingAreas {
- if (trackingAreas == nil)
- return;
-
- for (NSTrackingArea *area in trackingAreas)
- [self removeTrackingArea:area];
- [trackingAreas removeAllObjects];
- }
- - (void)addTrackingAreaForRow:(NSInteger)row {
- if (trackingAreas == nil)
- return;
-
- NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInteger:row], @"row", nil];
- NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self rectOfRow:row] options:NSTrackingMouseEnteredAndExited | NSTrackingActiveInActiveApp owner:self userInfo:userInfo];
- [self addTrackingArea:area];
- [trackingAreas addObject:area];
- [area release];
- [userInfo release];
- }
- - (void)rebuildTrackingAreas {
- if (trackingAreas == nil || [[self delegate] respondsToSelector:@selector(tableView:imageContextForRow:)] == NO)
- return;
-
- [self removeTrackingAreas];
-
- if ([self window]) {
- NSRect visibleRect = [self visibleRect];
- NSRange rowRange = [self rowsInRect:visibleRect];
- NSUInteger row;
-
- for (row = rowRange.location; row < NSMaxRange(rowRange); row++)
- [self addTrackingAreaForRow:row];
- }
- }
- - (void)updateTrackingAreas {
- [super updateTrackingAreas];
- [self rebuildTrackingAreas];
- }
- - (void)noteNumberOfRowsChanged {
- [super noteNumberOfRowsChanged];
- [self rebuildTrackingAreas];
- }
- - (void)mouseEntered:(NSEvent *)theEvent{
- if (trackingAreas == nil)
- return;
-
- NSDictionary *userInfo = [theEvent userData];
- NSNumber *rowNumber = [userInfo objectForKey:@"row"];
- if (rowNumber) {
- id <SKImageToolTipContext> context = [[self delegate] tableView:self imageContextForRow:[rowNumber integerValue]];
- if (context)
- [[SKImageToolTipWindow sharedToolTipWindow] showForImageContext:context atPoint:NSZeroPoint];
- }
- }
- - (void)mouseExited:(NSEvent *)theEvent{
- if (trackingAreas == nil)
- return;
-
- NSDictionary *userInfo = [theEvent userData];
- if ([userInfo objectForKey:@"row"])
- [[SKImageToolTipWindow sharedToolTipWindow] fadeOut];
- }
- - (BOOL)hasImageToolTips {
- return trackingAreas != nil;
- }
- - (void)setHasImageToolTips:(BOOL)flag {
- if (flag && trackingAreas == nil) {
- trackingAreas = [[NSMutableSet alloc] init];
- if ([self window])
- [self rebuildTrackingAreas];
- } else if (flag == NO && trackingAreas) {
- if ([self window])
- [self removeTrackingAreas];
- SKDESTROY(trackingAreas);
- }
- }
- #pragma mark SKTypeSelectHelper datasource protocol
- - (NSArray *)typeSelectHelperSelectionStrings:(SKTypeSelectHelper *)aTypeSelectHelper {
- if ([[self delegate] respondsToSelector:@selector(tableView:typeSelectHelperSelectionStrings:)])
- return [[self delegate] tableView:self typeSelectHelperSelectionStrings:aTypeSelectHelper];
- return nil;
- }
- - (NSUInteger)typeSelectHelperCurrentlySelectedIndex:(SKTypeSelectHelper *)aTypeSelectHelper {
- return [[self selectedRowIndexes] lastIndex];
- }
- - (void)typeSelectHelper:(SKTypeSelectHelper *)aTypeSelectHelper selectItemAtIndex:(NSUInteger)itemIndex {
- [self selectRowIndexes:[NSIndexSet indexSetWithIndex:itemIndex] byExtendingSelection:NO];
- [self scrollRowToVisible:itemIndex];
- }
- - (void)typeSelectHelper:(SKTypeSelectHelper *)aTypeSelectHelper didFailToFindMatchForSearchString:(NSString *)searchString {
- if ([[self delegate] respondsToSelector:@selector(tableView:typeSelectHelper:didFailToFindMatchForSearchString:)])
- [[self delegate] tableView:self typeSelectHelper:aTypeSelectHelper didFailToFindMatchForSearchString:searchString];
- }
- - (void)typeSelectHelper:(SKTypeSelectHelper *)aTypeSelectHelper updateSearchString:(NSString *)searchString {
- if ([[self delegate] respondsToSelector:@selector(tableView:typeSelectHelper:updateSearchString:)])
- [[self delegate] tableView:self typeSelectHelper:aTypeSelectHelper updateSearchString:searchString];
- }
- - (id <SKTableViewDelegate>)delegate {
- return (id <SKTableViewDelegate>)[super delegate];
- }
- - (void)setDelegate:(id <SKTableViewDelegate>)newDelegate {
- [super setDelegate:newDelegate];
- [self rebuildTrackingAreas];
- }
- @end
- */
-
- }
|