forked from gnachman/iTerm2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ToolPasteHistory.m
164 lines (140 loc) · 5.88 KB
/
ToolPasteHistory.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
//
// ToolPasteHistory.m
// iTerm
//
// Created by George Nachman on 9/5/11.
// Copyright 2011 Georgetech. All rights reserved.
//
#import "ToolPasteHistory.h"
#import "NSDateFormatterExtras.h"
#import "iTermController.h"
#import "ToolWrapper.h"
static const CGFloat kButtonHeight = 23;
static const CGFloat kMargin = 4;
@implementation ToolPasteHistory
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
clear_ = [[NSButton alloc] initWithFrame:NSMakeRect(0, frame.size.height - kButtonHeight, frame.size.width, kButtonHeight)];
[clear_ setButtonType:NSMomentaryPushInButton];
[clear_ setTitle:@"Clear All"];
[clear_ setTarget:self];
[clear_ setAction:@selector(clear:)];
[clear_ setBezelStyle:NSSmallSquareBezelStyle];
[clear_ sizeToFit];
[clear_ setAutoresizingMask:NSViewMinYMargin];
[self addSubview:clear_];
[clear_ release];
scrollView_ = [[NSScrollView alloc] initWithFrame:NSMakeRect(0, 0, frame.size.width, frame.size.height - kButtonHeight - kMargin)];
[scrollView_ setHasVerticalScroller:YES];
[scrollView_ setHasHorizontalScroller:NO];
NSSize contentSize = [scrollView_ contentSize];
[scrollView_ setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
tableView_ = [[NSTableView alloc] initWithFrame:NSMakeRect(0, 0, contentSize.width, contentSize.height)];
NSTableColumn *col;
col = [[NSTableColumn alloc] initWithIdentifier:@"contents"];
[col setEditable:NO];
[tableView_ addTableColumn:col];
[[col headerCell] setStringValue:@"Contents"];
NSFont *theFont = [NSFont systemFontOfSize:[NSFont smallSystemFontSize]];
[[col dataCell] setFont:theFont];
[tableView_ setRowHeight:[[[[NSLayoutManager alloc] init] autorelease] defaultLineHeightForFont:theFont]];
[tableView_ setDataSource:self];
[tableView_ setDelegate:self];
[tableView_ setDoubleAction:@selector(doubleClickOnTableView:)];
[tableView_ setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
[scrollView_ setDocumentView:tableView_];
[self addSubview:scrollView_];
[tableView_ sizeToFit];
[tableView_ setColumnAutoresizingStyle:NSTableViewSequentialColumnAutoresizingStyle];
pasteHistory_ = [PasteboardHistory sharedInstance];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(pasteboardHistoryDidChange:)
name:kPasteboardHistoryDidChange
object:nil];
minuteRefreshTimer_ = [NSTimer scheduledTimerWithTimeInterval:61
target:self
selector:@selector(pasteboardHistoryDidChange:)
userInfo:nil
repeats:YES];
}
return self;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[minuteRefreshTimer_ invalidate];
[tableView_ release];
[scrollView_ release];
[super dealloc];
}
- (void)shutdown
{
shutdown_ = YES;
[[NSNotificationCenter defaultCenter] removeObserver:self];
[minuteRefreshTimer_ invalidate];
minuteRefreshTimer_ = nil;
}
- (void)relayout
{
NSRect frame = self.frame;
[clear_ setFrame:NSMakeRect(0, frame.size.height - kButtonHeight, frame.size.width, kButtonHeight)];
[scrollView_ setFrame:NSMakeRect(0, 0, frame.size.width, frame.size.height - kButtonHeight - kMargin)];
NSSize contentSize = [scrollView_ contentSize];
[tableView_ setFrame:NSMakeRect(0, 0, contentSize.width, contentSize.height)];
}
- (BOOL)isFlipped
{
return YES;
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
{
return [[pasteHistory_ entries] count];
}
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
PasteboardEntry* entry = [[pasteHistory_ entries] objectAtIndex:[[pasteHistory_ entries] count] - rowIndex - 1];
if ([[aTableColumn identifier] isEqualToString:@"date"]) {
// Date
return [NSDateFormatter compactDateDifferenceStringFromDate:entry->timestamp];
} else {
// Contents
NSString* value = [[entry mainValue] stringByReplacingOccurrencesOfString:@"\n" withString:@" "];
return value;
}
}
- (void)pasteboardHistoryDidChange:(id)sender
{
[tableView_ reloadData];
// Updating the table data causes the cursor to change into an arrow!
[self performSelector:@selector(fixCursor) withObject:nil afterDelay:0];
}
- (void)fixCursor
{
if (shutdown_) {
return;
}
ToolWrapper *wrapper = (ToolWrapper *)[[self superview] superview];
[[[wrapper.term currentSession] TEXTVIEW] updateCursor:[[NSApplication sharedApplication] currentEvent]];
}
- (void)doubleClickOnTableView:(id)sender
{
NSInteger selectedIndex = [tableView_ selectedRow];
if (selectedIndex < 0) {
return;
}
PasteboardEntry* entry = [[pasteHistory_ entries] objectAtIndex:[[pasteHistory_ entries] count] - selectedIndex - 1];
NSPasteboard* thePasteboard = [NSPasteboard generalPasteboard];
[thePasteboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
[thePasteboard setString:[entry mainValue] forType:NSStringPboardType];
[[[iTermController sharedInstance] frontTextView] paste:nil];
}
- (void)clear:(id)sender
{
[pasteHistory_ eraseHistory];
[pasteHistory_ clear];
[tableView_ reloadData];
// Updating the table data causes the cursor to change into an arrow!
[self performSelector:@selector(fixCursor) withObject:nil afterDelay:0];
}
@end