| 
  Q: Why isn't my edit text box in my Navigation dialog's custom area working on 10.3?  A: Navigation Services dialogs are now compositing on Mac OS X 10.3. The NavCustomControl / kNavCtlAddControl call now adds (or moves) the control or HIView in the dialog's control list. Previously, the control had to be in the control list already. Due to a bug, which will be fixed, this NavCustomControl call mishandles the Edit Text control if it was already in the control list. The symptoms are an empty box (even if a string was provided at creation) which doesn't accept typed characters even when the edit box has the focus. There is a simple workaround to this bug which is given below. Thus, the code which was correct previously: 
 
 | Listing 1. Previous Code. |  | 
CreateEditUnicodeTextControl(callBackParms->window, &bounds,
                    CFSTR("Some Text"), false, NULL, &editText);
NavCustomControl(callBackParms->context, kNavCtlAddControl, editText);
 | 
 
 
  should be changed, for Mac OS X 10.3, into: 
 
 | Listing 2. New Code. |  | 
CreateEditUnicodeTextControl(NULL, &bounds,
                    CFSTR("Some Text"), false, NULL, &editText);
NavCustomControl(callBackParms->context, kNavCtlAddControl, editText);
 | 
 
 
  You may add a check for the version this way: 
 
 | Listing 3. Checking HIToolbox version. |  | 
WindowRef inWindow;
if (GetHIToolboxVersion() < 0x130)
   inWindow = callBackParms->window;
else
   inWindow = NULL;
CreateEditUnicodeTextControl(inWindow, &bounds,
                    CFSTR("Some Text"), false, NULL, &editText);
 | 
 
 
  And you can use the following code to retrieve the HIToolbox version: 
 
 | Listing 4. Retrieving HIToolbox version. |  | 
UInt32 GetHIToolboxVersion()
   {
   CFBundleRef bundle;
   CFStringRef versStr = NULL;
   static UInt32 version = 0;
   // let's do the heavy following code only once...
   if (version != 0) return version;
   bundle = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.HIToolbox"));
   if ( bundle != NULL )
      versStr = (CFStringRef)CFBundleGetValueForInfoDictionaryKey(bundle,
                    CFSTR("CFBundleShortVersionString"));
      if (  versStr != NULL &&
            CFGetTypeID(versStr) == CFStringGetTypeID())
         {
         int major = 0, minor = 0, bugfix = 0;
         char sz[20];
         CFStringGetCString(versStr, sz, sizeof(sz), kCFStringEncodingUTF8);
         sscanf(sz, "%d.%d.%d", &major, &minor, &bugfix);
         version = ( major << 8 ) + ( minor << 4 ) + bugfix;
         }
   return version;
   }
 | 
 
 
  After the bug is fixed, once again enabling the use of callBackParms->window as first parameter of the CreateEditUnicodeTextControl call, the workaround of passing NULL as first parameter will also still work as expected on Mac OS X 10.3 and later. 
 [Oct 28, 2003] |