Sep 98 Online
Volume Number: 14
Issue Number: 9
Column Tag: MacTech Online
The Little Framework that Could
by Jeff Clites, online@mactech.com
Getting Started with C++
Code reuse was one of the key motivating forces behind the development of
object-oriented programming. It's a simple idea, really - come up with a way to
organize code so that conceptually separate pieces are independent and self-contained.
Then, since these pieces don't rely on other parts of an application, they can be reused
in multiple projects without modification.
The obvious next step in this evolution is the development of application frameworks,
and the idea here is simple, too: most Macintosh applications, for instance, have a lot
of code in common - they initialize managers, track mouse clicks in menus, and use
scroll bars. This is where a framework comes in - it collects commonly-used code and
organizes it so that you can develop an application by focusing on the parts which make
your application distinctive while ignoring the mundane. This frees you from the
burden of writing the same code over and over, and provides you with well-debugged
code to do the dirty work. This all sounds great - so you may be asking, "what's the
problem?
MacZoop
Beginning C++ programmers on the Mac face a bit of a Catch-22. On the one hand, they
need to be able to test out small stretches of code while they are learning, but there
really is a lot of work to be done just to get a small application up and running. So,
they could really benefit from a framework - it would relieve them from writing
support code which they don't yet feel confident writing, and would allow them to be
pretty sure that if something doesn't work then it is a problem with their code and not,
say, that they forgot to initialize TextEdit. But, frameworks such as Apple's MacApp
and Metrowerks' PowerPlant were not designed with the beginner in mind - they were
designed for industrial-strength commercial application development. (For instance,
the front end to the Mac version of Netscape Navigator is PowerPlant-based.) Despite
excellent documentation, they can be overwhelming, especially for someone who is
just learning what inheritance and polymorphism are all about.
This is where MacZoop comes in. It is a small (well, maybe medium-sized) Macintosh
application framework generously developed and supported by Graham Cox, and it was
specifically designed to be a learning tool for those just starting out with C++. And, in
the spirit of enriching the Macintosh community, it's free.
MacZoop!
http://www.warwick.ac.uk/~corbe/MacZoop/MacZoop.html
http://developer.apple.com/dev/tools/macapp/index.html
Metrowerks (PowerPlant)
http://www.metrowerks.com/
In fact, without any additional code MacZoop builds into a working application. The
application doesn't do much, but it has File and Edit menus with the usual menu items,
and you can open new (empty) windows which are movable, zoomable, and resizable,
and they tile nicely across the screen, just as you would expect from a Mac application.
This may not sound like much, but any Mac programmer knows how much effort it
takes to set up such things, and how hard it can be for a beginner. This lets them build
their code in top of something which already works.
Graham has included a full bag of goodies to help you along. There is an electronic
manual, just shy of 200 pages, which uses color more effectively than any other
technical documentation I have seen. It provides a compact introduction to the key
concept of C++ and of programming the Macintosh in general, and really touches on
most subjects that a first-time Mac programmer needs to have under his belt. Also,
there is a small demo application showing off many of its main features, and a
full-featured paint program which serves as a more extensive example. (Both, of
course, come with full source code, and the manual has detailed instructions for
compiling the framework using CodeWarrior.)
Harnessing the Power of Resources
MacZoop sports a wealth of very clever features which make it useful beyond its role
as a learning tool, and it warrants a look from more experienced programmers as well.
For example, if you create a window with one of the traditional floating-window
WDEFs, it floats - it stays above all other windows in your application, and hides
itself when your application goes into the background - you don't have to worry about
the details. It also takes full advantage of ResEdit as an interface editor; for instance, it
provides two separate methods (one based on TCL and one on MacApp) for associating
commands with menu items, so that after setting up your resources you can forget
about your menus and think in terms of commands that your classes understand.
ResEdit is also used to create enhanced dialogs, with icon lists or scrolling text boxes
installed as easily as any other control.
A few other niceties round out the package, and are worthy of special mention. The
framework comes with its own small set of container classes and avoids any use of the
STL. This seems to violate the spirit of code reuse, since it duplicates functionality
already available as part of the language. But it is actually a clever move - it
introduces the concept of containers and templates without requiring a full
understanding of the ins and outs of the STL, and it avoids the code bloat often associated
with it. Finally, there are many utility classes which make things like creating custom
icons or displaying JPEGs a snap.
Extra Toppings
Well, I hope I've given you a sense of what MacZoop has to offer to beginners and to
experts alike - there are a multitude of features that I didn't get to mention. In addition
to the core distribution, there are a few must-have items contributed by other
authors. M. Uli Kusterer has written an extensive set of pane classes specifically for
MacZoop, which allow you to organize elements of your visual interface in a natural,
hierarchical manner. Uli is also developing Resurrection, a free resource editor for
use with MacZoop, written (of course) using MacZoop itself. Finally, Joe Strout has a
smaller set of pane classes, which work with MacZoop and with his own framework
Moof, which is much smaller than 'Zoop and which would also be well-suited to a
beginner.
Uli's MacZoop Classes
http://www.weblayout.com/witness/ZoopClasses.htm
Uli's Resurrection
http://www.weblayout.com/witness/Resurrection.htm
Joe's MacDev Page (Pane Classes, Moof, etc.)
http://www.strout.net/info/coding/macdev/intro.html
The Future
I encourage you to give MacZoop a look, or to point it out to your friends who are just
beginning to tinker with programming on the Mac. Professional programmers will at
some point want to learn about larger frameworks, but MacZoop will introduce you to
concepts that you can take with you when you move on, and it's a rich source of code
snippets and example of how to do things the "right" way. This is an especially exciting
time to be a Mac developer, with the advent of Mac OS X and ever-faster hardware, and
I hope that MacZoop and the work of other generous folk can help open the door to
non-programmers wishing to try their hand. Graham intends to make MacZoop fully
Mac OS X compliant as soon as the API is finalized (support for Appearance and
Navigation Services is in place now), and he has already begun work on a gaming
framework built around MacZoop. It should all be a lot of fun.
These and piles of other links are available from the MacTech Online web pages at
http://www.mactech.com/online/.