TweetFollow Us on Twitter

Rhapsody SimpleText

Volume Number: 13 (1997)
Issue Number: 11
Column Tag: Rhapsody

A Simple Word Processor...on Rhapsody

by Andrew Stone, Chief Executive Haquer, Stone Design Corp

Here is a Simple Rich Text and Graphics Word Processor you can build yourself in 20 minutes on Rhapsody

Leveraging the power of Rhapsody is your key to building cool apps quickly. If I asked you "How many lines of code would you have to write to implement a word procesor that reads/writes rich text files (including full support for graphics of EPS, TIFF, JPEG, PICT, GIF, etc type), full font support, full rulers with tabs and hanging indents, full support for color, printing, faxing and saving as PS with embedded fonts".

But wait, before you answer, that's not all (can you hear the Ginzu knife salesman yet?)... "What if it also had ligatures, kerning, superscripting, justification, underlining, ability to drag out graphics, copy and paste of contents and copy and paste of font styles? Don't answer yet, because it will also run on Windows95 and Windows NT, and has a built-in spell checker."

If I said 13 lines of code and that you'll be done in 20 minutes, would you believe it? This is why I quit developing on the Mac in 1989 when I saw my first NeXT demo, and why I'm happy as heck to be developing on a Mac in 1997!

First look at Rhapsody

The week before Macworld Boston 97, the Rhapsody Group at Apple invited several key OpenStep developers out to Cupertino to port their wares to Rhapsody running on the PowerPC. It was a great privilege to be included in this 3 day Kitchen - a MacHack with the Apple engineers dropping in and helping us at all hours. And, as promised, create, compile, and it "just worked".

This article will take you step-by-step through the process of creating a new application, building the user interface, generating the skeleton class code, filling in the 13 lines required, compiling and testing your word processor. If you encounter terms you don't recognize, please refer to the online documentation for developers, especially /NextLibrary/Documentation/NextDev/TasksAndConcepts/DevEnvGuide/DevGuide.rtfd.

Note that this article was written before the Developer release, so be aware that the screenshots may be a bit out-of-date! Note also that the purpose is to show how easy it is to get going, not good application architecture!

How to Build It

Step 0: Install the Rhapsody Developer release on your Power Mac, if you haven't done so already. Refer to Apple's instructions on how to do this.

1. Launch ProjectBuilder.app (aka "PB").

It's in /NextDeveloper/Apps, just double-click it.

2. Click Project - New...

An OpenPanel will come up - select "Application" for project type in the pop-up menu, type in "sWord" and "OK".

This will create a new directory named "sWord" with various project files:

PB.project: the file which maintains your makefiles.
Makefile, Makefile.preamble, Makefile.postamble: the makefiles.
sWord_main.m: the source file which defines main().
English.lproj: the directory with localized interface files (NIBs)
sWord.iconheader: the file which keeps track of App and Doc icons.

All of these files are created and maintained by ProjectBuilder - you don't have to write a single line of code to get your app skeleton.

3. In the sWord ProjectBuilder window, click "Interfaces", and then double-click "sWord.nib" to automatically launch InterfaceBuilder - where you will design your interface, create new classes, and test your application.

Note also the sWord-windows.nib file, which is for deploying your application on WindowNT and Window95, with no changes to your code! Since Windows organizes its menus differently, this NIB file will be different, according to Windows human interface (or lack thereof) design.

4. In InterfaceBuilder's Palette window, click the "Text" icon to load "DataViews", the palette containing Text in a ScrollView. Drag the ScrollView onto your main window, "My Window".

5. Move the ScrollView to the upper left hand corner of your window, and drag its bottom right knob to resize the ScrollView to fill your window.

6. We will now add the ability for the Text to be able to accept drag and drop graphics, as well as display and save them. Bring up InterfaceBuilder's Inspector Panel with Tools - Inspector. Be sure that the ScrollView is selected. All you have to do is click the "Graphics Allowed" switch!

7. InterfaceBuilder allows you to specify how objects behave when the window they are in is resized. For our ScrollView with our Text object to automatically fill the window, we must set its "autosizing". IB allows to visually set these constraints. This eliminates us having to write code to deal with window size changes.

Choose "Size" from the pop-up menu at the top of the inspector. The Size inspector allows you to specify how objects behave when a user resizes the window. Lines mean "stays fixed", springs means "size to fit". click the middle vertical and horizontal lines to allow the ScrollView to expand and contract with the window:

8. It's time to add power to our app, which we will get for free by adding various menus to our app. By default, IB gives your app some lightweight menus without the depth of functionality that is possible. For example, the stock "Edit" menu just has copy,cut,delete and paste. However, if you drag off an "Edit" menu from the IB palette, it will contain the full range of menu items and associated functionality, including the SpellChecker and a Find Menu.

First, delete some of the stock ones provided by clicking the menu item, and choosing Edit - Cut. (This may change for Rhapsody Developer Release.) Your menu should look something like this now:

9. In IB's Palette window, click the Menu icon to load the Menus. Drag over the following menus from the Palette to the sWord Menu window:

Apple
	Document (rename this to "File")
	Edit (replace the other one - this one has a Spell Checker in it!)
	Font
	Text

Click the File menu to drop it down. From the IB Palette window, click and drag from the "Item" button to the sWord File menu. Rename the new menu item to "Page Setup...". Drag over another menu item, and rename this one to "Print...". These items may be there automatically in the Rhapsody Developer Release.

10. Now we are going to design a simple object, add its outlets (technically speaking, "instance variables") and actions (Objective C methods), and have InterfaceBuilder automatically create the source files for this new class. All you will have to do is add the few lines of code reproduced below to make these custom actions do something useful.

Click the "Classes" tab in the window with the "Instances" of objects in your interface, and an outline of the class hierarchy will be displayed.

Click "NSObject". Select "Classes - Subclass" from the menu bar.

Rename "MyNSObject" to "WordDelegate".

11. We will now add an instance of this new class, WordDelegate to our app. Choose "Classes- Instantiate".

Click the "Instances" tab to reveal what we've added:

12. Now, return to the "Classes" tab to add the actions (the objC method called when you click a menu item or button) and outlets (the instances of objects that your WordDelegate knows about) to the WordDelegate Class.

13. Click the "outlet plug" icon to the right of the WordDelegate, and click "Outlets" when it appears. Hit the RETURN key to create a new outlet, "myOutlet". Double-click to select the text and rename this outlet to "theText". This outlet will become an instance variable in our new WordDelegate class, so we can refer to the NSTextView object programmatically and send messages to it, but we'll "hook it up" in InterfaceBuilder. "Hooking Up" is the visual programming equivalent of assigning both an action and a target for menu items, buttons, controls, etc.

14. Connect the WordDelegate's outlet "theText" to the NSTextView which is inside of the ScrollView by control-dragging from the WordDelegate instance. Double-click "theText" in the Inspector's Outlets Browser.

15. Now, we'll add the functionality to our WordDelegate by adding the actions to which it can respond.

a. Click the small cross icon on the right to drop down the "Actions".

b.Select Actions, and type RETURN to add a new action.

c. Rename it "newText:".

d. Again, type RETURN and rename the new action to "openText:".

e. Again, for "saveText:".

16. Now, we'll connect our menu items to the object which performs the action and select the action to be performed.

Click the File menu to drop it down. Hold down the Control-Key, and click-drag from the Open... menu to the instance of WordDelegate, and release the mouse. Black lines will connect them up. Select "openText:" in the Actions browser, and click "Connect" in the NSMenuItem Inspector (double-click openText: to avoid this second step).

Repeat this for "Save" and "New", but double-click the actions "saveText:" and "newText:" respectively.

17. In the same control-drag manner, connect the Page Setup... to "First Responder" object in the Instance Browser. This is a very cool "placeholder" object which will send the method to the most appropriate object for the current context of the application. In Rhapsody, there is this notion of a responder chain which begins with the active user interface object (such as the Text if your cursor is blinking there), the window's delegate, the window, then the Application's delegate, and finally, the Application itself. The action is sent to the first object in the chain that responds to it (ie First Responder), and if none do, the menu item is automatically dimmed and disabled. For a full description of the Responder chain, you can access the online documentation via ProjectBuilder: click "Frameworks" - "AppKit.framework" - "Documentation" - "Reference" - "Classes" - "NSResponder.rtf". You will quickly learn how useful these docs are!

For our WordDelegate object to get these First Responder method calls, we'll must insert our WordDelegate into the First Responder chain.

Control-Drag from the "My window" icon in the Instance Browser to the "WordDelegate" instance, and select "delegate" outlet in the Outlets browser of the Window Inspector.

18. Control drag from "Page Setup..." menu item in the dropped down File menu to the First Responder icon in the Instances browser. Double-click "runPageLayout:" in the Inspector's Actions browser.

Likewise, Control-drag from "Print..." menu item to the Text portion of the ScrollView. Double-click "print:" in the Actions browser.

19. Now, let's test drive our app within InterfaceBuilder by choosing "Document- Test Interface". This then "runs" our application in an interpreted environment, so you can try out typing text, changing fonts, bringing up the ruler, dragging in graphics and so on. You won't be able to save or open yet, because we need to write that code, compile it, and run the compiled version to see additional functionality over what is already part of the runtime system.

20. We've designed an object, hooked it up, now let's ask IB to make the skeletal source files. Click the "Classes" tab and select the WordDelegate Class. Choose "Classes- Create Files..." from the menu bar.

After verifying that creating classes is what you want to do, InterfaceBuilder will then ask you if you want insert these new files into your sWord project.

Click "OK", and then ProjectBuilder will come up showing you the new source files.

21. Click "WordDelegate.m" under the Classes category in ProjectBuilder. The skeletal source file will be displayed, now it's time to write those 13 lines of code, and you'll see the beauty and elegance of Rhapsody!

22. Type in this code, I added the comments for your edification, so they don't count in the number of lines of code!

 ***** WordDelegte.m *****

#import "WordDelegate.h"
@implementation WordDelegate
- (void)newText:(id)sender
{
// empty out the text with the empty NSString:
    [theText setString:@""];

// Set the window's title to be untitled:
    [[theText window]setTitle:@"Untitled"];
// bring the window up in case the user has closed it:
    [[theText window] makeKeyAndOrderFront:self];
}

- (void)openText:(id)sender
{
// Get a new Open Panel
    NSOpenPanel *openPanel = [NSOpenPanel openPanel];

// Have it run modal and look for files of "rtf" or "rtfd" type:
    if ([openPanel runModalForTypes:[NSArray arrayWithObjects:@"rtf",@"rtfd",NULL]]) {
// we have a valid file, ask theText to read it in
        [theText readRTFDFromFile:[openPanel filename]];
// Update the window's name with the filename, but in a readable way:
        [[theText window]setTitleWithRepresentedFilename:[openPanel filename]];
// bring the window up in case the user has closed it:
        [[theText window] makeKeyAndOrderFront:self];
    }
}

- (void)saveText:(id)sender
{
// Get a new Save Panel:
    NSSavePanel *savePanel = [NSSavePanel savePanel];

// Set it to save "rtfd" files:
    [savePanel setRequiredFileType:@"rtfd"];

// Run modal, which returns YES if a valid path is chosen:
    if ([savePanel runModal]) {

// Ask the text to write itself to the chosen filename
// But don't make it back up before
// Set atomically:YES if you want "save backups", slower but more secure
        [theText writeRTFDToFile:[savePanel filename] atomically:NO];

// Update the title bar of the window
        [[theText window]setTitleWithRepresentedFilename:[savePanel filename]];
   }
}


@end
*************************

23. Click PB's Build icon, which brings up the "sWord - Project Build" panel. Click the Hammer icon again, and your app will get compiled. You can run it from within PB, or simply double-click the sWord.app in your sWord directory.

24. To build an installed version, click the "Options" panel button, and choose "Install" for the make target, then select the architectures you wish your app to run on. Build again. This will install the sWord.app into your ~/Apps directory, after "stripping" it to its smallest possible size.

25. Launch sWord.app and try it out!

Epilogue

That was easy, eh? Here are some things you can do to enhance your word processor:

  1. Rename "My Window" to "Untitled" so that the title starts in the right state. This is trivial to do in IB's Inspector, "Attributes" when the window is selected in the Instance browser.
  2. Add multiple documents to your app by creating a separate nib file which is owned by the WordDelegate class. See /NextDeveloper/Examples/AppKit/TextEdit for a very powerful, yet simple TextEditor which allows multiple docs (Document.h & Document.m).
  3. Add an Application Icon by creating a 48*48 icon (/NextDeveloper/Apps/IconBuilder.app), saving it, and then dragging it from the FileViewer to the "Project" icon well in ProjectBuilder's inspector, and recompiling.
  4. Add Find - TextFinder.h, TextFinder.m and FindPanel.nib and FindPanel.strings from TextEdit contain the functionality you need. This is much vaunted "code reuse" of object programming!
  5. Create methods for SaveAs... Again, look at the document architecture in the /NextDeveloper/Examples/Appkit folder.
  6. Add an "About..." panel. Drag in a panel from the IB palette and connect the "About..." menu item to this panel, with an action of "orderFront:".
  7. Add Tool Tips. Simply create an rtf file for each object that you want give popup help to, and attach to the user interface object in IB, Inspector- Help.
  8. Make the OpenPanel and SavePanel remember their last opened directory by making those variables static, and "retaining" them.
 - (void)saveText:(id)sender
{
// Create a static variable lives between invocations:
    static NSSavePanel *savePanel = nil;
// If it's the first time through, get a new Save Panel:
    if (savePanel == nil) {
   	 NSSavePanel *savePanel = [[NSSavePanel savePanel] retain];
    }
// Now, it will 'remember' it's last chosen directory...

Anyway, I hope this gives you a taste for the elegance and comfort of finely integrated Rhapsody development tools.


Andrew Stone, an early HyperTalk developer and coauthor of "Tricks of the HyperTalk Masters" emigrated to the NeXT community in 1989, going on to write such NeXT classics as TextArt, Create, DataPhile and 3Dreality.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Fantastical 2.3.6 - Create calendar even...
Fantastical 2 is the Mac calendar you'll actually enjoy using. Creating an event with Fantastical is quick, easy, and fun: Open Fantastical with a single click or keystroke Type in your event... Read more
Creative Kit 1.1 - $149.99
Creative Kit 2016--made exclusively for Mac users--is your ticket to the most amazing images you've ever created. With a variety of powerful tools at your fingertips, you'll not only repair and fine-... Read more
iMazing 2.2.3 - Complete iOS device mana...
iMazing (was DiskAid) is the ultimate iOS device manager with capabilities far beyond what iTunes offers. With iMazing and your iOS device (iPhone, iPad, or iPod), you can: Copy music to and from... Read more
Apple Configurator 2.4 - Configure and d...
Apple Configurator makes it easy to deploy iPad, iPhone, iPod touch, and Apple TV devices in your school or business. Use Apple Configurator to quickly configure large numbers of devices connected to... Read more
WhatRoute 2.0.18 - Geographically trace...
WhatRoute is designed to find the names of all the routers an IP packet passes through on its way from your Mac to a destination host. It also measures the round-trip time from your Mac to the router... Read more
Posterino 3.3.5 - Create posters, collag...
Posterino offers enhanced customization and flexibility including a variety of new, stylish templates featuring grids of identical or odd-sized image boxes. You can customize the size and shape of... Read more
Skim 1.4.28 - PDF reader and note-taker...
Skim is a PDF reader and note-taker for OS X. It is designed to help you read and annotate scientific papers in PDF, but is also great for viewing any PDF file. Skim includes many features and has a... Read more
Apple macOS Sierra 10.12.4 - The latest...
With Apple macOS Sierra, Siri makes its debut on Mac, with new features designed just for the desktop. Your Mac works with iCloud and your Apple devices in smart new ways, and intelligent... Read more
Apple Numbers 4.1 - Apple's spreads...
With Apple Numbers, sophisticated spreadsheets are just the start. The whole sheet is your canvas. Just add dramatic interactive charts, tables, and images that paint a revealing picture of your data... Read more
Xcode 8.3 - Integrated development envir...
Xcode includes everything developers need to create great applications for Mac, iPhone, iPad, and Apple Watch. Xcode provides developers a unified workflow for user interface design, coding, testing... Read more

Power Rangers: Legacy Wars beginner...
Rita Repulsa is back, but this time she's invading your mobile phone in Power Rangers: Legacy Wars. What looks to be a straightforward beat 'em up is actually a tough-as-nails multiplayer strategy game that requires some deft tactical maneuvering.... | Read more »
Hearthstone celebrates the upcoming Jour...
Hearthstone gets a new expansion, Journey to Un'Goro, in a little over a week, and they'll be welcoming the Year of the Mammoth, the next season, at the same time. There's a lot to be excited about, so Blizzard is celebrating in kind. Players will... | Read more »
4 smart and stylish puzzle games like Ty...
TypeShift launched a little over a week ago, offering some puzzling new challenges for word nerds equipped with an iOS device. Created by Zach Gage, the mind behind Spelltower, TypeShift boasts, like its predecessor, a sleak design and some very... | Read more »
The best deals on the App Store this wee...
Deals, deals, deals. We're all about a good bargain here on 148Apps, and luckily this was another fine week in App Store discounts. There's a big board game sale happening right now, and a few fine indies are still discounted through the weekend.... | Read more »
The best new games we played this week
It's been quite the week, but now that all of that business is out of the way, it's time to hunker down with some of the excellent games that were released over the past few days. There's a fair few to help you relax in your down time or if you're... | Read more »
Orphan Black: The Game (Games)
Orphan Black: The Game 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: Dive into a dark and twisted puzzle-adventure that retells the pivotal events of Orphan Black. | Read more »
The Elder Scrolls: Legends is now availa...
| Read more »
Ticket to Earth beginner's guide: H...
Robot Circus launched Ticket to Earth as part of the App Store's indie games event last week. If you're not quite digging the space operatics Mass Effect: Andromeda is serving up, you'll be pleased to know that there's a surprising alternative on... | Read more »
Leap to victory in Nexx Studios new plat...
You’re always a hop, skip, and a jump away from a fiery death in Temple Jump, a new platformer-cum-endless runner from Nexx Studio. It’s out now on both iOS and Android if you’re an adventurer seeking treasure in a crumbling, pixel-laden temple. | Read more »
Failbetter Games details changes coming...
Sunless Sea, Failbetter Games' dark and gloomy sea explorer, sets sail for the iPad tomorrow. Ahead of the game's launch, Failbetter took to Twitter to discuss what will be different in the mobile version of the game. Many of the changes make... | Read more »

Price Scanner via MacPrices.net

Is A New 10.5-inch iPad Still Coming In April...
There was no sign or mention of a long-rumored and much anticipated 10.5-inch iPad Pro in Apple’s product announcements last week. The exciting iPad news was release of an upgraded iPad Air with a... Read more
T-Mobile’s Premium Device Protection Now Incl...
Good news for T-Mobile customers who love their iPhones and iPads. The “Un-carrier” has become the first national wireless company to give customers AppleCare Services at zero additional cost as part... Read more
FileWave Ensures Support for Latest Apple OS...
FileWave multi-platform device management providers announced support for Apple’s release yesterday of iOS 10.3, macOS Sierra 10.12.4, and tvOS 11.2. FileWave has a history of providing zero-day... Read more
Use Apple’s Education discount to save up to...
Purchase a new Mac or iPad using Apple’s Education Store and take up to $300 off MSRP. All teachers, students, and staff of any educational institution qualify for the discount. Shipping is free: -... Read more
Apple refurbished Apple Watches available sta...
Apple is now offering Certified Refurbished Series 1 and Series 2 Apple Watches for 14-16% off MSRP, starting at $229. An Apple one-year warranty is included with each watch. Shipping is free: Series... Read more
9-inch 32GB Space Gray iPad Pro on sale for $...
B&H Photo has the 9.7″ 32GB Space Gray Apple iPad Pro on sale for $549 for a limited time. Shipping is free, and B&H charges NY sales tax only. Their price is $50 off MSRP. Read more
13-inch MacBook Airs on sale for $100-$150 of...
B&H Photo has 13″ MacBook Airs on sale for up to $150 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 13″ 1.6GHz/128GB MacBook Air (MMGF2LL/A): $899 $100 off MSRP - 13″ 1.... Read more
13-inch MacBook Airs, Apple refurbished, in s...
Apple has Certified Refurbished 2016 13″ MacBook Airs available starting at $849. An Apple one-year warranty is included with each MacBook, and shipping is free: - 13″ 1.6GHz/8GB/128GB MacBook Air: $... Read more
12-inch Retina MacBooks on sale for $1199, sa...
B&H has 12″ 1.1GHz Retina MacBooks on sale for $100 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 12″ 1.1GHz Space Gray Retina MacBook: $1199 $100 off MSRP - 12″ 1.1GHz... Read more
Save up to $260 with Apple refurbished 12-inc...
Apple has Certified Refurbished 2016 12″ Retina MacBooks available for $200-$260 off MSRP. Apple will include a standard one-year warranty with each MacBook, and shipping is free. The following... Read more

Jobs Board

Fulltime aan de slag als shopmanager in een h...
Ben jij helemaal gek van Apple -producten en vind je het helemaal super om fulltime shopmanager te zijn in een jonge en hippe elektronicazaak? Wil jij werken in Read more
Desktop Analyst - *Apple* Products - Montef...
…technology to improve patient care. JOB RESPONSIBILITIES: Provide day-to-day support for Apple Hardware and Software in the environment based on the team's support Read more
*Apple* Mobile Master - Best Buy (United Sta...
**493168BR** **Job Title:** Apple Mobile Master **Location Number:** 000827-Denton-Store **Job Description:** **What does a Best Buy Apple Mobile Master do?** At Read more
Fulltime aan de slag als shopmanager in een h...
Ben jij helemaal gek van Apple -producten en vind je het helemaal super om fulltime shopmanager te zijn in een jonge en hippe elektronicazaak? Wil jij werken in Read more
*Apple* Mobile Master - Best Buy (United Sta...
**492889BR** **Job Title:** Apple Mobile Master **Location Number:** 000886-Norwalk-Store **Job Description:** **What does a Best Buy Apple Mobile Master do?** Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.