Re: How does -drawPageBorderWithSize: place pageHeader?
Re: How does -drawPageBorderWithSize: place pageHeader?
- Subject: Re: How does -drawPageBorderWithSize: place pageHeader?
- From: Mike Wright <email@hidden>
- Date: Wed, 12 Mar 2008 21:31:45 -0400
On Mar. 12, 2008, at 20:01 , Tom Bunch wrote:
Mike,
I've messed around with this and boy has it been a head scratcher.
Still haven't got it accounting properly for all combinations of
scale, print size, and margins.
The default implementation of drawPageBorderWithSize: seems to want
to print about 1/3 of the way from the margin to the edge of the
page without regard to for printable area.
Instead of using -[NSPrinter imageRectForPaper:], see if -
[NSPrintInfo imageablePageBounds] gives you what you're looking for.
Ah. I wonder how I missed that. That should do it.
Thanks a bunch, Tom. :-D
I see that the docs for -imageablePageBounds says: "The imageable
bounds may extend past the edges of the sheet when, for example, a
printer driver specifies it so that borderless printing can be done
reliably." I'll have to take that into account.
Here's a little boost in code to get you part way done implementing
drawPageBorderWithSize:, but as I noted, it has bugs w/ various
page setup attributes. If you should happen to fix them, lemme know!
NSTextStorage *header, *footer;
// stick something useful in header & footer
NSRect pageRect = [self rectForPage:[[NSPrintOperation
currentOperation] currentPage]];
[header drawAtPoint:(NSPoint){pageRect.origin.x, pageRect.origin.y
+ [printInfo topMargin] / 3.0f}];
[footer drawAtPoint:(NSPoint){pageRect.origin.x, pageRect.origin.y
+ borderSize.height - [footer size].height - [printInfo
bottomMargin] / 3.0f}];
Trying to put a topLeftHeader and a topRightHeader into one
NSTextStorage using page with info and NSRightTabStops was kind of
a pain. I think if I do it again I'll just use separate text
storages.
Thanks for the code, too.
Actually, I decided not to do a footer, because it looks a little
odd when there's a 0.56" bottom margin. What I've done is to modify
the NSAttributedString returned by [super pageHeader] so that I get
the job title at the left, the date in the center, and the page
number at the right, thus:
- (NSAttributedString *)pageHeader
{
// get the default header and footer
NSMutableAttributedString *mutablePageHeader =
[[[NSMutableAttributedString alloc] initWithAttributedString:[super
pageHeader]] autorelease];
NSMutableAttributedString *mutablePageFooter =
[[[NSMutableAttributedString alloc] initWithAttributedString:[super
pageFooter]] autorelease];
// remove the first tab from the footer
NSRange range;
range.location = 0;
range.length = 1;
[mutablePageFooter deleteCharactersInRange:range];
// remove the center tab from the header
range.location = [[self printJobTitle] length];
range.length = 1;
[mutablePageHeader deleteCharactersInRange:range];
// append the footer string, with its leading tab, to the header
[mutablePageHeader appendAttributedString:mutablePageFooter];
return mutablePageHeader;
}
Then I have -pageFooter return an empty string.
Now I'll do all this within -drawPageBorderWithSize and try to get
it optimized for the printable area. I may even be able to align the
printJobTitle to the left margin of the page content, as one user
requested.
Scaling is something I haven't done much with. Sounds like fun. (I
hate fun.)
Cheers,
Mike
Hope this helps.
-Tom
On Mar 12, 2008, at 2:47 PM, Mike Wright wrote:
I have an app (Universal, compiled using XCode 2.5, running on an
Intel iMac, under Leopard) that lets the user set page margins
when printing. It also lets them specify the printing of headers
and footers.
The odd thing I'm seeing with this is that the placement of the
pageHeader string varies with the frame of the NSTextView subclass
that I'm printing.
[cut some text to reduce msg size]
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden