TweetFollow Us on Twitter

November 93 - TDialogBehaviors

TDialogBehaviors

Bob Hablutzel

This article is the first article in what I hope will be a regular series of technical questions and answers on object oriented programming. The intent of this column is to go beyond simple answers. I intend to take a question, answer it, and then use that question as a springboard to a more general discussion on programming. I hope you find the results interesting.

The first articles will be culled from frequently asked questions on MacApp3Tech$, but I need your questions! I can be reached electronically at AppleLink: B.HABLUTZEL; by telephone at 708.328.0130; or by post at Bob Hablutzel, Hablutzel Consulting, 606 Asbury, Evanston, IL, USA 60202.

Q: I need to create a modal dialog using MacApp 3.0. I create the dialog using ViewEdit, but when I attempt to pose the dialog it opens briefly and immediately closes. How can I create a modal dialog?

A: Modal dialogs in MacApp 3.0 are handled with a TDialogBehavior, which is attached to the dialog window. This behavior is responsible for receiving and handling keystrokes, looking for keystrokes that dismiss the dialog, and sending events off to the appropriate control.

The problem with ViewEdit (in this case) is that it does not attach a TDialogBehavior to the dialog when it is created. When TWindow::PoseModally() is called, the first thing it does is attempt to locate the dialog behavior; if this lookup fails it closes the window and returns immediately (returning kNoIdentifier as the dismisser).

There are a few work-arounds for this. In ViewEdit, you can add a TDialogView to the window. TDialogView is really not required in MacApp 3.0; it is a holdover from the old mechanisms in MacApp 2.0. However, if there is one in the window, it will cause the TDialogBehavior to be added when the window is opened.

Alternatively, you can create the TDialogBehavior yourself, and attach it to the window before the TWindow::PoseModally() method is called. When you create the dialog behavior, you have to supply the identifiers for the default and cancel items (in the call to IDialogBehavior()). Once this behavior is added to the window, TWindow::PoseModally() can be called.

You can also call TWindow::SetModality() before calling TWindow::PoseModally(). This method will create the dialog behavior if none exists. However, this routine may not properly set up the default and cancel identifiers; you would then have to call TWindow::GetDialogBehavior() to retrieve the dialog, and stuff the identifiers into its fCancelItem and fDefaultItem fields.

Even if you do all of this, the dialog will still not dismiss properly unless you change the default event for the dismissing control to mDismiss (==34). So if you use ViewEdit to create the dialog, you need to change the event number for the control by hand. If you leave the control at its default event number (mButton for TButtons), the control will activate, but the dialog will not dismiss.

Finally, the best solution is to avoid using ViewEdit. Either AdLib or IcePick (3.0) will add the dialog behavior to the window when you use them to create the dialog. Using either of these products will ensure that the dialog has the appropriate behavior. These programs will also take care of changing the event number for the dismissing controls to mDismiss for you. (Both these applications are available from MADA).

More About TDialogBehavior

It is somewhat interesting to notice the actual mechanism used to handle the dismissing of the modal dialogs. The TDialogBehavior does not in itself dismiss the dialog, which as we will see in a second has some interesting implications. The TDialogBehavior simply activates the control that is designated as the default (or cancel) item. It does this by sending the control its default event number. The control then accepts the event, reacts appropriately (in the case of a TButton, it flashes), and sends the event up the event chain.

The event eventually reaches the TDialogBehavior attached to the window, which checks the see if the event is mDismiss. Notice that this is the first time that the behavior checks the event type. If the event is mDismiss, the behavior records the identifier of the source of the event in the fDismisser field, and ends the modal posing. TWindow::PoseModally(), which started the modal posing in the first place, retrieves the value of the TDialogBehavior::fDismisser field, and returns that as the result of the modal posing.

What is interesting about all this is that TDialogBehavior does not necessarily have to be used with modal dialogs; it can be used with modeless dialogs just as easily. When the return key is struck, for example, the default item will be invoked. If you attach a behavior to the default control that intercepts that control's default event number, you can quickly and easily create modeless dialogs that contain default (and closing) items.

Take, for example, a drawing application that supports 1° rotations. A modeless dialog could be created that presents the user with the number of degrees of rotation, and a default Rotate button. Every time the user strikes the return key, the Rotate button would be activated. You could attach a behavior to the Rotate button that checks for events where (a) the source of the event is the owner of the behavior, and (b) the event number matches the default event number (fEventNumber) of the owner. When it receives an event that matches this criteria, it would create whatever command was responsible for the rotation of the object, and post it to the application.

The question of where to attach the behavior is an interesting one. The behavior can be attached anywhere in the event chain and still function properly. It is mostly a question of style to decide where the behavior best fits.

For example, if the behavior is attached to the button itself, it will clearly get the event that the button generates. However, if the button does not handle the event, it will pass the event up the event chain; for views this means that the superview will receive the event. This passing along continues through each respective superview until someone handles the event, the TWindow used to draw the dialog will get the event eventually, provided no-one else has handled it.

In the example above, there are two ways of designing the interface. If the TNumberText used to hold the rotation amount is just a generic TNumberText, then it would make sense to have the behavior attached to the dialog. This would allow the dialog access to a child view to retrieve the rotation amount. (If the behavior were attached to the button, it would have to access a sibling view to retrieve the rotation amount; there is nothing actually wrong with this but it forces the dialog to have additional information about its environment, which will limit its overall reusability).

However, if the TNumberText holding the rotation amount where overridden to set a value in the application (fRotationAmount, e.g.) when stopping editing, then the behavior could be attached to the button. In this case, the button would be set to want to become the target of the view. When the user clicks this button, the TNumberText would resign its target, which would cause it to stop editing, which in turn would cause it to update the application value. The button would then be free to post a command using this value.

Finally, we can take this one step further, and change the default event number of the button from mButtonHit to some application defined event (mRotate, e.g. ). We could then attach a behavior to the application that looks for the mRotate event and creates the appropriate command. This would allow us the flexibility of generating the mRotate command in multiple places in our interface, and handling them all identically. (Remember that the dialog we are discussing is modeless; this would not work in a modal dialog as it requires the event number of the default button to be mDismiss).

Once you understand how they function, TDialogBehaviors provide a simple, generic means of handling a common user interface problem. By carefully using them in cooperation with other built-in mechanisms, powerful interfaces can be designed with a minimum of coding. They can be used with modeless as well as modal dialogs, giving you complete freedom in designing your interface.

 
AAPL
$118.93
Apple Inc.
-0.07
MSFT
$47.81
Microsoft Corpora
+0.06
GOOG
$541.83
Google Inc.
+1.46

MacTech Search:
Community Search:

Software Updates via MacUpdate

Adobe Photoshop Elements 13.0 - Consumer...
Adobe Photoshop Elements 12--the #1 selling consumer photo editing software--helps you edit pictures with powerful, easy-to-use options and share them via print, the web, Facebook, and more.Version... Read more
Skype 7.2.0.412 - Voice-over-internet ph...
Skype allows you to talk to friends, family and co-workers across the Internet without the inconvenience of long distance telephone charges. Using peer-to-peer data transmission technology, Skype... Read more
HoudahSpot 3.9.6 - Advanced file search...
HoudahSpot is a powerful file search tool built upon MacOS X Spotlight. Spotlight unleashed Create detailed queries to locate the exact file you need Narrow down searches. Zero in on files Save... Read more
RapidWeaver 6.0.3 - Create template-base...
RapidWeaver is a next-generation Web design application to help you easily create professional-looking Web sites in minutes. No knowledge of complex code is required, RapidWeaver will take care of... Read more
iPhoto Library Manager 4.1.10 - Manage m...
iPhoto Library Manager lets you organize your photos into multiple iPhoto libraries. Separate your high school and college photos from your latest summer vacation pictures. Or keep some photo... Read more
iExplorer 3.5.1.9 - View and transfer al...
iExplorer is an iPhone browser for Mac lets you view the files on your iOS device. By using a drag and drop interface, you can quickly copy files and folders between your Mac and your iPhone or... Read more
MacUpdate Desktop 6.0.3 - Discover and i...
MacUpdate Desktop 6 brings seamless 1-click installs and version updates to your Mac. With a free MacUpdate account and MacUpdate Desktop 6, Mac users can now install almost any Mac app on macupdate.... Read more
SteerMouse 4.2.2 - Powerful third-party...
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
iMazing 1.1 - Complete iOS device manage...
iMazing (was DiskAid) is the ultimate iOS device manager with capabilities far beyond what iTunes offers. With iMazing and your iOS device (iPhone, iPad, or iPod), you can: Copy music to and from... Read more
PopChar X 7.0 - 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

Mystery Case Files: Dire Grove, Sacred G...
Mystery Case Files: Dire Grove, Sacred Grove HD Review By Jennifer Allen on November 28th, 2014 Our Rating: iPad Only App - Designed for the iPad A decent new installment for the popular Mystery Case Files series.   | Read more »
Castaway Paradise – Tips, Tricks, and St...
Ahoy there, castaways: Were you curious about our own thoughts regarding this pristine shipwreck? Check out our Castaway Paradise review! Castaway Paradise is out for iOS, finally giving mobile gamers the opportunity to enjoy the idyllic lifestyle... | Read more »
Castaway Paradise VIP Subs are on Sale f...
Castaway Paradise VIP Subs are on Sale for a Limited Time, and a Special Holiday Update is Coming Soon Posted by Rob Rich on November 28th, 2014 [ | Read more »
Primitive Review
Primitive Review By Jordan Minor on November 28th, 2014 Our Rating: :: FOLK ARTUniversal App - Designed for iPhone and iPad True to its name, Primitive is about as straightforward as runners get.   | Read more »
7 tips to get ahead of the competition i...
7 tips to get ahead of the competition in Dynasty of Dungeons Posted by Simon Reed on November 28th, 2014 [ permalink ] Playcrab has launched their action-packed new dungeon crawler, Dynasty of Dungeons, today. | Read more »
Master of Tea Kung Fu Review
Master of Tea Kung Fu Review By Jordan Minor on November 28th, 2014 Our Rating: :: ONE DROP RULESUniversal App - Designed for iPhone and iPad Master of Tea Kung Fu is a creative and complex caffeinated brawler.   | Read more »
Monster Strike Review
Monster Strike Review By Campbell Bird on November 28th, 2014 Our Rating: :: BILLIARD STRATEGYUniversal App - Designed for iPhone and iPad Collect monsters and battle by flinging them across the battlefield in this strangely... | Read more »
Proun+ Review
Proun+ Review By Jennifer Allen on November 28th, 2014 Our Rating: :: TWITCHY RACINGUniversal App - Designed for iPhone and iPad Twitchy racing aplenty in Proun+, an enjoyably tricky title.   | Read more »
Lucha Amigos (Games)
Lucha Amigos 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: Forget Ninja Turtles, and meet Wrestlers Turtles! Crazier, Spicier and…Bouncier! Sling carapaces of 7 Luchadores to knock all... | Read more »
Record of Agarest War Zero (Games)
Record of Agarest War Zero 1.0 Device: iOS Universal Category: Games Price: $7.99, Version: 1.0 (iTunes) Description: HyperDevbox Holiday Turkey Black Friday Special Pricing! To celebrate the opening of the holiday season HyperDevbox... | Read more »

Price Scanner via MacPrices.net

Up To 75% Off Infovole Text Apps Over Black F...
Infovole’s entire range of apps, including the Textkraft family of word processors for iPads and iPhones, is being offered at 50-75% off over the Black Friday and Cyber Monday weekend. The five-day... Read more
Black Friday: Up to $60 off Mac minis, NY tax...
 B&H Photo has new 2014 Mac minis on sale for up to $60 off MSRP as part of their Black Friday sale. Shipping is free, and B&H charges NY sales tax only: - 1.4GHz Mac mini: $449.99 $50 off... Read more
Black Friday: 27-inch 5K iMac for $2299, save...
 B&H Photo continues to offer Black Friday sale prices on the 27″ 3.5GHz 5K iMac, in stock today and on sale for $2299 including free shipping plus NY sales tax only. Their price is $200 off MSRP... Read more
Karalux Announces 24K Gold-Plated iPhone 6
Karalux, a Vietnam-based jewellery firm, has launched a unique 24 karat gold-plated iPhone 6 version with gold-cast monolithic dragon on its back panel. The real 24 karat gold plated enclosure doesn’... Read more
Black Friday: 13-inch 2.6GHz Retina MacBook P...
 B&H Photo has lowered their price for the 13″ 2.6GHz/128GB Retina MacBook Pro to $1159 for Black Friday. That’s $140 off MSRP, and it’s the lowest price for this model (except for Apple’s $1099... Read more
View all the Black Friday sales on our Mac Pr...
We’ve updated our Mac Price Trackers with the latest information on prices, bundles, and availability on systems from Apple’s authorized internet/catalog resellers. View Black Friday sale prices at a... Read more
Black Friday: 11-inch MacBook Air for $779, s...
 Best Buy has lowered their price for the 2014 11″ 1.4GHz/128GB MacBook Air to $779.99 for Black Friday. That’s $120 off MSRP. Choose free shipping or free local store pickup (if available). Sale... Read more
Apple Store Black Friday sale for 2014: $100...
BLACK FRIDAY The Apple Store has posted their Black Friday deals for 2014. Receive a $100 PRODUCT(RED) branded iTunes gift card with the purchase of select Macs, $50 with iPads, and $25 with iPods,... Read more
Black Friday: 15% off iTunes Gift Cards
Staples is offering 15% off $50 and $100 iTunes Gift Cards on their online store as part of their Black Friday sale. Click here for more information. Shipping is free. Best Buy is offering $100... Read more
BEVL Releases Dock Tailored for iPhone 6 and...
Seattle based BEVL has released their first product: an iPhone dock that is divergent in build quality, rock-solid function and visual simplicity to complement the iPhone. BEVL is now accepting... Read more

Jobs Board

*Apple* Solutions Consultant (ASC) - Apple (...
**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
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* 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
*Apple* Solutions Consultant (ASC) - Apple (...
**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
*Apple* Solutions Consultant (ASC) - Apple (...
**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
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.