Configure player

Close

WWDC Index does not host video files

If you have access to video files, you can configure a URL pattern to be used in a video player.

URL pattern

preview

Use any of these variables in your URL pattern, the pattern is stored in your browsers' local storage.

$id
ID of session: wwdc2006-235
$eventId
ID of event: wwdc2006
$eventContentId
ID of session without event part: 235
$eventShortId
Shortened ID of event: wwdc06
$year
Year of session: 2006
$extension
Extension of original filename: mov
$filenameAlmostEvery
Filename from "(Almost) Every..." gist: ...

WWDC06 • Session 235

Advances in Application Printing

Graphics and Media • 41:48

Come learn how you can fully utilize Mac OS X's printing architecture to create fantastic printed output from your application. You'll learn how to customize the printing experience using Print Dialog Extensions which extend base printing functionality to meet your application's needs. A valuable session for all application developers who are looking to create a great printing experience.

Speakers: Paul Danbold, Alan Beck

Unlisted on Apple Developer site

Transcript

This transcript was generated using Whisper, it has known transcription errors. We are working on an improved version.

The conference and to the first of two back-to-back printing sessions. Two and a half hours of printing for those of you who are going to stay for both sessions. Could be worse. I was up in Seattle in May this year and sat through almost a whole day of printing so only two and a half.

The title of this slide says "Advances in Application Printing" and we are going to talk about the Print Dialog a lot. But if any of you work on printer drivers and other kinds of software related to the printing system, this session is still for you. We do have content in here that's directly relevant. So don't go out for coffee yet.

I'd like to say that, you know, by now, I mean, Mac OS X is more than five years old. And I think we're getting close to that point in time when you guys know what your code is supposed to do to print. And then we know what our code is supposed to do. And I'd like to think we're getting close to that point in time when printing just works. But there's still plenty of work to do.

And I hope after you've heard what we've had to say in the next hour or two, you'll agree that we're getting closer to that goal. And if you support us, do some of the things we're asking you to do today. I'm sure that Leopard customers will be much more happy with printing compared with Tiger and earlier versions of Mac OS X.

So, as this slide says, we're going to talk about the print dialog. Not just the print dialog, but that's a major topic. And you all know that printing is a team effort. Applications do your work, printer drivers do their work, and somewhere in the middle, some Apple code gets to do its stuff. And if we all do the right things, then everything you see in your document window gets put down on paper in the right place and the right color, etc. But we all need to play our respective parts and try not to step on each other's toes.

And the Print Dialog, I guess, is the most critical part of that system where we all have to get along together. Maybe it's the most contested piece of screen real estate we have because it's a threesome effort to get everything working together. You know, those questions of who owns the Print Dialog, the priorities of various features, how they interact with each other. And so, of course, with the new version of Mac OS X, we've had to put some thought into how to make all that work well.

As a prelude to this discussion, I went looking for old screenshots. And to tell you the truth, it's not that hard to find the really old ones. Here's one from, I guess this is about 13 years ago, early version of the LaserWriter driver. And back then, the driver owned the Print Dialog, and the application had to ask Pretty Please if it wanted to add any settings. And if you look closely, you'll see a couple of checkboxes that the application's added to the Print Dialog.

Around the same vintage, we had another printing system and this had a slightly different print dialog and a different mechanism for applications to be able to add their controls for print time features. So back then it was kind of a pain for applications to be able to do what they wanted to do with all the different print drivers out there at the time. By the way, this one had a nice feature. If you see, there's a fewer choices button. So there was a simplified and advanced view of the print dialog. Quite a good innovation at the time.

Another thing that we've had to deal with as the Print Dialogs evolved is just the growing list of things that you can do at print time. Growing list of things that applications want to allow you to do to customize what comes out on paper. A growing list of things that the printer and its driver wants to make available to you when the time comes to print your document. That's about, I forget how long ago this is, but at least six years I guess, since... That's when we started to add extra panels to the Print Dialog.

LaserWriteRate had a drop-down menu so that you could switch between different panels. That, of course, introduced topics like how do you deal with interdependencies between various features. And we weren't the only ones who were working on the Print Dialog. Here's one, kind of recent. This is PostScript printing on Windows.

and another one, this is Printing Joy and Inkjet, Raster Printer on Windows. And we even have... Screenshot from one of the Linux distros. So I guess the point I'm trying to make is lots of people working on the Print Dialog. We've got to this point today with Tiger and we're starting to realize that there isn't a Print Dialog, sorry, there isn't a perfect Print Dialog, but we have to make the Print Dialog as simple as possible and we have to make it as easy as possible for you to extend the Print Dialog if you need to and do it in a way that doesn't confuse you. confuse the user.

I'd have to say that if you look at Tiger today, and this is what you get with some printers, you just have an intimidating experience when you click on that Print Dialog Extension menu. Just too many features. So for Leopard, and anybody who's actually installed Leopard will already have known this, we kind of went back to square one. And we thought this was quite a nice printing experience. Works for me.

And you know, the printing system's just going to use extra sensory perception to figure out what you want and just do the right thing. But of course, life's a little bit more complicated than that. So we've ended up with this as the first view that the user gets when they go to print from a particular application.

Of course, there's more to it than that, and that's what we're going to explain this morning. I just want to make a couple of quick points. One is that what you got today with your Leopard Seed is not the last word. We've got more improvements in the pipeline. The other thing I want to say is, although there's not a lot of time to do this, based on what you hear this morning, give us your feedback. We may be able to incorporate some of your changes and suggestions.

That said, I think we've done a good job making it easier for you to extend the Print Dialog, customize it. I just want to finish by saying please try to keep things simple. Go for consistency. And if you have any issues, talk to us. Try not to work around the way we've implemented the Print Dialog and the way we've made it easy for you to enhance it. And with that, I'm going to hand over for the technical stuff to Alan. He's going to show you how to work with the Print Dialog in Leopard. Thanks very much.

Thank you. I'm Alan Beck. I've been at Apple 15 years now and 13 of those past 15 years have been in printing. So I've been there a long time. I know all those dialogues that Paul showed and some of the ones before that. So it's been quite a ride. So now on to the... Simple Print Dialog.

This is the first major redesign of the Print Dialog we have done in over seven years. Basically, since we started your first developer preview for OS X. That was when we basically, the system took over the Print Dialog and we didn't have the drivers in charge of the Print Dialog.

We have found that the majority of our users just do a Command P and return to print. It's mainly about what some of the application developers want or driver developers want, but that is the reality of the world. So we wanted to make the first dialog, Print Dialog, that the user sees simple.

To give the users the minimum number of options to choose from. Simplicity is the user doesn't have to make a choice. So here we have given the user the choice of selecting the printer, selecting a preset if they want to, and we've given them the PDF workflow button and the preview button, and of course the cancel and print.

We've already gotten the bug, where did my print options go? So you guys don't need to write that bug, we already have it. So what the user would have to do to get the rest of the buttons is just click the little disclosure button. And we do get the expanded dialog. And this is where the full functionality of the drivers and the applications can be seen. And if you just want to get back to the simple print dialog, just click the button again.

Now let's talk a little about the interaction of the simple and the expanded Print Dialog. The state of the closure button is saved on a per application, per user basis. In other words, the next time you bring up the Print Dialog in your application, it will open up the state that the user last had it as. So this allows a user to say in mail, always have the simple Print Dialog shown. They really don't care about any of the... they have their preset already set for mail.

They know how to print. But say if you want to go to Word or Pages or any other complex app where the user does want control, they can have the expanded Print Dialog in that app and still have the simple Print Dialog in your other app. One thing I'd like to say is the application does not control this. It is a per user... it is controlled by the user.

Now let's talk a little bit about the expanded print dialog. One of the major changes we've done is we've made the application print panel the first panel that the user sees. We have been noticing that some of the important print options the users weren't able to find. The application print panel was buried deep down in the PDE menu and the users just did not know how to find it. So we brought the application panel up front and it was the first panel this user sees. We've also brought the copies and page range above the line. It is now in the top portion of the dialog.

So the user can always get to these options without having to change panels. One other thing we've done is we've promoted the two-sided printing. More and more printers are coming standard with the duplex option and the users are saying, "How do I get two-sided printing with this new feature that came with my printer?" So we have promoted it to the top portion of the dialog. That way the user can see it. always find it.

Paul alluded earlier to the panel pop-up menu has become kind of unmanageable, confusing, and it's really kind of hard to find what you're looking for. In Leopard, we've organized it a little bit to alleviate some of the concerns. We've added a separator after the application panels, and we've put separators around the printer-specific panels. In the short time that we've been using it, I've been using it, it makes a big difference. You wouldn't think three lines can make such a big difference in navigating this venue, but it does.

We've also added the concept of last used settings for another preset. So we've had requests from many users to say, I want to print this document the same way I just printed it. Or say I have another document I want to print it the same way I just printed this last document.

What we do in the printing system is every time the user hits Print, we capture and save off the print settings that they just printed with. And then when the user goes back to the Print Dialog, they can just go ahead and select this last used print settings and we will load those settings in the Print Dialog and users will be able to print using those settings. Another thing we've added, we've had a lot of user requests for this and developer requests. We've added adding the page setup functionality to the Print Dialog.

We are now allowing applications to add paper size, orientation, and scale to the Print Dialog. We mainly see this for applications that are not document based. We still have the page setup menu for the users to use if you want to, or for the application users to use if you want to.

It reduces the number of page setup and print dialog round trips. How many times have you brought up a web browser, gone to print, didn't quite fit, cancel out, go up to page setup, set the scale, go through that, bring up the print dialog, print again, it's still not quite right.

Or another case is, I know this will fit orientation, I'm in the print dialog, oh, I have to cancel out, go to page setup and set orientation. So now we are allowing applications to opt in to this functionality. They can choose which of the page format options they want to show in the print dialog.

And we were saying apps, you can even remove the page setup menu item if it makes sense for your application if you've added them to the print dialog. Another thing we're allowing the application to do is we can put these page attributes not in the top portion of the dialog, but you can make it its own little PDE as well.

Print Selection. We are now providing a system, a print system consistent way for the user to select print selection. Currently, it's kind of haphazard based on the application buried deep down in the application panel. We are providing a consistent UI by adding a third radio button to the pages, to the page range where the user can select, I just want to print the selection. Problem is we can't do that by ourselves. We need the application's help. You know what the selection is, we can't print the selection.

So as herein is that the application has to opt in to give us functionality and when the user selects selection, we will add the KPM Print Selection Only key to the print settings, then use the application, we have to read that and only print what the user has selected.

Another way of allowing the application to do is override our copies and page range. You can specify that the copies and page range not be shown altogether. If it doesn't make sense for your application to show copies, don't show it. And if your application can do a better job of something, let's say page range, you can hide ours and show yours. In this example, you have a word processor. It can do a better page range by doing discontinuous page numbers. So what your application would do would be hide our page range and show theirs.

Now, talk about some of the APIs that gives us functionality. It's pretty simple. It's an option field. So here in Cocoa, you have these enums. You have Show Copies, Page Range, Paper Size, Orientation, Scaling. And if you want to set them, the NS Print Panel has added these two methods for set options so you can set the options and actually get the current options. We will be adding the options for the Print Selection and Page Attributes Panel in a future seed. It's not quite there yet.

And here's the new printing, the Carbon Printing APIs. Same thing, option, we have the option bits, we have copies, page range. Here we have the page range with selection which will add that third radio button that I showed you. Paper size, orientation scale, and the ability to show the page attributes in its own separate PDE. We also added a couple more APIs to show the print dialog with options. As you can see, one of the last parameters is where you pass in the print dialog options flags.

Another thing you might want to notice here is page format is no longer const. The application has to be able, be ready to handle a page format that has been modified. That is not true today. Currently in the print, any of the print dialog commands, it's const and we don't change the page format. But from now on, we may be changing it for you or to you.

So let's just go over the demo apps. Go over to-- This is purely a demo app. It is not anything the user would see. We had that confusion a little bit earlier. It is just to show you basically how an application could turn on and off these different fields on the Print Dialog. I'm just saying this is the default state. Copies and page regions on. Let's go ahead and bring up the Print Dialog. As you can see, here's a simple Print Dialog.

have you can select the printer, We have all the standard presets, the help button, the PDF workflow, preview, and the cancel and print. Now let's go ahead and expand it. As you can see, we have the copies and page range, the two-sided and the pages. And this application doesn't have an app-specific pane, so we go to our first pane, the system pane. As you can see here, here again we have the printer-specific PDEs being shown here. So let's cancel out of this. Now let's go ahead and add the page format options.

Here again you can see we've added paper size, full paper size pop up and we tell you if it changes here. We've added the orientation, changed orientation and we can change scale. Let's go ahead and cancel back out of this. And here again, it's like, okay, say I don't want orientation and page range. Okay, if I'm an app, I now say, okay, look, those options don't make sense to me. I just want page size and scale.

You know, just the scale moved over because we didn't have the orientation as well, and we don't have page range anymore. Now let's just show it as the panel. Here it is. Okay, now we have the -- still don't have page range, as you can see, but we do have the page attributes as a panel. And lastly, I'd like to show you the print selection.

Here again, here we have the copies and we've added the third radio button for the user to select saying they want to print just the selection that the app has. What is really nice is, let's close out of this, is I have made a single line change in Safari. to add the print options to the page format options to the Print Dialog.

And as you can see, here they are. This is the standard web page. Let's go ahead and preview this. You know, standard, you know, US letter. What is nice about Cocoa is with this one line change, I'm now able to say, let's go to number 10 envelope, do a landscape, and let's reduce it 50 cents, 50%. Preview this, as you can see, without any changes to the Safari code other than the one line code to add to set what print options the user wants to see, we now have We now have that, we now have, it's showing 50% on a envelope.

Now we are also working on stuff that didn't quite make it into the seed that you do have. So if we switch back over to here. Here we go. Back there. Now this is an unmodified version of TextEdit. I have made no changes to TextEdit whatsoever. We have done some stuff on the printing system though. This is like a 14 page document. It was quite long, total gibberish. Now let's go ahead and bring up the Print Dialog. We are working on adding inline preview to the Print Dialog without the app having to do anything.

As you can see, it is a live preview. You can go forward and back, back, forward. We don't have all the controls enabled to basically zoom in, zoom out. and uh... basically as you change stuff over here it would change the preview that you actually see. So this is still a work in progress. It didn't make it onto the Leopard Sea but it is something that will be in FutureSeed and in the GM version of Leopard. So if we go back over to slides.

To go along with this refined print dialog, we also have "refined" the Page Setup dialog. It now contains only the options that affect document format. Scaling is gone. Applications are now added to the Print Dialog. If you think about scaling, it wasn't so much page format. It is how the data got put onto the page.

Reverse landscape has been removed as well. We've added a reverse page orientation to the layout panel. This way we can actually get that fourth little button for reverse portrait that users have been asking for. And we were saying only document-based applications should need a page setup. Non-document-based applications can put it in their print dialog and just remove the whole page setup menu entirely.

So summary, customizing the Print Dialog. Your application panel is now the first panel shown. That's a major change. If your application is not document based, you now have the option to remove the page setup menu and add the controls to the Print Dialog. We now have a standard way for the user to select print selection. And you as the application can specify what is shown in the Print Dialog that makes sense for your application. And lastly, the page setup contains only the options that affect document format.

Let's move on to the printing API in general. If you have a Cocoa app, you should use the Cocoa printing APIs. It's a better fit for the Cocoa applications. To use the Printing System APIs, yes, Carbon applications have to do it, and currently your Cocoa app needs to use it if they need more control over the print settings and such like that. But we are working very hard to bring these two into parity by Leopard GM.

So here's a very simple example of how to use the Cocoa APIs. For most Cocoa APIs, NSPrint operation is all that you need. Basically you create a print operation, tell it the view that you want to print, and give it the print info, and then you just run it modally for the window, giving it your document window, and the selector is gonna be called when the dialog goes away.

Here it is, and here you can just add a few lines of code to get the new Print Dialog features. Here I get the print panel out of the print operation and just go ahead and set the options. I get the current options and I say I want to add, I want to show paper size, orientation, and scaling.

NS Print Accessory Controller is a new file that has been added to Cocoa. It's a simple way for the Cocoa applications to add panels to the print and page setup dialogs. The NS Print Panel and NS Page Layout Set Accessory View is now deprecated. This is the new way for Cocoa applications to add panels to the print dialog.

It allows for multiple application panels, which you couldn't do before. It allows you to specify the title for the panel, something you couldn't do before. And in the future, Leopard Seed will allow you to provide summary information that will be shown. in the summary panel of the Print Dialog. This is kind of a word of wisdom for you. For panels that are added to the Print Dialog, they should only be used to provide print options, not formatting options.

Here are the new NS Print Accessory methods that have been added to the print panel and the layout panel. Basically you add a controller, remove the controller, and get a list of the current controllers. And here's a simple example of how to use it. You allocate a Print Accessory Controller, give it the name of where your Panel lives and give it a title.

Then you add it to the accessory control, you add it to the print panel with the add accessory controller and then you release it, you're done with it. The system will take care of displaying it. There again, look, there's a new file, nsprintaccessorycontroller.h in the AppKit interfaces. So take a look at that for more details and the AppKit release notes for more details on how to use this.

Moving on to how Carbon Apps and Print Driver developers can add stuff to the print panel. You've heard me talk before about Cocoa-based print panels. We couldn't release them due to some runtime issues we were trying to deal with and work through, but now we are releasing them for Leopard and they will run on 10.4 or later. They're much slimmer to write, no more boilerplate code, and it takes about 25% the amount of code as the old carbon-based PDEs.

Another thing that's very important is these PDEs will run in 64-bit mode. The old Carbon are 32-bit only. It also gives you the resolution independence, if you've gone to some of the other talks that you'll need. Another thing is it allows for PPD constraints handling. That is something that we have added for Leopard.

If you run these PDEs back in 10.4, no, you won't get the constraints handling, but it is something we have added for Leopard. And we have released a Cocoa-based PDE sample code. It's the Output Bins PDE. If you look, it's attached to this session. Just go up to the sample code, and it is available for you to look at.

Do a little bit about some of the interface into the Cocoa-based Print Dialog Extension. It's all defined in PDE plugin interface.h. First of all, we have the PDE plugin protocol. Basically, we're going to ask your plugin to give me all your panels for this particular type, whether it be page setup or print. And the plugin would then return an array of the PDE panel instances.

We go to PD panels. We are going to ask you for your view. We're going to tell you when we're going to show you. In other words, the user has selected your panel. We will tell you that you should hide. This is your chance to validate your user interface item and say, oh, something's out of range. Put up a dialog and return false and then we won't switch and we won't let the user switch to the panel. Save values is basically when we want you to write out your settings to the print info.

And restore values is when we want you to read the print info. Say the user selected a preset. We will then call your Print Dialog Extension to say go back, go reread the values and update your UI. And the last one is PPD option key value did change. It has to do with constraints handling which I'm going to talk about in just a little bit.

This will add to the PDE plugin callback protocol and this is how the PDE can get information from the system and tell the system it needs to do something. So you can get the print session, the settings, the format, the printer, the PPD file. And PanelView did resize saying, "I'm the PDE, I changed my size.

I want the printing system to resize the dialog around me." So that's a call you would make and we tell us that you changed the size. We will reformat the dialog so nothing gets hidden. Here again, this is the last one is another PPD constraints call and we'll talk about that in a little bit.

Now how do we get these PDEs to show up in the Print Dialog? For Carbon applications, you just need to add the Print Dialog Extension's key to your InfoP list, which can give it the PDEs that you want to show up, and put the plug-in in your application's plug-in directory. For printer drivers, you would just add this line sum of this to your actual PPD, AP Dialog Extension, and then give us a path to your bundle.

PPD Constrain Handling is something new in Leopard. We've been talking about it for a while. So application developers, you can cover your ears for the next couple, three slides. I'm sure some of the developers back at Apple, my coworkers would love to do, but they can't. It allows the user to resolve conflicts between PPD-based features. A simple example of this is, say a printer can't do duplex on envelope.

On previous systems, we would just gray out the conflicting items. So say if they selected an envelope, we would gray out the two-sided option. The user would have no idea why two-sided was grayed out. They just know it was grayed out. The other problem is it could be in a totally separate panel.

The user has no clue as to why something is So what we are doing in Leopard is the system is going to do the constraint checking and then do the user interaction to handle the conflicts. So in this example, we have the user selected finishing options to staple. The problem is output destination is set to left bin. You can't have both. So what we do as a printing system, we notice that and we let the user choose.

Do they want to set output destination to stapler, which would allow them to set the finishing options to staple, or they can cancel out and say, leave it the way it is, I don't want to change it. So as a PDE, when the user makes a selection, the PDE needs to make the callback, we'll change PPD option key value pair with the requested PPD option choice pair. In other words, this case it would be, the PDE would say the user chose finishing options setting to staple.

And then we would go through all the PPD keywords, make sure there wasn't any conflicts. And if there was, we would put up this dialogue to the user and the user would decide what to do. And we will return true to the PDE if the user accepted the change and also if no conflicts existed, we return true. Or true if there was a conflict and the user said go ahead and change it.

A false return value means the user said no, I don't want to do anything. So that PDE would then have to restore the old UI to the previous settings. Now what about the other person? The PDE, the option that the user did want to change. So in this case, output destination was set to stapler.

So if the user does accept a change of the resolution that we suggested, we're going to make the method call PPD key value did change to the supporting PDE. In other words, the PDE that had, what was it? The output destination. So we're going to call this method with output destination set to stapler. That other PDE will have to go through and update its settings to say that output is no longer left bin, the output option is stapler.

On the topic of print drivers, there's been a little bit of confusion as to 64-bit and dealing with print drivers. There's several aspects of this. First one is the driver portions that run in the application process. If the application process is running at 64-bit, the PDEs need to have a 64-bit slice in order to be loaded into that 64-bit application. The problem is the CF plug-in carbon-based PDEs can only be built as 32-bit, so they will not be loaded. This is due to many things, some of them being the non-composited window, quick draw drawing that the carbon-based PDEs are based on, and many other issues.

Our solution is the CocoaBase PDEs. They can be built and run in a 64-bit application. Cups, Filters, and Backends. Unless there's a compelling need, there's no need to be

[Transcript missing]

And the same thing with Tyga printer drivers. They are 32-bit only, but they're in their own process and they can still run. They may be depth-created, but they will still run.

Now, let's change gears again. Let's talk about printer setup utility. Currently we have three ways to get the printer browser. We have through the Print Dialog, through the Print and Fax Pref pane, and through Print Center. We have two ways to show a desktop printer. Base again, we have the Print and Fax Prep pane and the Printer Setup Utility.

And then there's this. It's a quite convoluted way for the user to interact with the printing system. There are too many ways for the user to interact with the printing system. A lot of users are being confused. Okay, I don't know where to go to get to, let's say, a desktop printer or how to change something. Do I go to the FaxPref? Do I go to PrinterSight Utility? What do I do? We've solved that. PrinterSight Utility is going away in Leopard.

It is no longer part of Leopard and the functionality has been split between the Print & Fax Pref pane and the desktop printers. This is the current PrintFX Printing Leopard. It is currently a work in progress. We expect many changes for this to happen, printing it up and such forth. For now, we've added the action menu to do some of the old printer sub-utility tasks such as ink levels, create a printer pool, open the printer utility, or to reset printing system.

Then we are using the printer setup button to get and change information about the printer. Click this button, you'll get a sheet, no more get info panel with a little apply button. We will, and if you click on the general pane, it allows for the renaming and setting of the location and provides information about the print queue. Click on the driver panel, you'll be able to change the PPD associated with the printer and change the installable options for that printer.

We've also revamped the desktop printer. A little bit of UI change, but a lot more underneath. One of the things we've changed is you can always see the printer status no matter which view you're looking at, whether it be your current jobs or your history. We also are displaying multiple error messages. This is where the major change in the desktop printer has happened.

We have totally revamped the status handling of the desktop printers. So we're now able to show multiple error messages at the same time. So you will know that you're low on yellow ink and you're out of paper, not just that you're low on yellow ink. And another thing we've added, there's no more three button alert that does not have the button you want.

We've added a new printer browser, another release of Operating Systems, we have a new printer browser. We actually call it the Uber browser internally. It displays multiple types of printers. We display USB printers, Bonjour, Share printers, AppleTalk printers in your default zone, Open Directory printers, Bluetooth printers, and SMP lookup printers via CUPS.

As you can imagine back at Apple on the printing local network, we have quite a few printers that show up on our network. So we are now allowing filtering based on multiple columns. And here I am just showing of the hundreds of printers that are on our net, I just want to look at all Bonjour HP printers. Then we'll filter that list to show only the printers that you're interested in. And the same thing when you're looking for a PPD. Now I'm looking for the HP 9500, I just type HP 9500 and it will only show those PPDs that match those words.

Talk a little bit about deprecated printing APIs. The current printing APIs that are deprecated will not be available to 64-bit applications. They're not in the binary. We've deprecated quite a few methods and functions over the years. And our header files have been getting harder and harder to read to determine what is deprecated and what is not.

So one of the engineers at Apple took great pains and a lot of work-- thank you-- to basically split out all of our deprecated functions into separate files. Now we have PM definitions, and we've added PM definitions deprecated.h that will include all the methods that have been deprecated. Same thing for PM core, PM application, PM printing dialog extensions, and such-fors. Only valid functions and constants are now in the main header files.

Let's talk a little bit about the APIs that have been decorated. We've been telling you for quite a number of years these printing APIs are going away and guess what? They're gone, especially for 64-bit applications. Quick Draw is gone. Functions that deal with PIC with PostScript are gone. Functions that deal with the current session, the old non-session APIs are gone. Functions that deal with current printer are gone.

Another thing, these are really old. Functions that deal with handles, functions that deal with the Mac OS 9 print records, and the old append-dental method of adding items to the print dialogs are gone. The last item on deprecated APIs. The Carbon, as I mentioned before, the Carbon PDE API is 32-bit only. Use the CocoaBase PDs instead. The PPD is 32-bit only as well, as well as Tiger printer drivers.

And I know Rich talked about this last year, I'm going to talk about it again. Another call for WYSIWYG. Where possible, use your document window to show your print view. Don't do it in the print dialog. Let the user reformat the page and edit the data while they're in the print view.

If it's a good print view, if it's a good print format, it's likely to be a good presentation format. We are working very hard on making this much easier for Cocoa applications. It's not in the seed yet, but we are working on, for Cocoa applications, providing a print view, providing controls that will allow the application developer to change aspects dealing with the print view.

This is an example of a good example, the iPhoto card calendar and book view. This is what's going to be printed, but yet it allows you to edit while you're in this view. Here you can change the picture, change the size, move it around, edit the text. You can do everything you want to that would affect how this card is printed.

Other good examples are FileMaker PrintView, Pages, TextEdit with Raptor Page, the Chronos, Soho, Labels and Envelopes, and Adobe Lightroom. These are all great examples that allow you to edit while you're seeing what's going to actually print. And as Paul mentioned, not Paul, Rich mentioned last year, bad examples are sadly still too many and and too embarrassing to enumerate all the things that we would like to see changed.

We ask that you avoid a separate dialogue before putting up the print dialogue. Realize we are on the way for some of the applications. We are working to remove those obstacles, but please if you can't, avoid a separate dialogue before bringing up the print dialogue. Another thing is you may be heading in the wrong direction if you're adding formatting options that cannot be previewed by your application.

So in summary, the application now determines what options are available to the user in the Print Dialog. Page Setup should only be for Document Format. If you're a non-document based application, it might make sense for you to add the Page Active Use options to the Print Dialog. We're asking Cocoa applications to switch using the new NS Print Accessory Controllers. And Carbon applications and print driver developers should switch to using COCO-based PDEs.