[comp.sys.mac.programmer] Creating Icons for Applications and the Files they create

greggor@apple.com (Greg L. Anderson) (09/30/90)

I mailed the following information to someone interested in creating custom
icons for the Macintosh Application he was writing for a class project.
It turned out to be quite long, so I decided I would post it in case other
people on the net were interested.  Hopefully I'm not just wasting bandwidth...

 ----
 
How to create custom icons for your Macintosh Applications and the files
that they create:

(These instructions assume the use of ResEdit 2.0b2 and THINK C.)

1.	From THINK C, go to "Set Project Type"
	You will see two editable text fields in the upper right hand corner;
	one is "FILE TYPE" and the other is "FILE CREATOR".

	"FILE TYPE" should be "APPL" (all uppercase).  Change it to this
	if it isn't.

	"FILE CREATOR" will probably be "????".  You should change this to
	a (hopefully) unique ID that will identify your program; it must
	be four characters long, no more, no less.  For example, my program
	"Pon Nuki" has a File Creator of "PNUK".

	Every file on the Macintosh has a file type and a file creator.
	Executable files have a file type of 'APPL', while files that contain
	plain ASCII have a file type of 'TEXT'.  Files that have other
	strange information in them have file types unique to the App that
	created them.  In theory, all file types and file creators that you
	invent should be registered with Apple to insure that they really are
	unique.  All of my example types have been all uppercase, but
	lowercase letters are legal too, and distinguishable from uppercase
	(i.e., 'text' is a different file type than 'TEXT').

	All Icons displayed by the finder are a direct function of the file
	type and file creator of that file.  The finder gets the actual
	bitmap for the Icons from the 'Desktop' file, but that's not where
	you put them:  all of the resources needed to display custom icons
	belongs in the resource fork of the Application that owns the file.
	The Finder copies this information to the 'Desktop' file itself.
	It's usually pretty good about doing this automatically when brand
	new file type/file creator combinations show up, but if you
	subsiquently edit the icon bitmaps, you'll find that the icons
	displayed by the Finder don't change.  To fix this problem, simply
	rebuild the desktop (hold down Command-Shift-Option while rebooting
	your Macintosh), and the Finder will put the correct icons into
	the desktop file.

2.	When you save files with 'Create' and 'FSOpen', use code that looks
	like this:  (I should mention that using standard C fopen calls is out)

		Str255	fileName;
		short	vRefNum;
		FInfo	fndrInfo;
		long	fileCreator	= 'MYTP';
		long	fileType	= 'TEXT';
		OSErr	theErr;

		theErr = Create( fileName, vRefNum, fileCreator, fileType );
		if( theErr == dupFNErr )
		{
			theErr = GetFInfo( fileName, vRefNum, &fndrInfo );
			theErr = FSDelete( fileName, vRefNum );
			theErr = Create(fileName,vRefNum,fileCreator,fileType);
			fndrInfo.fdType = fileType;
			theErr = SetFInfo( fileName, vRefNum, &fndrInfo );
		}
		theErr = FSOpen( fileName, vRefNum, &fRefNum );	

	You can trash the 'if' statement and all of the code inside it if
	you will never be changing the file type or file creator of an
	existing file.  Usually, you'll never want to make a file with
	a file creator that is not the file creator of your app, so the
	question is, why would you want multiple file types, and why might
	they change on the fly?

	Pon Nuki uses a different file type based on who's
	turn is next; a different file type implies a different icon, so
	the user has a visual indication of who plays next just by looking
	at the file's icon.  If you don't delete and recreate the file,
	the Finder won't redraw its icon until you close and reopen the
	window it lives in.  The 'GetFInfo' and 'SetFInfo' calls insure that
	the icons stays in the same place after it is deleted and recreated.
	Pon Nuki will (someday soon) allow you to play games over the network,
	so the changing-file-icon feature will be a very useful indication
	that your opponant has made a move (since you won't necessarily want
	to keep the game window open at all times).

	Once you've gotten this far, users will be able to double-click on
	the documents created by your App, and doing so will launch your
	App.  You don't have custom icons yet, but I think I'll digress for
	a moment and throw in some more sample code to illustrate how
	your App can load the files that the user double-clicked on:

		short		message;
		short		preLoadFiles;

		CountAppFiles( &message, &preLoadFiles );
		for(i=1;i<=preLoadFiles;++i)
		{
			GetAppFiles(i,&theFile);
			OpenAFile( theFile.fName, theFile.vRefNum );
		}

	'message' is zero to load or one to print the files, but I'm too
	lazy to check for printing.

	theFile.fName is an Str255, while theFile.vRefNum is a short.  These
	are just like the values returned by SFGetFile.

3.	Open 'myProjectName.rsrc' with ResEdit 2.0b2 and create a resource
	of type 'BNDL'.  Do this with the "Create New Resource" (Command-K)
	option under the "Resource" menu.

4.	You will notice that there is an editable text field at the top
	of the BNDL editor that is marked "Signature".  Change this to
	your _FILE CREATOR_.  (This is a very important step.)

5.	Create a new file type with the "Create New File Type" (Command-K)
	option under the "Resource" menu.  Yes, this is the same item that
	used to be "Create New Resource"; this item transmorgifies based
	on what you're doing.

6.	You will get a new line in the BNDL editor that has "????" on the
	left and a bunch of squares on the right.  Click on the "????"
	and change it to "APPL".

7.	Double-click on the first square next to the "APPL".  You will
	get a nice dialog asking you to choose an icon for the file type
	"APPL".  Just click on the button marked "New".

8.	You will now be in a very nice Icon editor.  You will notice that
	you can edit many different types of icons with this editor; some
	are big, some are small, some are color and some are black and white.
	Only the big, black and white icon (the one marked 'ICN#') and
	its corresponding mask are used in system 6.  System 7 supports
	color icons, so that's what the other icons are for.  I drew nice
	color icons for Pon Nuki, but System 7 drew the black and white
	version anyway.  :<  I was using 7.0a12, so perhaps it works better
	now, or perhaps I did something wrong, or perhaps I just needed
	to rebuild the desktop.  I'm not sure.

	At any rate, draw the icon for your Application, make a mask for
	it and then close the icon editor.

9.	Repeat steps 5-8 for every file type that your program creates.
	Of course, in step 7 you should enter in the appropriate file
	type rather than "APPL".

That's it!  Resedit 2.0b2 creates the FREF resource for you, so you're all
done.  Needless to say, this is MUCH harder to do with ResEdit 1.2.

Oh, there is one more optional step you might want to take:

10.	Select "Extended view" from the "BNDL" menu (when you're looking
	at the BNDL editor).  A new editable text field labled
	"Copyright String" will appear.  Type text into this field.  It
	will show up in the "Get Info" box of your Application right next
	to the "Version:" label.

  ___\    /___               Greg Anderson              ___\    /___ 
  \   \  /   /         Advanced Technology Group        \   \  /   /
   \  /\/\  /            Apple Computer,  Inc.           \  /\/\  /
    \/    \/               greggor@apple.com              \/    \/