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:

 #defineqNeedsFPU1

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 {
public:
 virtual pascal void 
 INothingApplication(OSType itsMainFileType);
};

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

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

pascal void TDefaultView::Draw(Rect *)
{Rect itsQDExtent;
 
 PenNormal();    PenSize(10, 10);
 PenPat(qd.dkGray);
 GetQDExtent(&itsQDExtent);
 FrameRect(&itsQDExtent);
 TextFont(applFont); TextSize(72);
 MoveTo(45, 90); DrawString(“\pMacApp®”);
 PenNormal();
}

TNothingApplication *gNothingApplication;

int main()
{InitToolBox();
 if (ValidateConfiguration(&gConfiguration))
 { InitUMacApp(8);
 InitPrinting();
 gNothingApplication = new TNothingApplication;
 FailNIL(gNothingApplication);
 gNothingApplication->INothingApplication(kFileType);
 gNothingApplication->Run();
 }
 else StdAlert(phUnsupportedConfiguration);
 return 0;
}

 
AAPL
$100.57
Apple Inc.
+0.04
MSFT
$44.95
Microsoft Corpora
-0.38
GOOG
$584.49
Google Inc.
-2.37

MacTech Search:
Community Search:

Software Updates via MacUpdate

Picasa 3.9.138 - Organize, edit, and sha...
Picasa and Picasa Web Albums allows you to organize, edit, and upload your photos to the Web from your computer in quick, simple steps. Arrange your photos into folders and albums and erase their... Read more
Tidy Up 3.0.15.0 - Find duplicate files...
Tidy Up is a complete duplicate finder and disk-tidiness utility. With Tidy Up you can search for duplicate files and packages by the owner application, content, type, creator, extension, time... Read more
Parallels Desktop 10.0 - Run Windows app...
Parallels Desktop is simply the world's bestselling, top-rated, and most trusted solution for running Windows applications on your Mac. With Parallels Desktop for Mac, you can seamlessly run both... Read more
Apple Final Cut Pro X 10.1.3 - Professio...
Apple Final Cut Pro X is a professional video editing solution.Completely redesigned from the ground up, Final Cut Pro adds extraordinary speed, quality, and flexibility to every part of the post-... Read more
Apple Compressor 4.1.3 - Adds power and...
Compressor adds power and flexibility to Final Cut Pro X export. Customize output settings, work faster with distributed encoding, and tap into a comprehensive set of delivery features. Powerful... Read more
Chromium 36.0.1985.143 - Fast and stable...
Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all Internet users to experience the web. FreeSMUG-Free OpenSource Mac User Group build is... Read more
Macgo Blu-ray Player 2.10.6.1691 - Blu-r...
Macgo Mac Blu-ray Player can bring you the most unforgettable Blu-ray experience on your Mac. Overview Macgo Mac Blu-ray Player can satisfy just about every need you could possibly have in a Blu-ray... Read more
Apple Motion 5.1.2 - Create and customiz...
Apple Motion is designed for video editors, Motion 5 lets you customize Final Cut Pro titles, transitions, and effects. Or create your own dazzling animations in 2D or 3D space, with real-time... Read more
A Better Finder Rename 9.39 - File, phot...
A Better Finder Rename is the most complete renaming solution available on the market today. That's why, since 1996, tens of thousands of hobbyists, professionals and businesses depend on A Better... Read more
PopChar X 6.6 - Floating window shows av...
PopChar X helps you get the most out of your font collection. With its crystal-clear interface, PopChar X provides a frustration-free way to access any font's special characters. Expanded... Read more

Latest Forum Discussions

See All

Invaders! From Outer Space (Games)
Invaders! From Outer Space 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: | Read more »
Dementia: Book of the Dead (Games)
Dementia: Book of the Dead 1.00 Device: iOS Universal Category: Games Price: $2.99, Version: 1.00 (iTunes) Description: EXCLUSIVE CONTENT ONLY ON THE APP STORE. Medieval England. Times of knights, witches and hunters. What other... | Read more »
Wan Nyan Slash (Games)
Wan Nyan Slash 1.0 Device: iOS Universal Category: Games Price: $.99, Version: 1.0 (iTunes) Description: Wan Nyan Slash is an infinite adorable demon slaying slashing action game! Play as the wandering samurai Wan and Nyan as they... | Read more »
Fallin Love - The Game of Love (Games)
Fallin Love - The Game of Love 1.0 Device: iOS Universal Category: Games Price: $.99, Version: 1.0 (iTunes) Description: GRAVITATE AROUND LOVE | Read more »
Ancient Battle: Hannibal (Games)
Ancient Battle: Hannibal 1.0 Device: iOS Universal Category: Games Price: $.99, Version: 1.0 (iTunes) Description: | Read more »
Cubic Castles Review
Cubic Castles Review By Rob Thomas on August 20th, 2014 Our Rating: :: CASTLE CRAFTINGiPad Only App - Designed for the iPad Some ridiculously frustrating camera issues aside, Cubic Castles is a pretty neat, voxel-based crafting... | Read more »
Space Colors – Tips, Tricks, Strategies,...
Hello Cadets: Want to know what we thought about this hectic space combat/roguelike? Check out our Space Colors review! Space Colors is a cool shooter/roguelike from Team Chaos. You travel from planet to planet across a huge galaxy and complete a... | Read more »
Tap Sports Baseball – Tips, Tricks, and...
Tap Sports Baseball is a pretty simple game to learn, but that doesn’t mean it’s an easy game to master, by any means. To start your batting career off well, we thought we’d give you the heads up on some handy tips and tricks. Hey Batter-Batter:... | Read more »
Tap Sports Baseball Review
Tap Sports Baseball Review By Jennifer Allen on August 20th, 2014 Our Rating: :: LET'S PLAY BALLUniversal App - Designed for iPhone and iPad Tap Sports Baseball is briefly fun but lacks some important features.   | Read more »
Earn to Die 2 Set to Drive in to the App...
Earn to Die 2 Set to Drive in to the App Store Later This Year Posted by Ellis Spice on August 20th, 2014 [ permalink ] Not Doppler has announced that Earn to Die 2, a sequel to their successful game | Read more »

Price Scanner via MacPrices.net

Mac Backup Guru 2.0 Drive Backup/Cloneing Uti...
Mac Backup Guru developer MacDaddy has released Mac Backup Guru 2.0, offering new and enhanced advanced features, such as bootable backups, synchronised volumes and folders, and a Snapshot mode that... Read more
Operate GE’s New Free-Standing KItchen Range...
Think you accidentally left the oven on? Switch it off while on the go. The new free-standing Profile™ Series gas and electric ranges are GE’s second cooking appliances, following their wall oven, to... Read more
Apple now offering certified refurbished 2014...
 The Apple Store is now offering Apple Certified Refurbished 2014 MacBook Airs for up to $180 off the cost of new models. An Apple one-year warranty is included with each MacBook, and shipping is... Read more
Best Buy’s College Student Deals: $100 off Ma...
Take an additional $100 off all MacBooks and iMacs, $50 off iPad Airs and iPad minis, at Best Buy Online with their College Students Deals Savings, valid through September 6th. Anyone with a valid .... Read more
MacBook Airs on sale for $100 off MSRP, free...
B&H Photo has three 2014 MacBook Airs on sale for $100 off MSRP. Shipping is free, and B&H charges NY sales tax only. They also include free copies of Parallels Desktop and LoJack for Laptops... Read more
Razer Taipan Mouse For Gamers And Non-Gamers...
If you’re a serious gamer on either Mac or Windows PCs, a serious gaming mouse is a necessity for first-tier performance. However, even if like me you’re not much of a gamer, there’s still a strong... Read more
15-inch 2.2GHz MacBook Pro on sale for $1899,...
Adorama has the new 15″ 2.2GHz Retina MacBook Pro on sale for $1899 including free shipping plus NY & NJ sales tax only. Their price is $100 off MSRP, and it’s the lowest price available for this... Read more
Mid-Size Tablet Shootout Posted: iPad mini wi...
I ‘m curious about how many iPads Apple is actually selling these days. It’s been widely rumored and anticipated that new models with A8 SoCs, 2 GB of RAM, 8 megapixel cameras, and fingerprint... Read more
The 15 Biggest iPad Air Problems And How To A...
What’s this? Fifteen “biggest” problems with the iPad Air? Does that mean there are a lot of smaller problems as well? Say it isn’t so! My old iPad 2 has manifested no hardware problems in three... Read more
TYLT Syncable-Duo, 2-in-1 USB Cable With Appl...
TYLT has introduced the Syncable-Duo, a universal cable solution for charging and syncing data to smartphones and tablets. The Syncable-Duo eliminates the need for multiple cables by incorporating... Read more

Jobs Board

*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
Senior Event Manager, *Apple* Retail Market...
…This senior level position is responsible for leading and imagining the Apple Retail Team's global event strategy. Delivering an overarching brand story; in-store, Read more
*Apple* Solutions Consultant - Apple (United...
**Job Summary** The ASC is an Apple employee who serves as an Apple brand ambassador and influencer in a Reseller's store. The ASC's role is to grow Apple Read more
Position Opening at *Apple* - Apple (United...
**Job Summary** Being a Business Manager at an Apple Store means you're the catalyst for businesses to discover and leverage the power, ease, and flexibility of Apple Read more
Position Opening at *Apple* - Apple (United...
**Job Summary** At the Apple Store, you connect business professionals and entrepreneurs with the tools they need in order to put Apple solutions to work in their Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.