Perhaps I must begin with an apology for the title. Its Swedish, and translates to a clever program. which is a bit of an overstatement for a minor hack but I couldnt resist the opportunity to make a bilingual pun.

The program, in fact, isnt clever at all. It merely serves to demonstrate how you can take control of the way the List Manager draws your data.

The List Manager, described in Inside Mac, volume IV, is a very simple table construction and selection function that lets your program manage a small collection of data. I use it in a number of applications: for example, to store the phone numbers for an autodialer and the names of elite runners in a road race display program.

While the List Manager is simple to use, it has a few limitations. For example, it is pretty sloppy about how it handles fonts, so if you put a list in a dialog, you run the risk of displaying parts of the dialog in the list font, rather than the dialog font.

Fortunately, the good folk who designed the List Manager gave programmers a way to add our own control function. They assume well write the function as a code resource that is stored in the applications resource fork. While this works well for most applications, this article shows two tricks that should make the list definition function easier to write and debug (no separate code resource) and easier to integrate into an application. The debugging advantages are significant: it is impossible to use the Think C symbolic debugger in a separately-compiled code resource.

The List Handler

Ignoring for a moment how we actually get there, the LDEF resource performs four services for the List Manager:

1. Initialize any private information when the list is first created. The demo handler defines some information based on the current font.

2. Draw a list cell. If your application doesnt specify a drawing routine, the demo handler draws the cell using the font (and size) that were specified when the list was created. The windows original font and size are restored, so the list can be used in, e.g., a dialog without messing up the font/size for other dialog items.

3. Hilite a list cell. The demo handler uses the new method of color highlighting described in Inside Mac, vol 5, pp 61-62.

4. Close a list -- this call lets a LDEF procedure release any private information. The demo handler ignores this call since it doesnt store any private information.

The bulk of the work is done by the draw routine: the pen is moved to the proper place within the cell, the list data storage handle is locked in memory, the display area is erased, the font and size are set, and the data drawn (either by the handler or by the applications callback function). Finally, the list data handle lock state is restored. If the cell was selected, the normal highlight procedure is then executed.

With that as background, the only remaining problem is connecting the list handler to your application. The sample program demonstrates three possible methods: building a separate code resource, building a fake code resource, and directly installing the list handler in the ListRecord without a separate resource.

The Code Resource

The approved way to write a list handler is to build it as a separate code resource that is stored as a LDEF resource in the applications resource fork. Then, you specify the number of the LDEF resource when you execute LNew. If youve never done this before, the process is strange, but its fairly simple if you take it step-by-step. Using Think C (version 4), do the following:

1. Create a new project, say LDEF.Π.

2. Add the LDEF Resource.c and MacHeaders files.

3. Set the project type to Code Resource, set the resource name to LDEF and the resource id to, say, 128.

4. Build the code resource, saving it as LDEF.rsrc

Now, build your application. Think C (unfortunately) only supports RMaker, so you have to add the following line to your RMaker source file:

Instead of building a separate LDEF resource, you can also compile the entire LDEF into your program. However, in order to satisfy the Macintosh Toolbox standards, you still need a resource. You can create one on the fly by building a callback LDEF. You do this by creating a dummy LDEF in your resource file that is defined as follows:

/* 1 */
Type LDEF = GNRL
, 128
.h
4EF9 0000 0000

Then, when your program starts, it calls the SetupLDEF function that plugs the address of the actual function into the LDEF and marks the LDEF as non-purgeable. As with the normal procedure, LNew specifies the resource id (128 in the example), and the toolbox ListManager manages the resource normally. Hex 4EF9 is a jump instruction, so the ListManager jumps to the real function. Your application only calls SetupLDEF once, even if the list handler will be used for several lists.

No Resource Needed

You dont even need the degenerate 3 word version above. Instead, you can stuff the function address into the ListRecord after creating the list. While this technique seems to work without problems, it isnt blessed by the Mac folk, so dont complain when it stops working in some future release. The add_LDEF() function creates the fake handle -- call it just after you create the list. Be sure to call remove_LDEF() before deleting the list: otherwise, your program will surely crash!

Which should you use?

Each of the three methods has its own advantages and disadvantages:

 The fully-compiled method is perhaps only useful if you absolutely cannot have a visible LDEF resource: perhaps for security or anti-viral reasons. Before using it, you should remember that it isnt blessed by the Macintosh interface people.

 The fake-resource callback method is probably the most useful for development: you can set breakpoints within the list handler. (By the way, the fake-resource technique is useful for other user-written handlers that the Toolbox assumes will be stored as resources.) It does require, however, that you make sure that the LDEF be kept memory-resident -- otherwise, youll have messy, hard to debug crashes.

 The true-resource method is best if youre worried about memory space, since the Toolbox takes care of loading and unloading the resource. It has the significant disadvantage of being essentially impossible to debug without an assembly-language debugger.

If youre not sure, Id recommend using the fake-resource technique, making sure that the list handler is stored in a permanently-resident code segment.

The Sample Program

The sample program is not intended to show you how to write a Macintosh application. All it does is let you open a file and display any ICN# resources as a list. It has an interesting bug: to show that the list display function (in IconicLDEF.c) can access the applications globals, the code references a flag that allows displaying the cells contents either as an icon or as the icons value. If you switch between the two modes with several partially-obscured windows on the screen, youll note that the Macintosh efficiently -- but incorrectly --calculates what needs to be redrawn, and some icons will be displayed partially in one form and partially in the other. This is an easy bug to fix, but I left it in to warn you about the problems of using application-wide globals where a document-specific (or window-specific) variable would be better.

When reading the source of the application and list handler, note that they are conditionally-compiled to operate in all three modes. The projects are, of course, different:

 CompiledDemo.Π

CompiledDemo.c

CompiledLDEF.c

IconicLDEF.c

MacTraps

no resource file.

 FakeResource.Π

FakeDemo.c

FakeLDEF.c

IconicLDEF.c

MacTraps

FakeDemo.rsrc built from FakeDemo.r

 RealResource.Π

RealDemo.c

Iconic LDEF.c

MacTraps

RealResource.rsrc, built from RealLDEF.Π

RealLDEF.Π

RealLDEF.c

MacTraps

If you just type in the listing, youll get the fake-resource variant.

Acknowledgements

The ListManager is described in Inside Macintosh, Volume IV. Thanks to Amanda Walker, InterCon Corp. for posting the technique of calling an application-specific drawing function from the list handler to Usenet.

Software Updates via MacUpdate

SpamSieve 2.9.27 - Robust spam filter fo...

SpamSieve is a robust spam filter for major email clients that uses powerful Bayesian spam filtering.
SpamSieve understands what your spam looks like in order to block it all, but also learns what... Read more

VueScan 9.5.62 - 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

Fantastical 2.3.2 - 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

PCalc 4.4.4 - Full-featured scientific c...

PCalc is a full-featured, scriptable scientific calculator with support for hexadecimal, octal, and binary calculations, as well as an RPN mode, programmable functions, and an extensive set of unit... Read more

Alfred 3.2.1 - Quick launcher for apps a...

Alfred is an award-winning productivity application for OS X. Alfred saves you time when you search for files online or on your Mac. Be more productive with hotkeys, keywords, and file actions at... Read more

OmniPlan 3.6 - Robust project management...

With OmniPlan, you can create logical, manageable project plans with Gantt charts, schedules, summaries, milestones, and critical paths. Break down the tasks needed to make your project a success,... Read more

Backblaze 4.2.0.990 - Online backup serv...

Backblaze is an online backup service designed from the ground-up for the Mac. With unlimited storage available for $5 per month, as well as a free 15-day trial, peace of mind is within reach with... Read more

AppDelete 4.3.1 - $7.99

AppDelete is an uninstaller that will remove not only applications but also widgets, preference panes, plugins, and screensavers along with their associated files. Without AppDelete these associated... Read more

Apple GarageBand 10.1.4 - Complete recor...

The new GarageBand is a whole music creation studio right inside your Mac -- complete with keyboard, synths, orchestral and percussion instruments, presets for guitar and voice, an entirely... Read more

Adobe Lightroom 6.8 - Import, develop, a...

Adobe Lightroom is available as part of Adobe Creative Cloud for as little as $9.99/month bundled with Photoshop CC as part of the photography package. Lightroom 6 is also available for purchase as a... Read more

Latest Forum Discussions

Galaxy on Fire 3 - Manticore brings the series back for another round of daring space battles. It's familiar territory for folks who are familiar with the franchise. If you've beaten the game and are looking to broaden your horizons, might we... | Read more »

The best apps for your holiday gift exch...

What's that, you say? You still haven't started your holiday shopping? Don't beat yourself up over it -- a lot of people have been putting it off, too. It's become easier and easier to procrastinate gift shopping thanks to a number of apps that... | Read more »

MyTona, based in the chilly Siberian city of Yakutsk, has brought a little festive fun to its hidden object game Seekers Notes: Hidden Mystery. The Christmas update introduces some new inhabitants to players, and with them a chance to win plenty of... | Read more »

PINE GROVE 1.0
Device: iOS Universal
Category: Games
Price: $1.99, Version: 1.0 (iTunes)
Description:
A pine grove where there are no footsteps of people due to continuous missing cases. The case is still unsolved and nothing has... | Read more »

Niantic teases new Pokémon announcement...

After rumors started swirling yesterday, it turns out there is an official Pokémon GO update on its way. We’ll find out what’s in store for us and our growing Pokémon collections tomorrow during the Starbucks event, but Niantic will be revealing... | Read more »

3 reasons why Nicki Minaj: The Empire is...

Nicki Minaj is as business-savvy as she is musically talented and she’s proved that by launching her own game. Designed by Glu, purveyors of other fine celebrity games like cult favorite Kim Kardashian: Hollywood, Nicki Minaj: The Empire launched... | Read more »

Clash of Clans is getting its own animat...

Riding on its unending wave of fame and success, Clash of Clans is getting an animated web series based on its Clash-A-Rama animated shorts.As opposed to the current shorts' 60 second run time, the new and improved Clash-A-Rama will be comprised of... | Read more »

Leaks hint at Pokémon GO and Starbucks C...

Leaked images from a hub for Starbucks employees suggests that a big Pokémon GO event with the coffee giant could begin this very week. The images appeared on Reddit and hint at some exciting new things to come for Niantic's smash hit game.
| Read more »

DietSensor, Inc., a developer of smart food and nutrition applications designed to fight diabetes and obesity and help improve overall fitness, has announced the launch of its DietSensor app for... Read more

Best Buy has dropped their price on the 64GB Apple TV to $159.99 including free shipping. That’s $40 off MSRP.
32GB Apple TVs are on sale right now for $98 on Sams Club’s online store. That’s $51 off... Read more

12-inch Retina MacBooks, Apple refurbished, n...

Apple has restocked a full line of Certified Refurbished 2016 12″ Retina MacBooks, now available for $200-$260 off MSRP. Refurbished 2015 models are available starting at $929. Apple will include a... Read more

Apple has Certified Refurbished 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: $849 $... Read more

Apple refurbished iMacs available for up to $...

Apple has Certified Refurbished 2015 21″ & 27″ iMacs available for up to $350 off MSRP. Apple’s one-year warranty is standard, and shipping is free. The following models are available:
- 21″ 3.... Read more

Apple’s Education discount saves up to $300 o...

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

MacTech is a registered trademark of Xplain Corporation. Xplain, "The journal of Apple technology", Apple Expo, Explain It, MacDev, MacDev-1, THINK Reference, NetProfessional, Apple Expo, MacTech Central, MacTech Domains, MacNews, MacForge, and the MacTutorMan are trademarks or service marks of Xplain Corporation. Sprocket is a registered trademark of eSprocket Corporation. Other trademarks and copyrights appearing in this printing or software remain the property of their respective holders. Not responsible for typographical errors.

All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.