home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 5
/
DATAFILE_PDCD5.iso
/
utilities
/
d
/
discbase
/
!DiskBase
/
FntMenuDoc
< prev
next >
Wrap
Text File
|
1991-03-20
|
17KB
|
354 lines
Documentation for the FontMenu module v.1.16
© J.RÖling 1990
WARNING
The SWI I use is NOT official allocated by ACORN. I did try to get one, but
they refused. Why, I don't know. Probably because I have no ISV status, and
I did the work on FontMenu not on behalf of one company in particular. I did
discover though that there are a lot of people interrested, and I undestand
that some of them are actually implementing it in their code. So if anyone
at ACORN is reading this, please reconsider my request.
----------------------------------------------------------------------------
Introduction
As more and more outlined fonts for the Archimedes are becoming available,
a problem arrises for applications accessing these fonts. The number of
fonts is not known in advance, so to create a font menu the application has
to figure out the number of fonts, claim enough space to hold a font menu,
and create it. This can be done in the dull single level (straight foreward)
way. This saves some space, and code complexety, but it is not prefered, as
the user will be presented by a sometimes very long menu containing items
with the same prefix, e.g.
Trinity
Trinity.Bold
Trinity.Bold.Italic
Trinity.Medium
Trinity.Medium.Italic
etc.
The more fonts become available, the longer this menu becomes, the more
irritating it is.
Many applications now are even uncapable of creating menus longer then a
certain amount. Examples of these are !Edit (48 entries), !Draw (64
entries), and even !Impression reacts sick.
When running more then one application with a font menu, there is arises
another disadvantage of this method. Several applications using a identical
menu structure but not sharing the resource, is not the policy of Acorn on
other subjects.
So here is a neat solution for everyone who wants a proper font menu,
without the hassel to create one, and without claiming extra space.
What does FontMenu do ?
The FontMenu module is able of creating a multi-level font menu, and lets
every application share the joy. It contains several SWI's to create, and
access this resource. If no application is using the structure anymore
(because they were all quited for example) the memory for the menu structure
will be realesed by FontMenu, so no unnecessary memory is in use. It has no
problems if more than one font directory is in use. The menu is sorted
alphabeticly (even when more than one font directoris are used), so the user
is able to find the required font at an instance. It requires a minimum of
disc access when a new menu is created. New menus are only created if one is
required, and there isn't already a valid one. When a font menu exsists, and
the user has selected a new font directory, the font menu will be rebuild as
soon as the application accesses this font menu.
FontMenu creates an multi-leveled font menu. In the example above this is a
menu where 'Trinity' occurs only once, but it will have a submenu containing
two items: 'Bold' and 'Medium'. Because there are two types of
'Trinity.Bold' ('Trinity.Bold' and 'Triniy.Bold.Italic') 'Bold' will have
another submenu. In this submenu the first item will be 'Plain'. This name
is made up, but it is more clear then a empty meny entry. The second entry
will of course be 'Italic'.
How does FontMenu work ?
To use FontMenu it is necessary to understand how the Wimp works, and how
to create a application on the Archimedes environment. It is assumed that
the reader understands the above for the rest of this document.
When a application wants to access the FontMenu menu structure, it has to
call SWI "FontMenu_Create" before any other FontMenu SWI's are called. This
will assure that a proper font menu structure will be available. This can be
done on initialisation of the application, but is not absolutly necessary.
When exiting the application, SWI "FontMenu_Release" has to be called, so if
this was the only application using the font menu, FontMenu can release the
memory for it. Every time SWI "FontMenu_Create" is called, a counter is
incremented, and if it was zero (this is the initial value), it will create
a new font menu. When calling SWI "FontMenu_Release", the counter is
decremented, and if it reached zero FontMenu will release the menu memory,
as no application is using the menu structure anymore.
From here on there are two ways of programming when using FontMenu. The
first is the simple one, the second a little bit more complicated, as it
involves the use the Wimp message system.
The easy way
------------
Whenever the user opens the menu structure of the application by pressing
the MENU button, a call has to be made to FontMenu_Select with R0 pointing
to a point sepearted (zero terminated) font string, and in R1 the value 0 or
1 to tell FontMenu if it allows the user to select the SystemFont. The call
will return with a pointer to the font menu structure in R1. Now it is up to
the programmer what to do with this pointer. When passed in R1 when calling
Wimp_CreateMenu, the menu tree will consist entirely of FontMenu structures.
If the font menu should be a submenu of the applications own menu structure,
the pointer should be put in the submenu-word of the parent menu entry, and
Wimp_CreateMenu should be called with a pointer to the applications own menu
structure.
When a menu selection was done, the application should determine by the
returned 'menu tree so far' values if the user selected a entry in the font
menu. If so, it should set an internal flag (say 'FontMenuSelected') to
TRUE, else it should set it to FALSE, so later on it is still known if the
user may have selected a new font. After that it should call SWI
"FontMenu_DecodeFontMenu" with R0 pointing to the first menu selection in
the 'menu tree so far' block wich determines the selected font. R1 should
point to a buffer to contain the answer. This buffer must be at least 48
bytes. If on return of this call R0 > 0, the user selected a new font. The
buffer passed in R1 will contain the font name (a point seperated, zero
terminated font string).
After a menu selction, and taking appropriate actions, the application
should check the mouse button state to see if it has to call SWI
"Wimp_CreateMenu" again. If adjust was used to make the selection, it has to
check the 'FontMenuSelected' flag to determine if the user selected a font
menu entry. If so, it should call FontMenu_Select as discribed above. This
should be done with R0 pointing to the string FontMenu_DecodeFontMenu
returned. The menu pointer returned by FontMenu_Select has to be put in the
'sub-menu pointer' word of the 'Fonts' entry. Now the call to
Wimp_CreateMenu can be done. In this way it is possible for the user to
click with adjust in the font menu, and keeping the menu on screen after the
selection.
There is one little drawback of this method. If the user selected a new
!Fonts directory, it will be noted be the FontMenu_Select code, and a new
font menu structure will be generated. This is always the case, also with
the method discribed below. But it could be possible that the user was going
to do something else in the menu, not selecting a font at all. He could for
instance want to quit. Now he (she) has to wait for the FontMenu module to
create the new menu structure, before he (she) is able to access the 'Quit'
entry. So the next solution is to wait with calling FontMenu_Select, until
the user wants to select a new font. This can only be done by making use of
the Wimp message system. The difficult thing of this method (as discribed
later) is that the Wimp is unable to re-open the menu structure entirely
after a menu selection using the ADJUST button. So a little trick has to
solve this p