TweetFollow Us on Twitter

MacApp and C++ 2
Volume Number:6
Issue Number:9
Column Tag:Jörg's Folder

Related Info: TextEdit

C++ and MacApp, Part II

By Jörg Langowski, MacTutor Editorial Board

Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.

C++ and MacApp, Part II

Last month’s example was meant to give you an impression of the structure of a larger MacApp program in C++ and of some specific problems which arise when using the MacApp libraries from C++. We will now look into the structure of MacApp 2.0 applications in more detail, to see what happens at each point in a program.

We’ll start with a very simple example, the ‘nothing’ program that simply displays a window with the text ‘MacApp®’ in it. This program (from the Apple C++ examples) is printed in listing 1. The ‘main program’ consists simply of a few lines: First, most of the essential toolbox managers are initialized by a call to InitToolBox(). This procedure - through a call to the low-level routine DoRealInitToolBox() - calls InitGraf, InitFonts, InitWindows, FlushEvents, InitMenus, TEInit, and InitDialogs. It also sets a number of global MacApp variables, most of which won’t concern us here; an important one is gConfiguration, which is the configuration record that defines the system environment and allows us later to test whether we have a math coprocessor, the Script Manager, or other essential things.

ValidateConfiguration tests the configuration record against a number of global constants the values of which you can define at compile time in your program, if it requires the presence of certain system services or hardware options. Since we haven’t set any of those constants, our program will run on all machines. Nevertheless, we do the test, in case additions are made later. If, for instance, your program would need a floating point processor, you have to include at the beginning of the program:


If the program is then run on a machine without FPU, ValidateConfiguration(&gConfiguration) will return false and the program abort with an error dialog.

If the configuration is correct, the main code will be executed starting with a call to InitUMacApp(8); this will allocate 8 blocks of master pointers. Furthermore, various internal variables of MacApp will be initialized. If you intend to print from your program, you must also call InitPrinting(). This routine initializes more MacApp variables that are used in printing, and in particular creates one object of the class TStdPrintHandler. This object is assigned to the global gPrintHandler.

You then create a new instance of your application class, in this case TNothingApplication. Since there exist no constructors in Object Pascal, we have to define our application’s initialization code in an initialization method. First we check whether the object was successfully constructed by calling FailNIL(gNothingApplication), which will abort with an error message if the handle passed is NIL. If everything worked out, we can call our initialization method INothingApplication. As a parameter to this method we pass the four-character identification of the application’s main file type. In our case, the initialization code basically calls IApplication; this routine, besides various other things, initializes the application’s menu bar. The remaining code in INothingApplication is needed to prevent the linker from stripping the class code for TDefaultView.

What does this mean? In larger applications with complicated view and document structures, you tell the system how to create your views and documents explicitly by overriding TDocument::DoMakeViews and TApplication::DoMakeDocument. These methods will be called by MacApp when a new document is created (see below). However, you may alternatively use a mechanism of view creation from templates. MacApp will create a default view of type ‘dflt’ when starting the application if DoMakeViews has not been overridden. If we register our view class TDefaultView under the type name like ‘dflt’, MacApp will create a default view that contains the methods of TDefaultView according to our own definition.

As you see, everything happens at run time, thus the methods will be called by late binding. The linker doesn’t know that TDefaultView’s code will ever be called. Since we have an intelligent linker, it will try to save space and not include that code in the final application, which will result in a run time error when we’re trying to find TDefaultView’s methods. The resort is to create one instance of TDefaultView, as shown in the listing. If you initialize your own views by overriding TDocument:: DoMakeViews, this wouldn’t be necessary. Last month, I erroneously included the ‘dead code strip suppression’ part in my example; those lines may be omitted without consequences.

After all the preambles we can now call gNothingApplication->Run(), which enters the main event loop. Most of the user actions that have not explicitly been defined by overriding methods will now be handled automatically by MacApp. That is, one new document will be created with the default view inside, that view can be scrolled and the window resized, and the Apple, File and Edit menus function as you would expect them to.

The only method that we override is TDefaultView::Draw(Rect *area). This method does the actual drawing for our view - it simply draws the text ‘MacApp®’ surrounded by a gray border. Printing and saving of this document is handled by MacApp.

TEDemo - last month’s example

You will now need to pull last month’s MacTutor out of the chaos on your desk, or borrow a copy from a friend. That example was much longer and more complicated; you see, however, that the main program remains almost identical, we only had to add a call to InitUTEView() to be able to use a Text Edit view in our program. The actual behavior of the program is implemented in all the methods that are overridden by our definitions, and as you see, there are lots of them. First, the initialization method has grown somewhat. TEApplication::ITEApplication() now initializes the arrays of different text colors and icon rectangles in the icon palette. It still calls IApplication() (from the superclass); this call is always required, and it sets up the menu bar.

When the application starts, it will open one new document of its standard type. The routine that creates the document is TTEApplication::DoMakeDocument, and this is called by TApplication::OpenNew, which in turn gets called by TApplication:: HandleFinderRequest. The latter routine is called once on entering the Run() method of the application. DoMakeDocument, in turn, initializes the document by calling ITEDocument.

The reason that we see our desired view(s) in the document window is because TApplication:: OpenNew also calls the DoMakeViews method of the newly created document. This method has been defined in the program, and it creates a palette view at the top of the window which contains some icons, and a text view for the remaining part of the window. It also creates the standard print handler.

The DoRead and DoWrite methods of TTEDocument have been explained in part last month - it was here where we had to deal with the problem of passing procedure parameters in C++. These methods get called when the Open and Save items in the File menu are activated. The menu handler is called from the main event loop, which is part of the application’s default Run method; no need to write explicit menu handlers here.

The methods of TPaletteView handle the icon selections in the palette at the top of the window. DoMouseCommand looks which icon we clicked in, highlights the palette appropriately and sets the variable fIconSelected to the number of the icon selected. This variable is then later used to determine the cursor shape and the behavior of the text view on mouse clicks and keystrokes.

In the methods of TTEView, we have to override the menu handling since we have a new menu that determines the text color. Thus, the menu behavior is defined in the methods DoSetupMenus and DoMenuCommand. DoSetupMenus is called regularly by MacApp to make sure that changes to menus are made visible. DoMenuCommand is called when a menu item is selected.

DoMouseCommand will draw a box in the window if the ‘drawing tool’ is selected by methods from the Sketcher class which is defined further below; otherwise, it calls the method inherited from the superclass, which in this case implements TextEdit behavior for setting the caret position and selecting text.

TSketcher is the class of objects that draw rounded rectangles (TBoxes) in the window. An object of this class gets instantiated when the mouse is clicked in the window while the drawing tool icon is selected. The ‘Sketcher’ then tracks the mouse and creates a new TBox object at the position given by the result of the mouse tracking.

TBox, finally, draws itself inside the window as a rounded rectangle.

I hope this explanation has made clear at least approximately how a MacApp application sets itself up and uses the classes and methods defined in the program. We shall see more examples in the near future. Meanwhile, I would like to ask the remaining Forth believers to stay tuned; next month it’s your turn again.

Happy hacking.

Listing 1: nothing.cp 

#include <UMacApp.h>
#include <UPrinting.h>
#include <Fonts.h>

const OSType kSignature = ‘SS01’;
const OSType kFileType = ‘SF01’;

class TNothingApplication : public TApplication {
 virtual pascal void 
 INothingApplication(OSType itsMainFileType);

class TDefaultView : public TView {
 virtual pascal void Draw(Rect *area);

pascal void 
 (OSType itsMainFileType)
 RegisterStdType(“\pTDefaultView”, ‘dflt’);
 if (gDeadStripSuppression)
 { TDefaultView *aDfltView;
 aDfltView = new TDefaultView;

pascal void TDefaultView::Draw(Rect *)
{Rect itsQDExtent;
 PenNormal();    PenSize(10, 10);
 TextFont(applFont); TextSize(72);
 MoveTo(45, 90); DrawString(“\pMacApp®”);

TNothingApplication *gNothingApplication;

int main()
 if (ValidateConfiguration(&gConfiguration))
 { InitUMacApp(8);
 gNothingApplication = new TNothingApplication;
 else StdAlert(phUnsupportedConfiguration);
 return 0;


Community Search:
MacTech Search:

Software Updates via MacUpdate

Google Chrome 54.0.2840.71 - Modern and...
Google Chrome is a Web browser by Google, created to be a modern platform for Web pages and applications. It utilizes very fast loading of Web pages and has a V8 engine, which is a custom built... Read more
HoudahSpot 4.2.6 - Advanced file-search...
HoudahSpot is a powerful file search tool. Use HoudahSpot to locate hard-to-find files and keep frequently used files within reach. HoudahSpot will immediately feel familiar. It works just the way... Read more
Yummy FTP Pro 1.11.11 - $29.99
Yummy FTP Pro is an advanced Mac file transfer app which provides a full-featured professional toolkit combined with blazing speeds and impeccable reliability, so whether you want to transfer a few... Read more
Shimo - VPN client – for everyon...
Shimo is the most versatile VPN client for OS X and it enables really everybody to master secure network. It supports more protocols than any other VPN application out there! CiscoVPN, AnyConnect,... Read more
Dash 3.4.0 - Instant search and offline...
Dash is an API documentation browser and code snippet manager. Dash helps you store snippets of code, as well as instantly search and browse documentation for almost any API you might use (for a full... Read more
AirRadar 3.1.9 - $9.95
With AirRadar, scanning for wireless networks is now easier and more personalized! It allows you to scan for open networks and tag them as favourites or filter them out. View detailed network... Read more
Printopia 2.1.22 - Share Mac printers wi...
Run Printopia on your Mac to share its printers to any capable iPhone, iPad or iPod Touch. Printopia will also add virtual printers, allowing you to save print-outs to your Mac and send to apps.... Read more
SteerMouse 5.0 - Powerful third-party mo...
SteerMouse is an advanced driver for USB and Bluetooth mice. It also supports Apple Mighty Mouse very well. SteerMouse can assign various functions to buttons that Apple's software does not allow,... Read more
Alarm Clock Pro 10.2.5 - $19.95
Alarm Clock Pro isn't just an ordinary alarm clock. Use it to wake you up in the morning, send and compose e-mails, remind you of appointments, randomize the iTunes selection, control an internet... Read more
Cocktail 10.1 - General maintenance and...
Cocktail is a general purpose utility for macOS that lets you clean, repair and optimize your Mac. It is a powerful digital toolset that helps hundreds of thousands of Mac users around the world get... Read more

Latest Forum Discussions

See All

Game of Dice is now available on Faceboo...
After celebrating its anniversary in style with a brand new update, there’s even more excitement in store for Game of Dice has after just being launched on Facebook Gameroom. A relatively new platform, Facebook Gameroom has been designed for PC... | Read more »
4 addictive clicker games like Best Fien...
Clickers are passive games that take advantage of basic human psychology to suck you in, and they're totally unashamed of that. As long as you're aware that this game has been created to take hold of your brain and leave you perfectly content to... | Read more »
Smile Inc. Guide: How not to die on the...
As if Mondays weren't bad enough, at Smile Inc. you have to deal with giant killer donuts, massive hungry staplers, and blasting zones. It's not exactly a happy, thriving work environment. In fact, you'll be lucky to survive the nine to five.... | Read more »
Oh...Sir! The Insult Simulator (Games)
Oh...Sir! The Insult Simulator 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: | Read more »
WitchSpring2 (Games)
WitchSpring2 1.27 Device: iOS Universal Category: Games Price: $3.99, Version: 1.27 (iTunes) Description: This is the story of Luna, the Moonlight Witch as she sets out into the world. This is a sequel to Witch Spring. Witch Spring 2... | Read more »
4 popular apps getting a Halloween makeo...
'Tis the season for all things spooky. So much, so, in fact, that even apps are getting into the spirt of things, dressing up in costume and spreading jack o' lanterns all about the place. These updates bring frightening new character skins, scary... | Read more »
Pokémon GO celebrates Halloween with can...
The folks behind Pokémon GO have some exciting things planned for their Halloween celebration, the first in-game event since it launched back in July. Starting October 26 and ending on November 1, trainers will be running into large numbers of... | Read more »
Best Fiends Forever Guide: How to collec...
The fiendship in Seriously's hit Best Fiends has been upgraded this time around in Best Fiends Forever. It’s a fast-paced clicker with lots of color and style--kind of reminiscent of a ‘90s animal mascot game like Crash Bandicoot. The game... | Read more »
5 apps for the budding mixologist
Creating your own cocktails is something of an art form, requiring a knack for unique tastes and devising interesting combinations. It's easy to get started right in your own kitchen, though, even if you're a complete beginner. Try using one of... | Read more »
5 mobile strategy games to try when you...
Strategy enthusiasts everywhere are celebrating the release of Civilization VI this week, and so far everyone seems pretty satisfied with the first full release in the series since 2010. The series has always been about ultra-addictive gameplay... | Read more »

Price Scanner via

Macs’ Superior Enterprise Deployment Cost Eco...
IBM’s debunking of conventional wisdom and popular mythology about the relative cost of using Apple Mac computers as opposed to PCs running Microsoft Windows at the sixth annual Jamf Nation User... Read more
12-inch WiFi Apple iPad Pros on sale for $50-...
B&H Photo has 12″ WiFi Apple iPad Pros on sale for $50-$70 off MSRP, each including free shipping. B&H charges sales tax in NY only: - 12″ Space Gray 32GB WiFi iPad Pro: $749 $50 off MSRP -... Read more
Apple refurbished 12-inch 128GB iPad Pros ava...
Apple has Certified Refurbished 12″ Apple iPad Pros available for up to $160 off the cost of new iPads. An Apple one-year warranty is included with each model, and shipping is free: - 32GB 12″ iPad... Read more
Apple refurbished iPad minis and iPad Air 2s...
Apple recently dropped prices on several Certified Refurbished iPad mini 4s and 2s as well as iPad Air 2s. An Apple one-year warranty is included with each model, and shipping is free: - 16GB iPad... Read more
MacHTTP-js Preview Full-featured Web Server f...
MacHTTP.Org has released MacHTTP-js Preview for macOS, a full-featured Web server for 21st Century desktops and servers. MacHTTP-js is a modern take on the classic stand-alone, desktop computer Web... Read more
Samsung Galaxy Tab A 10.1 with S Pen Makes US...
Samsung Electronics America, Inc. has announced the release of the Galaxy Tab A 10.1 with S Pen in a highly mobile, lightweight tablet. “With an embedded S Pen, consumers can discover more ways to... Read more
13-inch 2.5GHz MacBook Pro (Apple refurbished...
Apple has Certified Refurbished 13″ 2.5GHz MacBook Pros available for $829, or $270 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free: - 13″ 2.5GHz MacBook Pros... Read more
27-inch iMacs on sale for up to $220 off MSRP
B&H Photo has 27″ Apple iMacs on sale for up to $200 off MSRP including free shipping plus NY sales tax only: - 27″ 3.3GHz iMac 5K: $2099 $200 off MSRP - 27″ 3.2GHz/1TB Fusion iMac 5K: $1899.99 $... Read more
13-inch 2.5GHz MacBook Pro available for $927...
Overstock has the 13″ 2.5GHz MacBook Pro available for $926.99 including free shipping. Their price is $172 off MSRP. Read more
Apple refurbished 2015 13-inch MacBook Airs a...
Apple has Certified Refurbished 2015 13″ MacBook Airs available starting at $759. An Apple one-year warranty is included with each MacBook, and shipping is free: - 2015 13″ 1.6GHz/4GB/128GB MacBook... Read more

Jobs Board

Security Data Analyst - *Apple* Information...
…data sources need to be collected to allow Information Security to better protect Apple employees and customers from a wide range of threats.Act as the subject Read more
*Apple* Retail - Multiple Positions - Apple,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Solutions Consultant - Apple (United...
# Apple Solutions Consultant Job Number: 52812872 Houston, Texas, United States Posted: Oct. 18, 2016 Weekly Hours: 40.00 **Job Summary** As an Apple Solutions Read more
Lead *Apple* Solutions Consultant - Apple (...
# Lead Apple Solutions Consultant Job Number: 52812906 Houston, Texas, United States Posted: Oct. 18, 2016 Weekly Hours: 40.00 **Job Summary** The Lead ASC is an Read more
*Apple* Retail - Multiple Positions- Towson,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.