Stone Design Stone Design
News Download Buy Software About Stone
software

OS X & Cocoa Writings by Andrew C. Stone     ©1995-2003 Andrew C. Stone

What's So Funny About Peace, Love and Mac OS X?
©2002 Andrew C. Stone All Rights Reserved

One of my favorite riffs is why Apple is so freakin' groovy and it begins something like this: Once upon a time there were two young men in their garage and they dropped some... Well, you know that part of the story - the light shined bright and I think George Harrison was playing. And as Patti Smith sings "This is an era where everyone creates!" And this has come to pass with the help of personal computers, with many of the innovations coming from Apple (and NeXT). The rest of the industry largely copies what Steve Jobs & Co. do! Even the digital hub concept is being ripped off by Intel - they had a full page ad in USA Today the day after Steve introduced the new iMac. MacWorld Expo this year marked the transition into OS X - all new computers are shipped with OS X as the default operating system. One of my favorite parts of the keynote was "a moment of musical tribute" to the late great George Harrison, reminding us of our roots and gratefulness to the visionaries that have come before us. Sales of the new iMacs have been phenomenal, and complementing this hardware renaissance, Cocoa is bound to create a software renaissance.

Running a booth at Expo is both exhausting and exhilarating, but is an essential counterpart to being a software hermit. Meeting your customers, giving demos that really excite people, and making impulse sales are all part of what makes a show invaluable. But what really makes it all worthwhile is the occasional random, ghost-in-the-machine, basic Apple Magic encounters. On Thursday, a rather Tolkien looking fellow ambles up to me and says 'Hey Andrew, here's an invitation to a party we're throwing!' He has an Apple employee badge, so I'm all ears. He hands me a big linen envelope. Thinking of my comrades, I asked for, and received 3 more. "The Gay Blade and the Naked Mole Rats present..." - hmmm, definitely a little edgy, and it starts before the 'The Party Formerly Known As ... (The Knife's Last Call). Running in to an old friend who was recently hired by Apple to promote unix ports, we have an impromptu Thai dinner with a bunch of old NeXTSteppers, WebObjects guys, the original Darwin dude, and a guy from Sun who is looking for people to work on the OS X port of Open Office (www.openoffice.org). Only two guys join me for the parties, but we are rewarded mightily!

We find the venue in a back-alley south of Market watering hole where there's an open bar with a decent microbrew, and a very famous band (at least in the rock and roll accordion world) takes stage. 'Those Darn Accordions' - <http://thosedarnaccordions.com/index.htm> is a very original and humorous band featuring 3 accordionists, and they totally rocked the house. It turns out I had been invited to a very exclusive Mac insiders party: a veritable who's who in the old time Mac community! During the set break, the band's lead singer, Paul Rogers, turns the audience into the performers. He's a total Mac user, and he breaks out a long list of questions of obscure problems he's had with his Mac, and he wants the audience to answer the questions. One by one, the world's Mac experts crack his questions, and it's a joy to watch our collective knowledge in action.

Finally, he comes to a question - "Mac OS X is on my disk, and its taking up space. What should I do - Nuke it? What's it good for?"

In the spirit of the moment, I jump up on stage, grab the microphone, and say, "I can speak to that. I've been developing with Mac OS X's "new" development environment, Cocoa, for 12 years. I shipped my first app in 1989 on the NeXT, and followed the vision of object oriented software without losing faith, and now have 10 applications shipping for OS X. First - those problems that you've been having on your Mac - most of those (init conflicts, memory issues, crashes) would totally disappear on OS X. Second, we are at the beginning of a renaissance - it was announced at Expo that Apple would be shipping the entire Developer CD with every computer. Who knows where the next killer app will come from?

Cocoa gives tinkerers the ability to write fully integrated OS X software. To give you an idea of Cocoa's power, you can build a word processor that has multiple fonts, rulers, colors, ligatures, baseline, justfication, kerning, full undo, printing, spell-checking and even drag and drop of 30 graphic formats in just 8 lines of code! Putting the development environment into the hands of the users is extremely healthy for the biodiversity and future of OS X software."

Anyway - the second set was even more rocking!

Here's how to create a multi-document word processor that has support for graphics, colors, rulers, alignment, super and subscripting, baseline control, UNICODE, kerning, and it reads and writes RTF and RTFD files. The 10 lines of code are for the reading and writing - the rest is provided via Interface Builder.

1. In Project Builder, select "New Project...", choose "Cocoa Document-based Application", and save it.

Project Builder creates the main menu and document interfaces, and the MyDocument subclass of NSDocument.

2. Add the document types that we can edit to the Application Settings pane of the Target Inspector:

Associate the Rich Text Format (RTF) and RTFD (with graphics) file types with "MyDocument".

3. Add the instance variable 'text" to MyDocument subclass - only bolded text is what you write, because the rest of the file was stubbed out by Project Builder.

//
// MyDocument.h
// X Word
//
// Created by Andrew Stone on Wed Feb 06 2002.
// Enhanced by Tom Harrington on Wed Aug 07 2002.
//


#import <Cocoa/Cocoa.h>

@interface MyDocument : NSDocument
{
id text;
// there is no window or text at load time, so we need these:
NSData *textData;
NSString *textType;
}
@end

4. Open MyDocument.nib in InterfaceBuilder, drag MyDocument.h icon from Project Builder to add this instance variable to the File's owner (the MyDocument class).

5. Drag in a text view from the Cocoa-Data Palette window and resize it to fill window

6. In the Size Info, click the "Springs" sproingy so that it grows to fill the window when you resize it

7. In Attributes Info, click "Undo Allowed" and "Graphics Allowed"

8. Control-drag from the File's owner icon to the text view, and click on "text", and then Connect

9. Open MainMenu.nib, and drag the Text and Font menus from the Cocoa Menus palette onto the main menu. Change occurrences of Newapplication to X Word.

10. Fill out the read and write primitives (the unbolded part of this file was generated by Project Builder):

//
// MyDocument.m
// X Word : an 8 line Graphics Enabled Word Processor
//
// Created by Andrew Stone on Wed Feb 06 2002.
// Enhanced by Tom Harrington on Wed Aug 07 2002.
//

#import “MyDocument.h”

@implementation MyDocument

- (NSString *)windowNibName
{
return @”MyDocument”;
}

- (void)windowControllerDidLoadNib:(NSWindowController *) aController
{
[super windowControllerDidLoadNib:aController];
if ([textType isEqualToString:NSRTFDPboardType])
[text replaceCharactersInRange:NSMakeRange(0,[[text string] length]) withRTFD:textData];
else if ([textType isEqualToString:NSRTFPboardType])
[text replaceCharactersInRange:NSMakeRange(0,[[text string] length]) withRTF:textData];
}

#define Whole_Range NSMakeRange(0,[[text string] length])

- (NSData *)dataRepresentationOfType:(NSString *)aType
{
    if ([aType isEqualToString:NSRTFDPboardType]) {
        [textData release];
        textData = [[text RTFDFromRange:Whole_Range] retain];
        return textData;
    }
    else if ([aType isEqualToString:NSRTFPboardType]) {
        [textData release];
        textData = [[text RTFFromRange:Whole_Range] retain];
        return textData;
    }
return nil;
}


// the nib has not loaded yet - so we hold on to the new stuff!
- (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType
{
textData = [data retain];
textType = [aType retain];
return YES;
}

- (void)dealloc
{
[textData release];
[textType release];
[super dealloc];
}

// this allows you to save as PDF!
- (IBAction)printDocument:(id)sender
{
[text print:sender];
}

// HOMEWORK:
// if you want your RTFD files to be openable by TextEdit - you’ll
// have to implement these - see NSDocument and NSFileWrapper for more info:
//- (NSFileWrapper *)fileWrapperRepresentationOfType:(NSString *)type;
//- (BOOL)loadFileWrapperRepresentation:(NSFileWrapper *)wrapper ofType:(NSString *)type;
// These APIs are intended for documents that are stored as file wrappers using the NSFileWrapper class. By default, these methods call the NSData based API above. The default implementation only handles regular file file wrappers.

@end

Save the files, build it, test it, ship it! All you need is an icon. Or, you can grab the source from: http://www.stone.com/dev/X_Word/X_Word.tar.gz

Andrew Stone is founder of Stone Design Corp <
http://www.stone.com/> and divides his time between farming on the earth and in cyperspace.

PreviousTopIndexNext
©1997-2005 Stone Design top