Printing(Chapter 27 of Cocoa Programming for Mac OS X)
1 #import "PeopleView.h"
2 #import "Person.h"
3
4 @implementation PeopleView
5
6 - (id)initWithPeople:(NSArray *)persons
7 {
8 [super initWithFrame:NSMakeRect(0, 0, 700, 700)];
9 people = [persons copy];
10 attributes = [[NSMutableDictionary alloc] init];
11 NSFont *font = [NSFont fontWithName:@"Monaco" size:12.0];
12 lineHeight = [font capHeight] * 1.7;
13 [attributes setObject:font forKey:NSFontAttributeName];
14 return self;
15 }
16
17 - (id)initWithFrame:(NSRect)frame
18 {
19 self = [super initWithFrame:frame];
20 if (self) {
21 // Initialization code here.
22 }
23
24 return self;
25 }
26
27 - (void)dealloc
28 {
29 [people release];
30 [attributes release];
31 [super dealloc];
32 }
33
34 #pragma mark Pagination
35
36 - (BOOL)knowsPageRange:(NSRange *)range
37 {
38 NSPrintOperation *po = [NSPrintOperation currentOperation];
39 NSPrintInfo *printInfo = [po printInfo];
40 pageRect = [printInfo imageablePageBounds];
41 NSRect newFrame;
42 newFrame.origin = NSZeroPoint;
43 newFrame.size = [printInfo paperSize];
44 [self setFrame:newFrame];
45
46 linesPerPage = pageRect.size.height / lineHeight;
47
48 range->location = 1;
49 range->length = [people count] / linesPerPage;
50 if([people count] % linesPerPage)
51 {
52 range->length = range->length + 1;
53 }
54 return YES;
55 }
56
57 - (NSRect)rectForPage:(NSInteger)page
58 {
59 currentPage = page - 1;
60 return pageRect;
61 }
62
63 #pragma mark Drawing
64
65 - (BOOL)isFlipped
66 {
67 return YES;
68 }
69
70 - (void)drawRect:(NSRect)dirtyRect
71 {
72 NSRect nameRect;
73 NSRect raiseRect;
74 raiseRect.size.height = nameRect.size.height = lineHeight;
75 nameRect.origin.x = pageRect.origin.x;
76 nameRect.size.width = 200.0;
77 raiseRect.origin.x = NSMaxX(nameRect);
78 raiseRect.size.width = 100.0;
79
80 int i;
81 for(i=0 ;i<linesPerPage; i++)
82 {
83 int index = (currentPage * linesPerPage) + i;
84 if(index >= [people count])
85 {
86 break;
87 }
88 Person *p = [people objectAtIndex:index];
89
90 nameRect.origin.y = pageRect.origin.y + (i * lineHeight);
91 NSString *nameString = [NSString stringWithFormat:@"%2d %@", index, [p personName]];
92 [nameString drawInRect:nameRect withAttributes:attributes];
93
94 raiseRect.origin.y = nameRect.origin.y;
95 NSString *raiseString = [NSString stringWithFormat:@"%4.lf%%", [p expectedRaise]];
96 [raiseString drawInRect:raiseRect withAttributes:attributes];
97 }
98 }
99
100 @end
2 #import "Person.h"
3
4 @implementation PeopleView
5
6 - (id)initWithPeople:(NSArray *)persons
7 {
8 [super initWithFrame:NSMakeRect(0, 0, 700, 700)];
9 people = [persons copy];
10 attributes = [[NSMutableDictionary alloc] init];
11 NSFont *font = [NSFont fontWithName:@"Monaco" size:12.0];
12 lineHeight = [font capHeight] * 1.7;
13 [attributes setObject:font forKey:NSFontAttributeName];
14 return self;
15 }
16
17 - (id)initWithFrame:(NSRect)frame
18 {
19 self = [super initWithFrame:frame];
20 if (self) {
21 // Initialization code here.
22 }
23
24 return self;
25 }
26
27 - (void)dealloc
28 {
29 [people release];
30 [attributes release];
31 [super dealloc];
32 }
33
34 #pragma mark Pagination
35
36 - (BOOL)knowsPageRange:(NSRange *)range
37 {
38 NSPrintOperation *po = [NSPrintOperation currentOperation];
39 NSPrintInfo *printInfo = [po printInfo];
40 pageRect = [printInfo imageablePageBounds];
41 NSRect newFrame;
42 newFrame.origin = NSZeroPoint;
43 newFrame.size = [printInfo paperSize];
44 [self setFrame:newFrame];
45
46 linesPerPage = pageRect.size.height / lineHeight;
47
48 range->location = 1;
49 range->length = [people count] / linesPerPage;
50 if([people count] % linesPerPage)
51 {
52 range->length = range->length + 1;
53 }
54 return YES;
55 }
56
57 - (NSRect)rectForPage:(NSInteger)page
58 {
59 currentPage = page - 1;
60 return pageRect;
61 }
62
63 #pragma mark Drawing
64
65 - (BOOL)isFlipped
66 {
67 return YES;
68 }
69
70 - (void)drawRect:(NSRect)dirtyRect
71 {
72 NSRect nameRect;
73 NSRect raiseRect;
74 raiseRect.size.height = nameRect.size.height = lineHeight;
75 nameRect.origin.x = pageRect.origin.x;
76 nameRect.size.width = 200.0;
77 raiseRect.origin.x = NSMaxX(nameRect);
78 raiseRect.size.width = 100.0;
79
80 int i;
81 for(i=0 ;i<linesPerPage; i++)
82 {
83 int index = (currentPage * linesPerPage) + i;
84 if(index >= [people count])
85 {
86 break;
87 }
88 Person *p = [people objectAtIndex:index];
89
90 nameRect.origin.y = pageRect.origin.y + (i * lineHeight);
91 NSString *nameString = [NSString stringWithFormat:@"%2d %@", index, [p personName]];
92 [nameString drawInRect:nameRect withAttributes:attributes];
93
94 raiseRect.origin.y = nameRect.origin.y;
95 NSString *raiseString = [NSString stringWithFormat:@"%4.lf%%", [p expectedRaise]];
96 [raiseString drawInRect:raiseRect withAttributes:attributes];
97 }
98 }
99
100 @end