WWDC2000 Session 143
Transcript
Kind: captions
Language: en
ladies and gentlemen please welcome
carbon technology manager David Wright
thank you welcome to session 143 high
level toolbox carbon enhancement one so
carbon Mac os10 the theme of this week
we cannot wait to get your applications
onto Mac os10 they've already been a
number of sessions this week letting you
know about some of the in my session i
called them closed roads and detours
there'll be a few more in this session
but we're also adding a lot of
functionality to carbon to make your
development lies you here again there
Rob already been sessions about that
this week carbon events being one of
them and so I was thinking about the
title of the high-level toolbox what
does that mean high level and I think
that another cool theme of this week is
that the high level toolbox is beginning
to do more and more on behalf of your
application thus making it even higher
so anyway to talk more about that I'd
like to introduce Pete gontier from the
high level toolbox team please welcome
Pete so you've been hearing a lot about
aqua this week and it's certainly the
case that the high level toolbox it is
enhancing growing and being enhanced in
order to make your job easier in
implementing aqua but it's also growing
enhancing just because it needs to grow
and enhance in order to stay a living
thing so we've added lots of features
some of which have to do with aqua some
of which don't and that's what we'll be
talking about in this session I want to
approach this topic from a couple of
different directions the first one we're
calling architectural changes and the
architectural changes have the view with
stuff that you pretty much need to do in
order to adopt carbon in order to
carbonize your application and those
things include such things as the fact
that window layering is now enforced
it's no longer optional you can't you
can't choose use it or not you pretty
much got to live with it route controls
are always created for any window that
has controls many rest is now opaque
which shouldn't be any surprise to
anybody who's been hearing about carbon
all this time we've been creating the
more opacity in the toolbox but with
respect to many refs it's met it's it's
a matter of some interesting semantic
changes that have more to do with or
have less to do with accessors and more
to do with your application code and the
scrap manager needed to change for
carbon and particularly for mac OS 10
which means that carbon lib also had to
change so we'll be talking a little bit
about that the second category of things
I want to talk about are the cool new
features we've been adding that you
aren't obligated to adopt but once you
learn about them you'll realize you want
to adopt them the first big category or
the first big subcategory there is the
menu manager we've been adding a lot of
stuff in recent versions of the OS to
control manager and window manager and
many managers sort and sort of been a
little bit neglected we've added a few
features here and there but in carbon
menu manager is really catching up in
terms of feature list we've also added a
whole new manager called help tag
manager and this is basically the
replacement for balloon help and we'll
be talking a little bit about that we've
added some new control creation ap is
there more intuitive they make more
sense you don't have to worry about
overridden parameters and there are some
whole new standard controls that we've
added mostly to support aqua but partly
to support you so
said something about window layering
earlier window lang of course is done
according to class the way it always has
been so when you create Windows you need
to be very conscious of the class that
you're creating because that will
basically imply the layer the window
will fall into in addition to that we've
also changed some existing window
manager api's so that they operate
within the layer of the window that you
pass to those API so when you call
select window or send behind you'll find
that the window is only changed
according to only change within its own
layer so if you have a document window
and you pass it to select window it's
not going to jump in front of your
floating palette windows it's just going
to come become the frontmost document
window the other API that's changing is
front window front well excuse me the
API that's not changing his front window
and you have to watch out for that
because when you call a front window you
will get the front window even if it's a
floating palette irrespective of layer
so if you need to be aware of the front
window the layer you need to actually
use the specific call get front window
of class instead of front window in Mac
OS 10 because we need to plan for future
enhancements we want to do to the
control manager we pretty much need to
require that your windows which have any
controls have root controls and
basically what happens is when you
create your first control we check to
see if there's already a route control
in that window and if there isn't then
we create one for you now but I said
just now that is this is a Mac os10
feature this might cause you trouble if
you're thinking oh no now I have to
write conditional code to figure out mi
on Mac os10 is there a route control
well the simple solution is during part
of your carpet as a part of your
carbonization process just add a call to
create route control and always create a
route control for all of your windows
that have controlled
it's a simple thing to do and it will
simplify your life in the long run
you'll always have a route control on
nine and on ten the one part of this is
not automatic is the route control
pretty much sticks around once it's been
created even if created automatically it
doesn't go away just because you deleted
all the child controls now this new
mandatory route control has some
implications for the dialogue manager
what you want the basically the moral
equivalent of creating a route control
and a dialogue is setting the youth
control hierarchy bit in your dialogue
resource and your dl GX resource I
should say but that bit really controls
two things one it ensures that you have
a control hierarchy in your dialogue but
the other thing is that it makes all of
your items into controls and once
they've become controlled you need to be
careful about how you access your
dialogue items and specifically you need
to be careful with set dialogue item
text because it expect it expect to
control now and that's done that's done
because of compatibility set dialogue
item text needs to search all of the
dialogue item lists and all the
dialogues in your application because
the API is not defined so as to allow us
to do anything else so it needs to find
that control handle in the dialogue item
in the dialogue that you care about and
the only way it can do that is by taking
a control hand control wrap now the
really clean thing for you to do is not
do this tricky typecasting thing to make
set dialogue item text like excuse me to
make set dialogue item text work the the
cleaner thing to do is to just use set
control data and pass it the tags for
the text of the item and the last sort
of implication for dialogues and the
mandatory route control is you basically
want to set this bit not only to make
your life easier but also because it's
the only way you can get
with savvy text in your edit text item
so I mentioned menu reps are now opaque
which should be no surprise but it's not
just a matter of of calling some new
access or function instead of directing
directly accessing the menu records we
would get menu used to work is that it
used to hand you back a resource handle
that came from a mini resource and it
would post process the resource hand a
little bit but pretty much it was a
resource handle and if you call get menu
over and over and over again you get the
same handle over and over and over again
that's no longer true get menu now
return to you a menu refs which is based
on the menu resource so it's not as if
you have to throw out your many
resources but that is a basically a
unique copy of that resource use it as a
template so not only can you not assume
that you've got a resource handle and
you'll get the same one every time but
you should also instead of calling
release resource which some
documentation tells you to do not many
people do it but that's what that's what
the recommendation used to be now we're
telling you go ahead and go call
disclose menu forget about release
resource because the menu is not a
resource so of course there are some
access or functions as a result of menu
ref opacity one of them is called
duplicate menu and it replaces the
ability you used to have to use the
memory manager say you might call hand
to hand to duplicate a menu well you
can't do that anymore because many refs
aren't handles anymore and then of
course copy menu items provides you with
the functionality you need to reach into
a menu and pull out specific items and
copy them into some other menu and of
course you used to be able to do that by
simple pointer arithmetic or actually it
was complicated pointer arithmetic in
any case we've given you an API now so
that you can reach in and do that same
stuff
the scrap manager is I hesitate to say
it's a new API pretty much what is an
old API with a lot of new names and a
few changes pretty much you still get
things from the scratch you still put
things on the scrap you still zero the
scrap or as we say in the new term law
terminology you clear the scrap but
basically we had to make some changes to
the scrap manager in in order to support
the way events work on Mac OS 10 on 9
your app would get a suspender vent and
if you were maintaining a private scrap
that the scrap manager didn't know about
yet you would take the suspend event as
your clue that it was time to export
your private scrap to the public scrap
on 10 suspend event work significantly
differently went by the time you've
received a suspended nth it's very
likely that your application has already
been pushed towards the background
because of pre-emptive multitasking and
so if you at that point try to export
your scrap it won't work because
background applications can't put things
on the scrap while we were in there
making these architectural changes to
the scrap manager we decided it was a
good time to add some features as well
so we added flavor flag and flavors legs
are pretty much like the drag manager
let me step back from on I didn't
explain the whole promise thing so to
replace the suspend event from a process
we added a promise feature which is much
like the drag manager you basically
supply a callback you associate it with
a scrap and when some other application
requests the data that you promise you
get called back and you provide the data
on the fly now when you make these
promises is pretty critical you want to
make these promises when the user
performs a copy operation are cut
operations you don't have to supply any
data up front but you do have to say I
have data of a certain type
and you may optionally if you know
supply the size of the data as well but
that's optional and the reason you want
to do this at this time is that there's
really no better time to do it because
otherwise you'll just be sitting in your
event loop waiting for an event come in
and by the time you receive your suspend
event it's too late so you really do
need to do the promising when the user
issues a command so now let's go back to
flavor flag flavor flags are also like
work very similarly to the flavor flags
and drag manager you can specify a
sender only flavor you can spend you can
test for whether a flavor that you are
pulling in from the scrap has been
translated and a previous session we
talked about translation manager and
that's what that bit is intended to be
used for we also added some api's for
introspection you used to be able to
look in low memory grab the scrap handle
out of low memory and then walk around
inside the scrap handle in order to
determine what flavors were on the scrap
how big they were and maybe even peek at
their data now you need to use some
clean API that basically tell you all
the same things in a way that we can
support into the future so I said that
many manager was catching up and the
menu manager is catching up so much that
we cannot cover all of the things that
have been added to the menu manager in
this session is you see there's a long
list there and we'll cover most of those
things but the last item is almost the
most important one because there are
probably six or seven important things
that we just don't have time to cover
and you can learn more by looking in the
headers and experimenting with the new
AP is and then maybe sending us feedback
to get the documentation finished sooner
but that's that's really important part
but I wish I could cover but just don't
have time for so before I go into too
much detail about the menu manager I
want to bring out guy Fullerton
shows a demo of some of these new
capabilities guy so it looks like all my
dark little sessions are coming out of
the conference we feel the water sure ok
so if Pete mentioned we've got an awful
lot of new features in the menu manager
I'm only going to touch on a few of them
but they're kind of the cooler ones
we've got a simple little application
here I showed this off in the Aqua
overview demo takes advantage of a few
of the new menu manager features first
one I want to touch on is the inclusion
of this font menu this font menu is
actually implemented by the system your
application can have any given menu and
it can call an API to tell the system
please put all the standard font
commands in its menu for me we even
offer a mechanism it's actually an
option bit that people talk about that
lets us hang submenus off of each of the
fonts that has the different types of
fonts available so in this case oh I
don't know Lusa that has a bold in a
regular version and those are both
automatically hung off the menu and the
system will keep track of the submenu
management for you automatically we also
provide some api's that allow you to
take a given menu selection and ask them
any manager hey what kind of font was it
so you can take that font and run with
it the other cool thing I want to show
off is something that we've needed for a
long time now and it's probably gets
requested every year and that's the
inclusion of dynamic menu items so you
might see something like this in one of
today's applications where you have a
bunch of commands and the commands names
are basically the same they have
basically the same functionality as well
with slightly different behavior I have
a blend command this blend command is
going to pop up a dialog and ask for all
kinds of custom information but you
might want to do a fast blend with the
last set of information so you need too
many commands on there and a lot of your
applications were relying on your own
custom MDF to do something that we call
dynamic menus and dynamic menus is a
technology that takes a menu that looks
like this and turns it into a menu that
looks like that it's the same basic
commands
we only show one of each variant in the
menu at a time and as I change the
modifier keys I hold down we simply
change the menu command that's
appropriate and you can have different
commands you can put different menu menu
manager command IDs between each item
and so that you know you can find out
what these are selected on a command ID
basis so the next thing I want to do is
actually show you how I implemented that
it's actually really really
straightforward the first step is done
just in your menu resource or if you're
using interface builder you can do it
straight in the nib resource this is the
menu that did not have any dynamic menu
commands in it your dynamic menu
resource or nib looks basically the same
in a dynamic menu if you have one item
that has three variants there are really
three menu items behind that one item so
your menu resource simply has each of
those three items I'll take the
amplified case for instance each of the
items which is ultimately going to show
up is just one visible item let's have
the same base command key but you can
specify different modifiers so for
instance the amplify item itself just
has the command key amplify all a shift
command and amplify selection is option
command so you build up your menu you
save that off and then you need to do
one step in the code and actually so
very small application uses carbon
events as do most of the work and one of
my subroutines is a routine that just
build up my menu bar one thing I happen
to do in here that people talk about as
well is get the root menu this is a
really convenient way to be able to get
your menu bar treat it as a menu and
iterate through things in a quick easy
way so I get my root menu and the first
thing I do is I pull the six men you out
of it which happens to be my dynamic
menu this is a number of other ways I
could have done this but for speed I
just knew it was this menu and grabbed
it and then I happen to iterate over
each of the items in the menu and change
in attributes just turn on the dynamic
bit for that item and that's really all
it takes for the dynamic stuff to work
as soon as you run the menu manager just
just does the rest of the work
so calling this API is a little
inconvenient and we're going to look at
getting that integrated directly into
interface builder so that interface
builder will let you you know click a
checkbox and mark an individual menu
item as dynamic and it'll just do it all
and you won't have to do any work you
just filled your menu and run it and
it's all dynamic and so now I think it's
going to talk a little bit more about
these api's I've shown you any some some
more stuff as well great thanks a lot
guy so now we're going to talk about
some AP is as sort of a background and
we're going to build up towards the
exact API is a guy showed just now in
that demo the first one we're going to
talk about are the menu attribute AP is
an ax men you attribute or I should say
a set of many attributes is just a
32-bit quantity a bunch of flags that
control the behavior of an individual
menu right now we define two attributes
one of them is to exclude the mark
column animart column of course is that
column down the left left hand side of
the menu with the check mark or the
diamond or whatever else you need to put
whatever other symbol you need to put in
there to tell the user that a certain
mode is in effect or some item has been
selected as the current item and
basically the reason you would want to
exclude that column the best example we
have is the path popup menu that Windows
support now there's no reason to mark
any of those items and it's much nicer
if the width of the item is very close
to the width of the title in the window
so we turn off the mark column for that
menu and you may encounter situations
like that in your app as well the other
bit that you can set in the menu
attributes is the auto disabled bit and
this bit basically we hope replaces a
lot of code in your application in which
you
to determine whether all the items in
your menu are disabled and if they are
go ahead and disable the title well if
you set this bit on a menu the menu
manager will figure all that out for you
and disabled the title on the fly on an
as-needed basis so there are a couple of
api's for accessing these bit the first
one is pretty simple you pass it the
menu you care about and it gives you
back the attributes for that menu the
second one is a little more interesting
it's it it has an idiom that we're
probably going to use a lot of in the
future for the toolbox and basically
where you would expect one parameter
there are two and the first one is the
attributes you're supposed that the menu
manager is supposed to set and the
second one is the attributes that the
menu manager is supposed to clear and
this replaces the code in your
application where you would get the
attributes and then do some bitwise
operation on those attributes and then
set them back onto the menu and of
course that's not nearly an atomic
operation so since thread safety is the
sort of thing we try to consider when
we're designing new AP is for carbon
that's what that's what this sort of
dual parameter strategy is all about now
of course there are attributes for menu
items as well and these are the
attributes that guy was talking about
when he showed you how the dynamic menu
support is implemented in his app the
first menu item attribute is the
disabled attribute and of course this is
an attribute that's used by disabled
menu item and enable a menu item and
there's no sort of recommendation that
you use the attribute version of this
capability the old api's works fine it's
just that it's nice to have all of these
attributes in a single place the second
half degree to the dynamic attribute
which guy talked about you turn that on
and you get that dynamic menu support
the third is a hidden attribute
and what that does is it allows you to
hide and show individual menu items in a
menu without deleting them so they're
still there but the mini manager simply
chooses not to display them and we'll
get to how that can be useful in a very
specific example in a few slides and
then the last attribute is the separator
attribute and the separator attribute
compensates for the the fact that we
still have one metacharacter in menu
items and that is a leading hyphen and
the leading hyphen of course causes the
item to become a separator line instead
of a hunk of texts with this attribute
you can turn that off and have a leading
hyphen in your menu items and this would
be useful if you don't want to know what
kind of data you're putting into the
menu say it comes from a file system or
it comes from a list of resources or
some database or something and you don't
want to have to process does this thing
have a hyphen in it and do we need to do
a special hack in order to make it work
just you just put text in the item as
long as that separator is set and you
won't get excuse me as long as that
attributed that you won't get items
turning into separators unintentionally
now there are lots of other menu item
attributes I probably as many as a half
dozen more they're a little more obscure
but they're worth looking at if you have
some time take a look at them and see if
they apply to your application they're
all commented the api's are much like
the menu attribute api's and of course
you specify a menu item but otherwise
they're pretty much the same so now
let's talk about that dynamic menu item
attribute now guys explain a little bit
of this but basically you create the
same old resources or you use interface
builder to create your menu and ex many
resources and in your ex many resources
of course you specify all the modifier
keys that you care about and basically
what you do is you specify multiple
quote redundant I say items and your
resources they're not redundant because
obviously they have different model
but they sort of look redundant they
have the same base command character
associated with them and that's how the
many manager figures out which items to
merge and which items to leave alone and
then once you've got your menus
instantiated in your application when
you set the dynamic attribute bit on the
item that tells the menu manager okay
you should look to see if this item
should be merged with another one above
or below it and of course you saw the
only the current set of modifier keys is
displayed in the menu if it should also
point out the items that aren't
displayed are still in the menu so the
many manager knows to return you the
index of those items according to which
modifier keys are down so you don't have
to worry about well I should say the
menu manager tells you if you've got
three items in a sequence in their
dynamic menu items say their items four
five and six if the user hold down the
modifier keys associated with item five
menu manager tells you that the user
selected item five and you don't have to
worry about all the fact that that many
manager hides all those other ones for
you so we did some work with
hierarchical menus as well a while back
we added some marant excuse me some
functions to allow you to get away from
overloading the semantics of existing
api's like set item mark and set item
command you used to have to pass all
sorts of goofy stuff according to all
sorts of rules that nobody wanted to
remember and everybody had to look up
every time but in the related to release
of carbon we are also finally
eliminating pretty much I think the last
weird case of overloaded parameters and
that is insert menu and passing negative
one for the for the after ID you can now
basically create a menu decide which
item to make it a hierarchical menu of
and pass the menu handle the menu
manager and let the menu manager worry
about the rest you don't have to worry
about what Id the menu has you don't
have to worry about doing something
special you have a name that actually
does what if
as it does and the only time that you
really have to worry about the menu ID
is if you don't take advantage of the
API is on following slide we've also had
menu command IDs for a while we had sort
of a sparse set of api's but I think we
are pretty much rounding out the API set
for menu command IDs in carbon the first
interesting one is enable menu command
and what this does is if you associate a
32-bit command ID with an item you can
enable that item or disable it according
to its command ID without worrying about
where it is in the menu hierarchy so
basically this allows you to not be
concerned about searching or or having a
list of constants in your application
that relates command IDs to items or
anything like that and we've added a
couple of other api's that allow you to
sort of query your existing menu bar to
figure out where command IDs appear in
your item hierarchy and this is going to
be useful for situations like when you
have your font menu and you want to
associate the same command with all the
items in your font menu yet you still
need to look up the text of the item of
the menu that was selected because
that's the font name and you need that
to obtain a fond ID and use that
speaking of the font menu we've added
some call to create a standard font menu
and of course you saw the demo where you
have the option of creating sort of an
old style font menu with just font names
in it or you can create a menu with font
names and their variants hanging off the
side as a hierarchical menu and of
course you make that decision by
choosing whether to pass the K
hierarchical font menu option flag to
create standard font menu some of the
other interesting parameters to this
function are the first hierarchical menu
ID if you
care about where your font variant
hierarchical menu start in the ID list
this is where you can specify where they
should start and you would use this if
say for example you had you know menu
starting at 128 say and going to 150
you're pretty sure you're not going to
use 50 more menus in this application so
you could tell menu manager okay start
my font during IDs at 200 and I'm pretty
sure there aren't going to be any cool
any collisions let's see so yes and the
other API will allow you to instead of
getting the string out of the menu and
having to figure out what that
corresponds to just ask directly for the
font family and font style and font
manager terms instead of you having to
do that yourself so one of the other
standard font menus that we're
supporting in carbon is a standard apple
menu or on 10 you'd call it the
application menu you no longer need to
call a pen dress menu and pass drvr to
build an apple menu and you also
obviously no longer need to call open
desk accessory because that's not
supported so you better not need it
under carbon lip we build the apple menu
and we handle selections in it and
pretty much it just works you don't have
to worry about it you still need to
worry about your about item but other
than that everything just works under
mac OS can we still build the menu for
you but we add a couple items that you
need to respond to one of which are
probably already responding to basically
the quit application pretty much
everybody supports it if you don't
support it you really can't even shut
down the mac properly so you're
definitely already there you need to add
a new apple event handler to handle the
Preferences event that will send your
application when the user selects the
Preferences item from the menu this is
pretty easy because if you have a
preferences dialog all you have to do is
call the existing code that brings up
that dialogue and you've done
if you don't have a preference with
dialogue and it's perfectly reasonable
for you to patch the Preferences command
ID to some of those IPS excuse me to
some of these those API as I mentioned
earlier to either hide the menu of the
Preferences menu item or disable it as
necessary and of course if your
application is in a state where it can't
quit it's perfectly reasonable to
disable the clip menu item for a while
and that sort of seems counterintuitive
because we built the menu but that's
sort of also why we built that whole
command ID support into the enable and
disable mechanism because we knew that
you were going to run into that problem
so go ahead and do that so I'm about to
explain these api's and you're going to
be wondering at the end why did they add
those api's and then i'll tell you you
can now clone menus and cloning really
is just terminology for reference
counting so if you explicitly clone a
menu you increment its reference count
if you insert a menu into a menu bar
that implicitly increments that menus
reference count and if you delete a menu
from a menu bar that implicitly
decrement the reference count and of
course when you dispose the menu the
reference count hopefully if you've
stayed balanced all this time the
reference count goes to zero and the
menu goes away now why would you need
this well one youth is the enhancements
we've made to get menu bar yet menu bar
is still still returns the handle that
you expect that weird packed array of
strange stuff that's kind of documented
in inside mac one I think and you can
still walk around in that handle and
extract information out of it but at the
same time you want to use some new AP is
that we've added expose menu bar will do
the right thing with all the menus that
happen to be in that menu bar so that
once you've gotten the menu bar and all
of those many reps have their reference
counting committed and then you just
close the menu bar those men us will
have their reference counts
decrement duplicate menu bar of course
will increment all the reference counts
of the menu rest in that menu bar so
that you can keep everything balanced
the thing that you want to avoid is
passing a menu bar handle to dispose
handle because that obviously won't give
us a chance to do all of that reference
count maintenance and thing goes for
hand hand equally it's a similar problem
and that memory manager has no idea that
it needs to do anything with many refs
another way though to access the minibar
is get root menu and it returns to you
what I think of as sort of a virtual
menu RF the root menu behaves as if it's
a menu and you can pass it to all the
menu well yes you can pass it to pretty
much all the menu manager api's but the
most important ones are account menu
items which immediately tells you how
many items there are in the menu bar so
you don't have to declare your own data
type and do tricky things to get that
simple information and the other thing I
will do is it will allow you to get the
menus that are in the menu bar their
menu ref really easily simply by calling
a new API instead of again walking
around in that weird handle when you're
done with the root menu you can just
call dispose many dispose menu just like
you would with any other menu ref so
what we're hoping is that if you're in
your code looking at all that weird menu
bar code instead of changing it to use
dispose menu bar or duplicate menu bar
which is perfectly acceptable to do
we're hoping that you have the
alternative to simply rip that out use
get root menu and the other menu manager
api's and then make your maintenance
like simpler over time
so it's been 15 years 15 years and we
still didn't add away to set the menu
title and carbon we finally did it so
the help tag manager there's good news
and bad news about the help tag manager
the good news is it's the replacement
for balloon help the bad news is you
have to give up all of those alternate
names for balloon help you've made up to
express to the world what you think of
it so the the help tag manager is we
think a big improvement on balloon
health the first improvement is that
it's object oriented and what that means
is you can associate a health tagged
with a toolbox object like a control or
a window or a menu item the second big
improvement is the human interface
instead of having those big cartoony
balloons what you've got is small yellow
rectangles just like you've seen for I
don't know how many years what what's
great about ours is that it had that
that flick aqua translucence that you
see everywhere else the content is a
little different for health tags
basically what we're expecting help tags
to be used for is three or four words
afraid so suppose for example you've had
you had a button with an icon with a
label and the button was supposed to
send an email message the button might
say at the comic caption it might say
send because after all it's in the
context of an email message window and
so send is pretty clear if the user for
some reason needs to know what the send
button does and hovered over that button
waiting for the balloon help is to
appear the balloon help might have might
have said something like
open a tcp/ip connection to the SMTP
server and squirt and RFC 822 message
over the link that's not what we expect
in a health tag what we expect them help
tag is something like send the current
message now we've added facilities for
you to leverage your existing balloon
help content because we know that's
important but we think that as you as
you experiment with that you'll find
that the content really doesn't fit the
help tag idiom it's sort of a stopgap
measure you can get your health system
back up and running with help tag but
the more you use it we think the more
you'll be motivated to rev your content
over time so here are some of the api's
that you use to specify help tag content
I'll just talk about the first one you
pass it a control rest and you pass it
this mu data structure called hm health
content wreck and basically it can help
content wreck is an expanded Atta
structure that specifies an expanding
number of data types for your content
and by expanding what I mean is we hope
to add lots of data types that help tag
support over time right now the one that
absolutely works flawlessly and the one
with it we fully intend to keep forever
is stir 255 this standard Pascal string
that you used to in the header you may
find other types but we recommend that
you stick with stir 255 for now because
that's the one that's going to stay
around some of the other interesting
fields in the HM help content wreck are
the tag display side and that of course
is less right bottom top so you can
specify where you expect the tag to
appear relative to the object you
specified and then the other interesting
field is the AHA track field now I said
earlier that this API is object oriented
in the sense that it talks to toolbox
objects and why would you need a hot
rack it could just ask the toolbox
object
well the relevant example is a window if
you attach a help tag to a window you
may have multiple hot wreck areas within
that window and we'll see why that's
relevant in a few seconds well actually
we'll see how you can customize that in
a few seconds it may not it may be
relevant even if you don't customized
for example if you're you've got a
window up and you're not using control
manager for some reason i mean i'm in
love with control manager and I can't
see why anyone would avoid it but some
people need to so if you're in that
situation that's where the hot rekt
comes in so I mentioned customization
these api so our api's you can use to
customize your health tag basically you
use the you use these api's to sort of
do lazy content to provide lazy content
you can do two main things you can you
can decide oh I don't want to use string
a I want to use string B and that may
have to do with what state the windows
in or what state the controls in or
something along those lines the other
thing you can do is specify the hot rack
on the fly so that so for example if
you've got the scenario i mentioned with
the window with multiple possible hot
rex if things are moving around you may
still wanted you want you still want to
inform the help tag manager when to take
down the help tag and so if you're in
that situation you need to turn to these
customization api's
so I mentioned balloons help
compatibility and these are the AP is
that you would use to specify your
existing balloon health resources as
help tag content resources and it does
preserve your investment and content but
it's really up to you to evaluate
whether you want to keep that content
for your help tag implementation or not
it's really sort of the honor system and
we hope you do the right thing I also
mentioned some new control functions
that we've added we're going to be
talking a lot more about controls in the
second session for carbon toolbox
enhancements tomorrow tomorrow at 98 99
am I believe that's in a1 a2 well we'll
find out later in the roadmap but
basically we wanted to cover a couple of
things in this session it used to be
when you wanted to create a pop-up menu
you would have to basically crack open
the documentation and read a short
paragraph on just about every parameter
to figure out what it really meant it
wasn't really the control wasn't really
the ref con it was really something else
so what we've done is for each control
or each standard control i should say
we've added individual creation function
so that you can pretty much look at the
prototype figure out the data you need
to provide and provide it instead of
spending a half an hour every time you
need to create a pop-up button the other
change we've made is we've made these
control creation functions return OS
status it used to be you'd call new
control you get back an ill control
wrath and then it would just be a big
mystery as to why it failed now that we
return OS status you can at least maybe
figure out okay I need to do this other
thing instead or maybe tell the user
what went wrong or something like that
it's no longer just this big mystery
I mentioned that we're going to have
some new standard controls in Mac OS 10
and and in fact in carbon in general the
first example is there was a session
this morning I hope you saw on the data
browser control it's a really wizzy new
hierarchical list control has excellent
user experience it supports all sorts of
features basically for free you get drag
and drop support get the little disclose
disclosure triangle support you get the
column headers and the and the movable
column from the whole nine yards
basically we're making finder level
functionality available to your
application with respect to list
management some of the other controls
are pretty cool in their own right but
gotta admit the data browser is great
the relevant indicator is a new control
that's basically the result of the fact
that the progress indicator is very
different in aqua and it no longer works
as a relevant control so we've created a
new control and for example this is used
by Sherlock to RZA to display search
results to tell you how relevant each
hit is to your search the round button
is basically intended as a navigational
aid we expect you to use it for things
like back and forward and home the
disclosure button is something that
you'll see in navigation services it's
basically for expanding and contracting
dialog windows so if you have expert
users who need access to more settings
than your your sort of main customer
base and you don't want to burden your
main customer base with too many
controls the disclosure button is a way
to give your expert users the
opportunity to need to twiddle the
settings that they want to twiddle
without distracting sort of your your
main line customers and then of course
in aqua we really really really want you
to use the standard prog
s Bar and the one barrier left to that
really was we didn't have a vertical
variant for it we really want you to get
away from drawing progress bars with
quick draw it's never going to look good
under aqua so if you've got a vertical
progress bar now now's the time so we've
talked about things you have to do we
talked about things that you're going to
want to do the things you have to do are
you have to watch out for mandatory
window layers and mandatory route
controls and the window layering is a
shouldn't be too onerous but it is a
little bit of work and as long as you
understand it I think you'll be okay the
route control stuff is even easier to
deal with because all you really need to
know is be aware of it for debugging and
for the most part you shouldn't have to
make too many changes because your code
will create controls and they'll go into
the they'll become child controls of the
route control and everything will pretty
much work the same watch out for get
menu returning copies don't assume that
it always returns the same handle over
and over again and check out the scrap
manager if you have some private scrap
code where you export your private scrap
during a suspender vent look out for
that stuff look forward to is all the
new menu manager api's
they are they basically enable you to
eliminate code support aqua without too
much effort and we'll keep working on
them as well but we're pretty happy with
them help tags is something that is
basically really the health system of
the future it's basically the way
balloon help should have worked in the
first place and we think you won't check
that out as well and of course there are
some control manager improvements that
you'll want to keep in mind and again if
you're interested in control manager the
carbon toolbox enhancement session to
tomorrow morning at nine is the place to
be so with that I'd like to bring out
Dave right again and he'll wrap things
up for us thanks Pete so just to take a
look at a where to take feedback about
this for carbon api's and ways that the
toolbox could better help you with your
programming efforts please feel free to
contact me at David Wright at up at
David Wright at apple com and for user
interface type issues please contact our
user experience technology manner
manager John Gill NZ at gallente at
apple com and for the roadmap as you can
see these carbon enhancement sessions
are very useful these are issues that
are going to affect you as your
carbonizing your applications so don't
miss tomorrow's a second session about
this stuff it's in a two at nine o'clock
I don't know about you but engineering
it at 9am is really early but it's
really important so be sure to be there
also be sure to go to navigation
services since that's the only standard
way to open and save files in a carbon
application now and for feedback again
that you'd be sending to John during
this conference please be sure to attend
the Aqua feedback forum because that's
where a user interface type feedback
should go during this conference and
again for programmatic type stuff waste
the toolbox can help you get your carbon
application going faster and better and
concerns that you have please attend the
feedback forum for the high level
toolbox so this time I'd like to invite
the panelists to come up for QA and will
move in