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
$467.36
Apple Inc.
+0.00
MSFT
$32.87
Microsoft Corpora
+0.00
GOOG
$885.51
Google Inc.
+0.00

MacTech Search:
Community Search:

Software Updates via MacUpdate

VueScan 9.2.23 - Scanner software with a...
VueScan is a scanning program that works with most high-quality flatbed and film scanners to produce scans that have excellent color fidelity and color balance. VueScan is easy to use, and has... Read more
Acorn 4.1 - Bitmap image editor. (Demo)
Acorn is a new image editor built with one goal in mind - simplicity. Fast, easy, and fluid, Acorn provides the options you'll need without any overhead. Acorn feels right, and won't drain your bank... Read more
Mellel 3.2.3 - Powerful word processor w...
Mellel is the leading word processor for OS X, and has been widely considered the industry standard since its inception. Mellel focuses on writers and scholars for technical writing and multilingual... Read more
Iridient Developer 2.2 - Powerful image...
Iridient Developer (was RAW Developer) is a powerful image conversion application designed specifically for OS X. Iridient Developer gives advanced photographers total control over every aspect of... Read more
Delicious Library 3.1.2 - Import, browse...
Delicious Library allows you to import, browse, and share all your books, movies, music, and video games with Delicious Library. Run your very own library from your home or office using our... Read more
Epson Printer Drivers for OS X 2.15 - Fo...
Epson Printer Drivers includes the latest printing and scanning software for OS X 10.6, 10.7, and 10.8. Click here for a list of supported Epson printers and scanners.OS X 10.6 or laterDownload Now Read more
Freeway Pro 6.1.0 - Drag-and-drop Web de...
Freeway Pro lets you build websites with speed and precision... without writing a line of code! With it's user-oriented drag-and-drop interface, Freeway Pro helps you piece together the website of... Read more
Transmission 2.82 - Popular BitTorrent c...
Transmission is a fast, easy and free multi-platform BitTorrent client. Transmission sets initial preferences so things "Just Work", while advanced features like watch directories, bad peer blocking... Read more
Google Earth Web Plug-in 7.1.1.1888 - Em...
Google Earth Plug-in and its JavaScript API let you embed Google Earth, a true 3D digital globe, into your Web pages. Using the API you can draw markers and lines, drape images over the terrain, add... Read more
Google Earth 7.1.1.1888 - View and contr...
Google Earth gives you a wealth of imagery and geographic information. Explore destinations like Maui and Paris, or browse content from Wikipedia, National Geographic, and more. Google Earth... Read more

Meet Daniel Singer, the Thirteen-Year-Ol...
Ever had the idea for an app, but felt like the lack of programming and design ability was a bit of a non-starter? Well, 13-year-old Daniel Singer has made an app. He’s the designer of Backdoor, a chat app that lets users chat with their friends... | Read more »
Flashout 2 Gets Revealed, Offers Up An E...
Flashout 2 Gets Revealed, Offers Up An Enhanced Career Mode and Exciting New Circuits Posted by Andrew Stevens on August 13th, 2013 [ permalink ] | Read more »
Mickey Mouse Clubhouse Paint and Play HD...
Mickey Mouse Clubhouse Paint and Play HD Review By Amy Solomon on August 13th, 2013 Our Rating: :: 3-D FUNiPad Only App - Designed for the iPad Color in areas of the Mickey Mouse Clubhouse with a variety of art supplies for fun 3-... | Read more »
Strategy & Tactics: World War II Upd...
Strategy & Tactics: World War II Update Adds Two New Scenarios Posted by Andrew Stevens on August 12th, 2013 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »
Expenses Planner Review
Expenses Planner Review By Angela LaFollette on August 12th, 2013 Our Rating: :: PLAIN AND SIMPLEUniversal App - Designed for iPhone and iPad Expenses Planner keeps track of future bills through due date reminders, and it also... | Read more »
Kinesis: Strategy in Motion Brings An Ad...
Kinesis: Strategy in Motion Brings An Adaptation Of The Classic Strategic Board Game To iOS Posted by Andrew Stevens on August 12th, 2013 [ | Read more »
Z-Man Games Creates New Studio, Will Bri...
Z-Man Games Creates New Studio, Will Bring A Digital Version of Pandemic! | Read more »
Minutely Review
Minutely Review By Jennifer Allen on August 12th, 2013 Our Rating: :: CROWDSOURCING WEATHERiPhone App - Designed for the iPhone, compatible with the iPad Work together to track proper weather conditions no matter what area of the... | Read more »
10tons Discuss Publishing Fantasy Hack n...
Recently announced, Trouserheart looks like quite the quirky, DeathSpank-style fantasy action game. Notably, it’s a game that is being published by established Finnish games studio, 10tons and developed by similarly established and Finnish firm,... | Read more »
Boat Watch Lets You Track Ships From Por...
Boat Watch Lets You Track Ships From Port To Port Posted by Andrew Stevens on August 12th, 2013 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »

Price Scanner via MacPrices.net

15″ 2.3GHz MacBook Pro (refurbished) availabl...
 The Apple Store has Apple Certified Refurbished 15″ 2.3GHz MacBook Pros available for $1449 or $350 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free. Read more
13″ 2.5GHz MacBook Pro on sale for $150 off M...
B&H Photo has the 13″ 2.5GHz MacBook Pro on sale for $1049.95 including free shipping. Their price is $150 off MSRP plus NY sales tax only. B&H will include free copies of Parallels Desktop... Read more
iPod touch (refurbished) available for up to...
The Apple Store is now offering a full line of Apple Certified Refurbished 2012 iPod touches for up to $70 off MSRP. Apple’s one-year warranty is included with each model, and shipping is free: -... Read more
27″ Apple Display (refurbished) available for...
The Apple Store has Apple Certified Refurbished 27″ Thunderbolt Displays available for $799 including free shipping. That’s $200 off the cost of new models. Read more
Apple TV (refurbished) now available for only...
The Apple Store has Apple Certified Refurbished 2012 Apple TVs now available for $75 including free shipping. That’s $24 off the cost of new models. Apple’s one-year warranty is standard. Read more
AnandTech Reviews 2013 MacBook Air (11-inch)...
AnandTech is never the first out with Apple new product reviews, but I’m always interested in reading their detailed, in-depth analyses of Macs and iDevices. AnandTech’s Vivek Gowri bought and tried... Read more
iPad, Tab, Nexus, Surface, And Kindle Fire: W...
VentureBeat’s John Koetsier says: The iPad may have lost the tablet wars to an army of Android tabs, but its still first in peoples hearts. Second place, however, belongs to a somewhat unlikely... Read more
Should You Buy An iPad mini Or An iPad 4?
Macworld UK’s David Price addresses the conundrum of which iPAd to buy? Apple iPad 4, iPad 2, iPad mini? Or hold out for the iPad mini 2 or the iPad 5? Price notes that potential Apple iPad... Read more
iDraw 2.3 A More Economical Alternative To Ad...
If you’re a working graphics pro, you can probably justify paying the stiff monthly rental fee to use Adobe’s Creative Cloud, including the paradigm-setting vector drawing app. Adobe Illustrator. If... Read more
New Documentary By Director Werner Herzog Sho...
Injuring or even killing someone because you were texting while driving is a life-changing experience. There are countless stories of people who took their eyes off the road for a second and ended up... Read more

Jobs Board

Sales Representative - *Apple* Honda - Appl...
APPLE HONDA AUTOMOTIVE CAREER FAIR! NOW HIRING AUTO SALES REPS, AUTO SERVICE BDC REPS & AUTOMOTIVE BILLER! NO EXPERIENCE NEEDED! Apple Honda is offering YOU a Read more
*Apple* Developer Support Advisor - Portugue...
Changing the world is all in a day's work at Apple . If you love innovation, here's your chance to make a career of it. You'll work hard. But the job comes with more than Read more
RBB - *Apple* OS X Platform Engineer - Barc...
RBB - Apple OS X Platform Engineer Ref 63198 Country USA…protected by law. Main Function | The engineering of Apple OS X based solutions, in line with customer and Read more
RBB - Core Software Engineer - Mac Platform (...
RBB - Core Software Engineer - Mac Platform ( Apple OS X) Ref 63199 Country USA City Dallas Business Area Global Technology Contract Type Permanent Estimated publish end Read more
*Apple* Desktop Analyst - Infinity Consultin...
Job Title: Apple Desktop Analyst Location: Yonkers, NY Job Type: Contract to hire Ref No: 13-02843 Date: 2013-07-30 Find other jobs in Yonkers Desktop Analyst The Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.