@DataBase "FC_Area"
@Author Olivier Laviale : Lotan <lotan9@aol.com> © 2002
@SmartWrap

@Node Main "Feelin : FC_Area"
@{lindent 2}@{PAR}
@{b}@{u}FC_Area@{ub}@{uu}@{PAR}@{lindent 4}

This class is a super class for every @{b}Feelin@{ub} gadgets. It holds informations
about an object current position, size and weight and manages fonts, colors,
frames (and frame title) and background (using @{"FC_FrameDisplay" link FC_FrameDisplay.guide/Main}).@{PAR}

Additionnally, @{b}FC_Area@{ub} handles the user input. By setting an object
@{fg shine}FA_InputMode@{fg text}, you can make it behave like a button or like a toggle gadget.
That's why @{b}Feelin@{ub} doesn't offer an extra button class. A button is simply a
text object with a raised frame and a FV_InputMode_Release input mode. Since especially
@{"FC_Group" link FC_Group.guide/Main} is a subclass of @{b}FC_Area@{ub}, you can create rather complex
buttons consisting of many other display elements.@{PAR}@{lindent 2}

@{b}Notes@{ub}@{PAR}@{lindent 4}

A FrameDisplay object is used to manage frames and backgrounds, every
attributes are passed to this FrameDisplay object on creation time. You should
have a look at the documentation of @{"FC_FrameDisplay" link FC_FrameDisplay/Main}.@{PAR}@{lindent 2}

@{b}Methods@{ub}@{PAR}@{lindent 4}

@{" FM_Setup            " link FM_Setup}
@{" FM_Cleanup          " link FM_Cleanup}
@{" FM_Show             " link FM_Show}
@{" FM_Hide             " link FM_Hide}@{PAR}
@{" FM_AskMinMax        " link FM_AskMinMax}
@{" FM_Layout           " link FM_Layout}
@{" FM_Draw             " link FM_Draw}
@{" FM_DrawBackground   " link FM_DrawBackground}@{PAR}
@{" FM_Active           " link FM_Active}
@{" FM_Inactive         " link FM_Inactive}@{PAR}
@{" FM_HandleEvent      " link FM_HandleEvent}
@{" FM_ModifyHandler    " link FM_ModifyHandler}@{PAR}
@{" FM_BuildContextHelp " link FM_BuildContextHelp}
@{" FM_BuildContextMenu " link FM_BuildContextMenu}@{PAR}@{lindent 2}

@{b}Attributes@{ub}@{PAR}@{lindent 4}

@{" FA_Area             " link FA_Area}
@{" FA_Left             " link FA_Left}
@{" FA_Top              " link FA_Top}
@{" FA_Right            " link FA_Right}
@{" FA_Bottom           " link FA_Bottom}
@{" FA_Width            " link FA_Width}
@{" FA_Height           " link FA_Height}@{PAR}
@{" FA_MinWidth         " link FA_MinWidth}
@{" FA_MinHeight        " link FA_MinHeight}
@{" FA_MaxWidth         " link FA_MaxWidth}
@{" FA_MaxHeight        " link FA_MaxHeight}
@{" FA_FixWidth         " link FA_FixWidth}
@{" FA_FixHeight        " link FA_FixHeight}
@{" FA_FixWidthTxt      " link FA_FixWidthTxt}
@{" FA_FixHeightTxt     " link FA_FixHeightTxt}
@{" FA_Fixed            " link FA_Fixed}
@{" FA_FixedWidth       " link FA_FixedWidth}
@{" FA_FixedHeight      " link FA_FixedHeight}@{PAR}
@{" FA_Active           " link FA_Active}
@{" FA_Selected         " link FA_Selected}
@{" FA_Pressed          " link FA_Pressed}
@{" FA_Hidden           " link FA_Hidden}
@{" FA_Disabled         " link FA_Disabled}@{PAR}
@{" FA_Timer            " link FA_Timer}@{PAR}
@{" FA_Weight           " link FA_Weight}
@{" FA_Horizontal       " link FA_Horizontal}@{PAR}
@{" FA_Font             " link FA_Font}@{PAR}
@{" FA_ControlChar      " link FA_ControlChar}
@{" FA_ContextMenu      " link FA_ContextMenu}@{PAR}
@EndNode

@Node FM_Active "FC_Area / FM_Active"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FM_Active -- (00.00)@{ub}@{PAR}
[For use within classes only]@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

The methods @{fg highlight}FM_Active@{fg text} / @{fg highlight}FM_Inactive@{fg text} are sent to an object when it gets
activated / deactivated.@{PAR}

You may not send these methods yourself, they are sent to you by @{b}Feelin@{ub} when
your object becomes the active one. If you pass these methods to your
superclass, @{b}FC_Area@{ub} will draw the active object frame. If you don't,
nothing will be drawn and you're responsible for displaying this state
yourself, e.g. with a cursor (as string objects).@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FA_Active   " link FA_Active}@{PAR}
@{" FM_Inactive " link FM_Inactive}@{PAR}
@EndNode
@Node FM_AskMinMax "FC_Area / FM_AskMinMax"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FM_AskMinMax -- (00.00)@{ub}@{PAR}
[For use within classes only]@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

This method is sent to your object when @{b}Feelin@{ub} wants to know minimun and
maximum sizes of your object. These values are needed for the correct
layout, depending on the type of group that contains your object.@{PAR}@{lindent 2}

@{fg shine}@{b}EXAMPLE@{ub}@{fg text}@{PAR}@{lindent 4}

ULONG SAVEDS myAskMinMax(struct FS_Class *Class,APTR Obj,ULONG *Args)@{PAR}
{@{lindent 8}@{PAR}
/*@{PAR}
We add values specific to our object *before* calling our superclass,
FC_Area will adjust them depending on FA_MinXxx, FA_MaxXxx or FA_FixedXxx.
note that we indeed need to *add* these values, not just set them!@{PAR}
*/@{PAR}

// x-size depending on objects font@{PAR}

_minw(Obj) += _font(Obj) -> tf_XSize * 10;@{PAR}
_maxw(Obj) += _font(Obj) -> tf_XSize * 20;@{PAR}

// y-size@{PAR}

_minh(Obj) += _font(Obj) -> tf_YSize;@{PAR}
_maxh(Obj) += _font(Obj) -> tf_YSize;@{PAR}

return @{fg highlight}F_SuperDoA@{fg text}(Class,Obj,@{fg highlight}FM_AskMinMax@{fg text},Args);@{lindent 4}@{PAR}
}@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FM_Layout " link FM_Layout}@{PAR}
@EndNode
@Node FM_BuildContextHelp "FC_Area / FM_BuildContextHelp"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FM_BuildContextHelp -- (02.00)@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}SYNOPSIS@{ub}@{fg text}@{PAR}@{lindent 4}

F_DoA(obj,FM_BuildContextHelp,FS_BuildContextHelp)@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Allows dynamic creation of context help.@{PAR}

When @{b}Feelin@{ub} is about to show a new context help, it sends a
@{fg highlight}FM_BuildContextHelp@{fg text} to the @{"Window" link FC_Window.guide/Main} object. The method
travels throught the object tree until an object returns the
@{fg shine}FS_BuildContextHelp@{fg text} structure, previously filled with appropriate
information.@{PAR}

When @{fg highlight}FM_BuildContextHelp@{fg text} reaches @{b}FC_Area@{ub}, it just fill the field @{i}Help @{ui}
with the contents of @{"FA_ContextHelp" link FA_ContextHelp} (if any). You needn't
care about this method if you only have static, non-changing context
helps.@{PAR}

However, if your context helps depend on some internal states of your
objects or on the mouse position within your objects, you have to have a
subclass which overrides @{fg highlight}FM_BuildContextHelp@{fg text}, creates a nice string and
set it.@{PAR}@{lindent 2}

@{fg shine}@{b}RESULT@{ub}@{fg text}@{PAR}@{lindent 4}

Fill the field @{i}Help @{ui}of the @{fg shine}FS_BuildContextHelp@{fg text} structure with a pointer to
your help string.@{PAR}@{lindent 2}

@{fg shine}@{b}INPUTS@{ub}@{fg text}@{PAR}@{lindent 4}

A struct @{fg shine}FS_BuildContextHelp@{fg text} holding current @{i}MouseX @{ui}and @{i}MouseY @{ui}(relative to
window coordinates), and the entry @{i}Help @{ui}which should be filled with the
appropriate string.@{PAR}@{lindent 2}

@{fg shine}@{b}RESULT@{ub}@{fg text}@{PAR}@{lindent 4}

A pointer to the struct @{fg shine}FS_BuildContextHelp@{fg text} passed in if @{i}Help @{ui}has been set,
else NULL.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FA_ContextHelp " link FA_ContextHelp}
@{" FA_ContextMenu " link FA_ContextMenu}@{PAR}
@{" FC_PopHelp     " link FC_PopHelp.guide/Main}@{PAR}
@EndNode
@Node FM_BuildContextMenu "FC_Area / FM_BuildContextMenu"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FM_BuildContextMenu -- (02.00)@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}SYNOPSIS@{ub}@{fg text}@{PAR}@{lindent 4}

F_DoA(obj,FM_BuildContextMenu,struct FS_BuildContextMenu *psBCM)@{PAR}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Allows dynamic creation of context menus.@{PAR}

When @{b}Feelin@{ub} is about to show a new context menu, it sends a
@{fg highlight}FM_BuildContextMenu@{fg text} to the root object of the @{"Window" link FC_Window.guide/Main} object. The method
travels throught the object tree until an object returns the
@{fg shine}FS_BuildContextMenu@{fg text} structure, previously filled with appropriate
information.@{PAR}

When @{fg highlight}FM_BuildContextMenu@{fg text} reaches @{b}Area@{ub} class, it just fill the field @{i}Menu @{ui}
with the contents of @{"FA_ContextMenu" link FA_ContextMenu} (if any) and set the field @{i}ContextOwner @{ui}
to itself. You needn't care about this method if you only have static,
non-changing context menus.@{PAR}

However, if your context menus depend on some internal states of your
objects or on the mouse position within your objects, you have to have a
subclass which overrides @{fg highlight}FM_BuildContextMenu@{fg text}, creates a nice @{"Menu" link FC_Menu.guide/Main} object and
returns it.@{PAR}@{lindent 2}

@{fg shine}@{b}RESULT@{ub}@{fg text}@{PAR}@{lindent 4}

Fill the field @{i}Menu @{ui}of the @{fg shine}FS_BuildContextMenu@{fg text} structure with a pointer to
your @{"Menu" link FC_Menu.guide/Main} object, and the field @{i}ContextOwner @{ui}with a pointer to your object.@{PAR}

The fields @{i}Menu @{ui}and @{i}ContextOwner @{ui}should be left untouch if you failed to
create a @{"Menu" link FC_Menu.guide/Main}. This will allow the @{"Window" link FC_Window.guide/Main} object to open it's own instead,
but please warn the user in this case e.g. using @{"F_AlertA()" link Feelin.guide/F_AlertA}, as he may gets
confused...@{PAR}@{lindent 2}

@{fg shine}@{b}EXAMPLE@{ub}@{fg text}@{PAR}@{lindent 4}

This example is directly taken from FC_Area.@{PAR}

ULONG area_ContextMenu(SELF,struct FS_BuildContextMenu *BCM)
{@{PAR}
   if (Self -> ContextMenu)@{PAR}
   {@{PAR}
      if (between(BCM -> MouseX, _x1(Self), _x2(Self)) && between(BCM -> MouseY, _y1(Self), _y2(Self)))@{PAR}
      {@{PAR}
         BCM -> Menu         = Self -> ContextMenu;@{PAR}
         BCM -> ContextOwner = Self;@{PAR}

         return (ULONG)BCM;@{PAR}
      }@{PAR}
   }@{PAR}

   return NULL;@{PAR}
}@{PAR}@{lindent 2}

@{fg shine}@{b}NOTES@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}Feelin@{ub} will never dispose the object you return. You @{u}must@{uu} take care of
this yourself, e.g. by storing a pointer somewhere in your instance data and
killing it on the next invocation of @{fg highlight}FM_BuildContextMenu@{fg text} and on @{"FM_Dispose" link FC_Object.guide/FM_Dispose}.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FA_ContextHelp " link FA_ContextHelp}
@{" FA_ContextMenu " link FA_ContextMenu}@{PAR}
@EndNode
@Node FM_Cleanup "FC_Area / FM_Cleanup"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FM_Cleanup -- (00.00)@{ub}@{PAR}
[For use within classes only]@{PAR}@{lindent 2}

@{fg shine}@{b}SYNOPSIS@{ub}@{fg text}@{PAR}@{lindent 4}

F_Do(obj,FM_Cleanup,struct FS_Render *psRender)@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

This method is sent to your object when e.g. the window containing your
object is closed. You have to free all resources allocated during @{fg highlight}FM_Setup@{fg text}.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FM_Setup " link FM_Setup}@{PAR}
@EndNode
@Node FM_Draw "FC_Area / FM_Draw"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FM_Draw -- (00.00)@{ub}@{PAR}
[For use within classes only]@{PAR}@{lindent 2}

@{fg shine}@{b}SYNOPSIS@{ub}@{fg text}@{PAR}@{lindent 4}

F_Do(obj,FM_Draw,nFlags)@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Whenever @{b}Feelin@{ub} feels (indeed) that your object should render itself, it
sends you a @{fg highlight}FM_Draw@{fg text} method. This happens e.g. when a window is openend for
the first time, after a window was resized.@{PAR}

Together with @{fg highlight}FM_Draw@{fg text} comes a flag value that indicates which parts of the
object are to be redrawn. The only interesting bits in this flag value are
@{fg shine}FF_Draw_Object@{fg text} and @{fg shine}FF_Draw_Update@{fg text}. When @{fg shine}FF_Draw_Object@{fg text} is set, @{b}Feelin@{ub} wants
you to do a complete redraw of your object. @{fg shine}FF_Draw_Update@{fg text} is used by @{b}Feelin @{ub}
when the frame doesn't have to be redrawn, only the inner area of the object
will be cleared and redrawn. You can use this flags for private requirement
with the @{"F_Draw()" link Feelin.guide/F_Draw} function call. You can also use one of the @{fg shine}FF_Draw_Custom_@{fg text}X
flags if you need something special.@{PAR}

Information about rendering environment (screen, window, rastport, pens,
etc.) is saved in a structure called @{"FS_Render" link FC_Window.guide/FS_Render}. Every objects render
structure is accessible with the @{i}_render(obj) @{ui}macro. Parts of this structure
are valid between @{fg highlight}FM_Setup@{fg text} and @{fg highlight}FM_Cleanup@{fg text}, other parts like window and
rastport pointer are valid between @{fg highlight}FM_Show@{fg text} and @{fg highlight}FM_Hide@{fg text}. Please have a look
at the supplied compiler headers for more detailed information about the
@{"FS_Render" link FC_Window.guide/FS_Render} structure.@{PAR}@{lindent 2}

@{fg shine}@{b}NOTES@{ub}@{fg text}@{PAR}@{lindent 4}

@{fg highlight}FM_Draw@{fg text} is the only place where you are allowed to render!@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" F_Draw() " link Feelin.guide/F_Draw}@{PAR}
@EndNode
@Node FM_DrawBackground "FC_Area / FM_DrawBackground"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FM_DrawBackground -- (00.00)@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}SYNOPSIS@{ub}@{fg text}@{PAR}@{lindent 4}

F_DoA(obj,FM_DrawBackground,struct FS_Rect *psRect)@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

If you decided to use @{fg shine}FA_FillArea@{fg text} FALSE for your class, i.e. if you care
about background rendering yourself, you can use this method to draw a
specific part of your object's background with the defined @{fg shine}FA_Back@{fg text}.@{PAR}@{lindent 2}

@{fg shine}@{b}INPUTS@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}psRect@{ub} - a pointer to a struct @{"FS_Rect" link FS_Rect} holding coordinates of the area to
fill.@{PAR}@{lindent 2}

@{fg shine}@{b}NOTES@{ub}@{fg text}@{PAR}@{lindent 4}

Rectangle will not be filled if window is currently refresing itself and if
the parent of your object have the same background as yours. This speed up
rendering as if your parent already have cleared its area it is useless that
you clear yours too.@{PAR}

Don't worry about bitmap mapping, @{"FC_ImageDisplay" link FC_ImageDisplay.guide/Main} is used to render
graphics and is clever enough to adjust patterns by itself and render them
nicely.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FA_Back " link FA_Back}@{PAR}
@EndNode
@Node FM_HandleEvent "FC_Area / FM_HandleEvent"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FM_HandleEvent -- (00.00)@{ub}@{PAR}
[For use within classes only]@{PAR}@{lindent 2}

@{fg shine}@{b}SYNOPSIS@{ub}@{fg text}@{PAR}@{lindent 4}

F_DoA(obj,FM_HandleEvent,FS_HandleEvent)@{PAR}
F_Do(obj,FM_HandleEvent,struct IntuiMessage *psIMsg,ULONG nKey)@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

This method is invoked whenever one of an event handlers trigger signals
arrives.@{PAR}@{lindent 2}

@{fg shine}@{b}INPUTS@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}psIMsg@{ub} - pointer to a struct IntuiMessage that caused the event.@{PAR}

@{b}nKey@{ub} - if the IntuiMessage translates to a predefined keystroke, this parameter holds
the corresponding @{fg shine}FV_Key_XXX@{fg text} value. Otherwise it will be @{fg shine}FV_Key_None@{fg text}.@{PAR}@{lindent 2}

@{fg shine}@{b}RESULT@{ub}@{fg text}@{PAR}@{lindent 4}

Return non FV_HandleEvent_Eat if the event was for you and you want @{b}Feelin@{ub} to stop calling
other event handlers in the chain.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FM_ModifyHandler          " link FM_ModifyHandler}@{PAR}
@{" FM_Window_AddEventHandler " link FC_Window.guide/FM_Window_AddEventHandler}@{PAR}
@EndNode
@Node FM_Hide "FC_Area / FM_Hide"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FM_Hide -- (00.00)@{ub}@{PAR}
[For use within classes only]@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Your object will receive this method right before the window that contains
your object is closed.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FM_Show " link FM_Show}@{PAR}
@EndNode
@Node FM_Inactive "FC_Area / FM_Inactive"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FM_Inactive -- (00.00)@{ub}@{PAR}
[For use within classes only]@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

The methods @{fg highlight}FM_Active@{fg text} / @{fg highlight}FM_Inactive@{fg text} are sent to an object when it gets
activated / deactivated.@{PAR}

You may not send these methods yourself, they are sent to you by @{b}Feelin@{ub} when
your object becomes the active one. If you pass these methods to your
superclass, @{b}FC_Area@{ub} will draw the inactive object frame. If you don't,
nothing will be drawn and you're responsible for displaying this state
yourself, e.g. with a cursor (as string objects).@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FM_Active " link FM_Active}@{PAR}
@EndNode
@Node FM_Layout "FC_Area / FM_Layout"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FM_Layout -- (00.00)@{ub}@{PAR}
[For use within classes only]@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Your object will receive this method after the function @{"F_Layout()" link Feelin.guide/F_Layout} has
modified its coordinates. This method is curently only implemented by @{"FC_Group" link FC_Group.guide/Main} and
is used to compute and set coordinates of its childs.@{PAR}@{lindent 2}

@{fg shine}@{b}NOTES@{ub}@{fg text}@{PAR}@{lindent 4}

You should rarely implement this method in a class.@{PAR}@{lindent 2}
@EndNode
@Node FM_ModifyHandler "FC_Area / FM_ModifyHandler"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FM_ModifyHandler -- (03.00)@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}SYNOPSIS@{ub}@{fg text}@{PAR}@{lindent 4}

F_Do(obj,FM_ModifyHandler,ULONG nAdd,ULONG nRem)@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Event handlers introduced in @{"Window" link FC_Window.guide/FM_Window_AddEventHandler} V6.12 allow custom classes to receive
IDCMP events. You need to manage a @{"FS_EventHandler" link FC_Window.guide/FS_EventHandler} to receive these events.
The @{fg highlight}FM_ModifyHandler@{fg text} creates and disposes this precious structure on the
fly, depending on the modifications applied to the events requested.@{PAR}@{lindent 2}

@{fg shine}@{b}INPUTS@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}nAdd@{ub} - IDCMP events to add.@{PAR}
@{b}nRem@{ub} - IDCMP events to remove.@{PAR}@{lindent 2}

@{fg shine}@{b}RESULT@{ub}@{fg text}@{PAR}@{lindent 4}

A pointer to a struct @{"FS_EventHandler" link FC_Window.guide/FS_EventHandler} if you have requested some events, or
NULL if either modifications set events to NULL or allocation of the
@{"FS_EventHandler" link FC_Window.guide/FS_EventHandler} failed.@{PAR}@{lindent 2}

@{fg shine}@{b}EXAMPLE@{ub}@{fg text}@{PAR}@{lindent 4}

@{"FM_Setup" link FC_Area.guide/FM_Setup}:@{PAR}
    F_Do(obj,FM_ModifyHandler,IDCMP_RAWKEY | IDCMP_MOUSEBUTTONS,NULL);@{PAR}

@{"FM_Cleanup" link FC_Area.guide/FM_Cleanup}:@{PAR}
    F_Do(obj,FM_ModifyHandler,NULL,IDCMP_RAWKEY | IDCMP_MOUSEBUTTONS);@{PAR}

@{fg shine}@{b}EXAMPLE@{ub}@{fg text}@{PAR}@{lindent 4}

ULONG SAVEDS myHandleEvent(APTR Obj,struct LocalObjectData *LOD,struct IntuiMessage *IMsg,ULONG Key)@{PAR}
{@{lindent 7}@{PAR}
if (Key != @{fg shine}FV_Key_None@{fg text})@{PAR}
{@{PAR}
   switch (Key)@{PAR}
   {@{PAR}
      case @{fg shine}FV_Key_Left@{fg text}:    LOD -> sx = -1; break;@{PAR}
      case @{fg shine}FV_Key_Right@{fg text}:   LOD -> sx =  1; break;@{PAR}
      case @{fg shine}FV_Key_Top@{fg text}:     LOD -> sy = -1; break;@{PAR}
      case @{fg shine}FV_Key_Bottom@{fg text}:  LOD -> sy =  1; break;@{PAR}
      default: return NULL@{PAR}
   }@{PAR}

   @{fg highlight}F_Draw@{fg text}(Obj,@{fg shine}FF_Draw_Update@{fg text});@{PAR}
   return (ULONG)Obj;@{PAR}
}@{PAR}
else@{PAR}
{@{PAR}
   switch (IMsg -> Class)@{PAR}
   {@{PAR}
     case IDCMP_MOUSEBUTTONS:@{PAR}
     {@{PAR}
        if (IMsg -> Code = SELECTDOWN)@{PAR}
        {@{PAR}
           if (between(IMsg -> MouseX,_x1(Obj),_x2(Obj)) && (between(IMsg -> MouseY,_y1(Obj),_y2(Obj)))@{PAR}
           {@{PAR}
              LOD -> x = IMsg -> MouseX;@{PAR}
              LOD -> y = IMsg -> MouseY;@{PAR}

              @{fg highlight}F_Draw@{fg text}(Obj,@{fg shine}FF_Draw_Update@{fg text});@{PAR}
              @{fg highlight}F_Do@{fg text}(Obj,@{fg shine}FM_ModifyHandler@{fg text},IDCMP_MOUSEMOVE,NULL);@{PAR}
           }@{PAR}
        }@{PAR}
        else@{PAR}
        {@{PAR}
           @{fg highlight}F_Do@{fg text}(Obj,@{fg shine}FM_ModifyHandler@{fg text},NULL,IDCMP_MOUSEMOVE);@{PAR}
        }@{PAR}
     break;@{PAR}

     case IDCMP_MOUSEMOVE:@{PAR}
        if (between(IMsg -> MouseX,_x1(Obj),_x2(Obj)) && (between(IMsg -> MouseY,_y1(Obj),_y2(Obj)))@{PAR}
        {@{PAR}
           LOD -> x = IMsg -> MouseX;@{PAR}
           LOD -> y = IMsg -> MouseY;@{PAR}

           @{fg highlight}F_Draw@{fg text}(Obj,@{fg shine}FF_Draw_Update@{fg text});@{PAR}
        }@{PAR}
     break;@{PAR}
   }@{PAR}@{lindent 11}

/* Passing @{fg highlight}FM_HandleEvent@{fg text} to the super class is only necessary if you
rely @{b}FC_Area@{ub} input handling (@{fg shine}FA_InputMode@{fg text}). */@{PAR}@{lindent 7}

}@{lindent 4}@{PAR}
return NULL;@{PAR}
}@{PAR}

Take a look at @{fg shine}class3@{fg text} source code to see how things work.@{PAR}@{lindent 2}

@{fg shine}@{b}NOTE@{ub}@{fg text}@{PAR}@{lindent 4}

@{fg highlight}FM_ModifyHandler@{fg text} invokes automatically @{"FM_Window_AddEventHandler" link FC_Window.guide/FM_Window_AddEventHandler} and
@{"FM_Window_RemEventHandler" link FC_Window.guide/FM_Window_RemEventHandler} on the window object of the object.@{PAR}
@EndNode
@Node FM_Setup "FC_Area / FM_Setup"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FM_Setup -- (00.00)@{ub}@{PAR}
[For use within classes only]@{PAR}@{lindent 2}

@{fg shine}@{b}SYNOPSIS@{ub}@{fg text}@{PAR}@{lindent 4}

F_Do(obj,FM_Setup,struct FS_Render *psRender)@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Since your object doesn't know anything about display environment after it
is created with @{"FM_New" link FC_Object.guide/FM_New}, @{b}Feelin@{ub} will send you a @{fg highlight}FM_Setup@{fg text} when it is about to
open a window containing your object.@{PAR}

The first thing you have to do is to pass @{fg highlight}FM_Setup@{fg text} to your super class an
return FALSE on failure. After this, you can calculate some internal data or
allocate some display buffers. Return TRUE if everything went ok or FALSE
when you discovered any errors. If you return FALSE, the root object of the
window containing the object will recieve a @{fg highlight}FM_Cleanup@{fg text} method.@{PAR}@{lindent 2}

@{fg shine}@{b}INPUTS@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}psRender@{ub} - a pointer to a @{"FS_Render" link FC_Window.guide/FS_Render}. This structure is created by
the @{"window" link FC_Window.guide/Main} object and shared by all objects of the window. This structure
remains valid between @{fg highlight}FM_Setup@{fg text} / @{fg highlight}FM_Cleanup@{fg text}.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FM_Cleanup " link FM_Cleanup}@{PAR}
@EndNode
@Node FM_Show "FC_Area / FM_Show"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FM_Show -- (00.00)@{ub}@{PAR}
[For use within classes only]@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Once the window is opened, your object will receive a @{fg highlight}FM_Show@{fg text}. If you have
some window/rastport environment dependant things to do, @{fg highlight}FM_Show@{fg text} is the
correct place. Intuition like gadgets would for example do an @{fg highlight}AddGadget() @{fg text}
here.@{PAR}@{lindent 2}

@{fg shine}@{b}NOTES@{ub}@{fg text}@{PAR}@{lindent 4}

Note that you should @{b}not@{ub} render during @{fg highlight}FM_Show@{fg text}. Usually, Feelin classes
won't need to implement this method. And please do not use intuition gadgets
but create your own. @{b}Feelin@{ub} purpose is to get rid of intuition so please
follow the rule.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FM_Hide " link FM_Hide}@{PAR}
@EndNode

@Node FA_Active "FC_Area / FA_Active"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_Active -- (00.00) [ISG], BOOL@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Get and set the active state of an object. If the object is member of the
window's cycle chain, this attribute is triggered each time the object
become the active one or is no longer the active one. If @{fg shine}FA_Active@{fg text} is set to
TRUE the method @{fg highlight}FM_Active@{fg text} will be invoked on the object by @{b}FC_Area@{ub}, else the
method @{fg highlight}FM_Inactive@{fg text} will be invoked instead.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FA_Selected " link FA_Selected}@{PAR}
@{" FM_Active   " link FM_Active}
@{" FM_Inactive " link FM_Inactive}@{PAR}
@EndNode
@Node FA_Area "FC_Area / FA_Area"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_Area -- (00.00) [..G], struct FS_Rect *@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Returns a pointer to a @{"FS_Rect" link FS_Rect} structure holding current object position.
This structure is read only, if you want to modify object dimensions use
@{b}feelin.library@{ub} @{fg highlight}F_Layout()@{fg text} function.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" F_Layout  " link Feelin.guide/F_Layout}@{PAR}
@{" FA_Left   " link FA_Left}
@{" FA_Top    " link FA_Top}
@{" FA_Right  " link FA_Right}
@{" FA_Bottom " link FA_Bottom}
@{" FA_Width  " link FA_Width}
@{" FA_Height " link FA_Height}@{PAR}
@EndNode
@Node FA_Bottom "FC_Area / FA_Bottom"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_Bottom -- (00.00) [..G], ULONG@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

You can use this to read the current position and dimension of an object, if
you e.g. need to pop up some requester below.@{PAR}

Of course, this attribute is only valid when the parent window of the object
is currently open.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FA_Left   " link FA_Left}
@{" FA_Top    " link FA_Top}
@{" FA_Right  " link FA_Right}
@{" FA_Width  " link FA_Width}
@{" FA_Height " link FA_Height}@{PAR}
@EndNode
@Node FA_ContextHelp "FC_Area / FA_ContextHelp"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_ContextHelp -- (02.00) [ISG], STRPTR@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Specifies a context sensitive popup help for the current object. Popup helps
are simple string used by a PopHelp object managed by the Window object to
as display context help.@{PAR}

Have a look at @{"FC_PopHelp" link FC_PopHelp.guide/Main} documentation to know how things are handled.@{PAR}@{lindent 2}

@{fg shine}@{b}NOTES@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}Feelin@{ub} uses the same tree-like technique as always (e.g. with drag&drop) to
find out whichs context help to use on a certain mouse position. This allows
you to have a context help for a group and different context helps for its
children.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FM_BuildContextMenu " link FM_BuildContextMenu}@{PAR}
@{" FA_Menu_Selected    " link FC_Menu.guide/FA_Menu_Selected}@{PAR}
@EndNode
@Node FA_ContextMenu "FC_Area / FA_ContextMenu"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_ContextMenu -- (02.00) [ISG], APTR@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Specifies a context sensitive popup menu for the current object. Popup menus
are created using @{"FC_Menu" link FC_Menu.guide/Main} and subclasses, like standard @{b}Feelin@{ub} menus.@{PAR}

Whenever the user hits the RMB and the mouse is above the parent object,
@{b}Feelin@{ub} will present the popup menu instead of the windows menu.@{PAR}

Note: @{b}Feelin@{ub} will @{u}not@{uu} dispose the @{fg shine}FA_ContextMenu@{fg text} object when the object is
disposed. You must take care of the @{"Menu" link FC_Menu.guide/Main} object yourself. This is because
@{"Menu" link FC_Menu.guide/Main} object of @{fg shine}FA_ContextMenu@{fg text} do not actually @{i}belong @{ui}to their parent
objects, it's just a @{i}reference@{ui}. You are allowed to use a single @{"Menu" link FC_Menu.guide/Main} object,
or even a submenu of a @{"Menu" link FC_Menu.guide/Main} object, as @{fg shine}FA_ContextMenu@{fg text} for different objects.@{PAR}

Menus (and submenus) can be shared with objects in the same window, other
windows, @{"Windows" link FC_Window.guide/Main} and even @{"Client" link FC_Client.guide/Main}. @{"FC_Menu" link FC_Menu.guide/Main} is very flexible and easy to
setup.@{PAR}@{lindent 2}

@{fg shine}@{b}NOTES@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}Feelin@{ub} uses the same tree-like technique as always (e.g. with drag&drop) to
find out whichs context menu to use on a certain mouse position. This allows
you to have a context menu for a group and different context menus for its
children.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FM_BuildContextMenu " link FM_BuildContextMenu}@{PAR}
@{" FA_Menu_Selected    " link FC_Menu.guide/FA_Menu_Selected}@{PAR}
@EndNode
@Node FA_ControlChar "FC_Area / FA_ControlChar"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_ControlChar -- (00.00) [ISG], CHAR@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

This character will be used as a shortcut to your object.@{PAR}@{lindent 2}

@{fg shine}@{b}NOTE@{ub}@{fg text}@{PAR}@{lindent 4}

@{"Text" link FC_Text.guide/Main} objects modify this attribute when they find an underscore in their
string. You will rarely need to set this attribute yourself.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FA_Text " link FC_Text.guide/FA_Text}@{PAR}
@EndNode
@Node FA_Disabled "FC_Area / FA_Disabled"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_Disabled -- (00.00) [ISG], BOOL@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Disable or enable an object. Setting this attribute causes an object to
become disabled, it gets a ghost pattern and doesn't respond to user input
any longer.@{PAR}

Disabled objects cannot be activated with the cycle keys.@{PAR}

Using @{fg shine}FA_Disabled@{fg text} on a group of objects will disable all objects within that
group.@{PAR}@{lindent 2}
@EndNode
@Node FA_Font "FC_Area / FA_Font"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_Font -- (00.00) [I.G], SPTPTR@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}SPECIAL INPUTS@{ub}@{fg text}@{PAR}@{lindent 4}

@{fg shine}FV_Font_Inherit@{PAR}
FV_Font_Normal@{PAR}
FV_Font_List@{PAR}
FV_Font_Tiny@{PAR}
FV_Font_Fixed@{PAR}
FV_Font_Title@{PAR}
FV_Font_Big@{PAR}
FV_Font_Button@{PAR}@{lindent 2}@{fg text}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Every @{b}Area@{ub} object can have its own font. @{b}Area@{ub} objects load the font for you,
all you have to do is provide one of the special values or define the font
to load using a simple string e.g. just name it with this tag e.g.
"Helvetica/13".@{PAR}@{lindent 2}

@{fg shine}@{b}NOTES@{ub}@{fg text}@{PAR}@{lindent 4}

Getting this attribute will return a struct TextFont of the opened font.@{PAR}@{lindent 2}
@EndNode
@Node FA_Height "FC_Area / FA_Height"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_Height -- (00.00) [..G], ULONG@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

You can use this to read the current position and dimension of an object, if
you e.g. need to pop up some requester below.@{PAR}

Of course, this attribute is only valid when the parent window of the object
is currently open.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FA_Left   " link FA_Left}
@{" FA_Top    " link FA_Top}
@{" FA_Right  " link FA_Right}
@{" FA_Bottom " link FA_Bottom}
@{" FA_Width  " link FA_Width}@{PAR}
@EndNode
@Node FA_Hidden "FC_Area / FA_Hidden"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_Hidden -- (00.00) [ISG], BOOL@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Objects with this attribute set are not displayed. You can set @{fg shine}FA_Hidden@{fg text} at
any time, causing objects to appear and to disappear immediately. A new
layout is calculated whenever some objects are shown or hidden. When
necessary, Feelin will resize the parent window to make place for the new
objects.@{PAR}@{lindent 2}
@EndNode
@Node FA_Horizontal "FC_Area / FA_Horizontal"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_Horizontal -- (00.00) [I.G], BOOL@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

A general purpose attribute. It's an easy way telling your object how it
has to look like.@{PAR}

This attribute is especially used by groups to make their layout horizontal
or vertical, or by sliders to specify their orientation.@{PAR}@{lindent 2}
@EndNode
@Node FA_Left "FC_Area / FA_Left"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_Left -- (00.00) [..G], ULONG@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

You can use this to read the current position and dimension of an object, if
you e.g. need to pop up some requester below.@{PAR}

Of course, this attribute is only valid when the parent window of the object
is currently open.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FA_Left   " link FA_Left}
@{" FA_Right  " link FA_Right}
@{" FA_Bottom " link FA_Bottom}
@{" FA_Width  " link FA_Width}
@{" FA_Height " link FA_Height}@{PAR}
@EndNode
@Node FA_Pressed "FC_Area / FA_Pressed"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_Pressed -- (00.00) [ISG], BOOL@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Get and set the pressed state of an object. This attribute is triggered by
some user action, depending on the input mode:@{PAR}

FV_InputMode_Release:@{lindent 8}@{PAR}
- TRUE when left mouse button is pressed.@{PAR}

- FALSE when left mouse button is released and the mouse is still over the
object box (otherwise it will be cleared too, but without triggering a
notification event).@{PAR}@{lindent 4}

FV_InputMode_Immediate@{lindent 8}@{PAR}
- undefined, use @{fg shine}FA_Selected@{fg text} for this.@{PAR}@{lindent 4}

FV_InputMode_Toggle@{lindent 8}@{PAR}
- undefined, use @{fg shine}FA_Selected@{fg text} for this.@{PAR}@{lindent 4}

Waiting for @{fg shine}FA_Pressed@{fg text} getting FALSE is the usual way to react on button
objects.@{PAR}@{lindent 2}

@{fg shine}@{b}NOTES@{ub}@{fg text}@{PAR}@{lindent 4}

While an object with a FV_InputMode_Release is pressed the attribute
@{fg shine}FA_Timer@{fg text} is increased every INTUITICK.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FA_Selected " link FA_Selected}
@{" FA_Timer    " link FA_Timer}@{PAR}
@EndNode
@Node FA_Right "FC_Area / FA_Right"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_Right -- (00.00) [..G], ULONG@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

You can use this to read the current position and dimension of an object, if
you e.g. need to pop up some requester below.@{PAR}

Of course, this attribute is only valid when the parent window of the object
is currently open.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FA_Left   " link FA_Left}
@{" FA_Top    " link FA_Top}
@{" FA_Bottom " link FA_Bottom}
@{" FA_Width  " link FA_Width}
@{" FA_Height " link FA_Height}@{PAR}
@EndNode
@Node FA_Selected "FC_Area / FA_Selected"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_Selected -- (00.00) [ISG], BOOL@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

Get and set the selected state of an object. This attribute can be triggered
by the user clicking on the object (or using the keyboard), depending on the
input mode:@{PAR}

FV_InputMode_Release:@{lindent 8}@{PAR}
- TRUE when left mouse button is pressed.@{PAR}
- FALSE when left mouse button is released.@{PAR}
- FALSE when the object is selected and the mouse leaves the gadget box.@{PAR}
- TRUE when the mouse renters the object box.@{PAR}@{lindent 4}

FV_InputMode_Immediate:@{lindent 8}@{PAR}
- TRUE when left mouse button is pressed.@{PAR}@{lindent 4}

FV_InputMode_Toggle:@{lindent 8}@{PAR}
- Toggled when left mouse button is pressed.@{PAR}@{lindent 4}

Of course you may set this attribute yourself, e.g. to adjust the state of a
checkmark object.@{PAR}

A selected object will display its alternative frame and get the alternative
background.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FA_InputMode " link FA_InputMode}
@{" FA_Pressed   " link FA_Pressed}
@{" FA_Timer     " link FA_Timer}@{PAR}
@EndNode
@Node FA_Timer "FC_Area / FA_Timer"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_Timer -- (00.00) [..G], LONG@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

@{fg shine}FA_Timer@{fg text} gets triggered when a FV_InputMode_Release object is pressed and
(after a little delay) increases every INTUITICK as long as the mouse
remains over the object.@{PAR}

This makes it possible to have buttons repeatedly cause some actions, just
like the arrow objects of a scrollbar.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FA_Pressed  " link FA_Pressed}
@{" FA_Selected " link FA_Selected}@{PAR}
@EndNode
@Node FA_Top "FC_Area / FA_Top"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_Top -- (00.00) [..G], ULONG@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

You can use this to read the current position and dimension of an object, if
you e.g. need to pop up some requester below.@{PAR}

Of course, this attribute is only valid when the parent window of the object
is currently open.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FA_Left   " link FA_Left}
@{" FA_Right  " link FA_Right}
@{" FA_Bottom " link FA_Bottom}
@{" FA_Width  " link FA_Width}
@{" FA_Height " link FA_Height}@{PAR}
@EndNode
@Node FA_Weight "FC_Area / FA_Weight"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_Weight -- (00.00) [I..], UWORD@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

The weight of an object determines how much room it will get during the
layout process. Imagine you have a 100 pixel wide horizontal group with two
string objects. Usually, each object will get half of the room and be 50
pixels wide. If you feel the left gadget is more important and should be
bigger, you can give it a weight of 200 (and 100 for the right gadget).
Because the left gadget is twice as "heavy" as the right gadget, it will
become twice as big (about 66 pixel) as the right one (34 pixel).@{PAR}

Of course giving weights only makes sense if the object is resizable. An
object with a weight of 0 will always stay at its minimum size.@{PAR}

By default, all objects have a weight of 100.@{PAR}@{lindent 2}
@EndNode
@Node FA_Width "FC_Area / FA_Width"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_Width -- (00.00) [..G], ULONG@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}

You can use this to read the current position and dimension of an object, if
you e.g. need to pop up some requester below.@{PAR}

Of course, this attribute is only valid when the parent window of the object
is currently open.@{PAR}@{lindent 2}

@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}

@{" FA_Left   " link FA_Left}
@{" FA_Top    " link FA_Top}
@{" FA_Right  " link FA_Right}
@{" FA_Bottom " link FA_Bottom}
@{" FA_Height " link FA_Height}@{PAR}
@EndNode

@Node FS_Rect "FC_Area / FS_Rect"
@Prev FS_Rect
@Next FS_Rect
@{PAR}
struct FS_Rect {@{PAR}
    UWORD                           x1,y1,x2,y2;@{PAR}
};@{PAR}
@EndNode

@Node FA_ "FC_Area / FA_"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FA_ -- (00.00) [],@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}
@{PAR}@{lindent 2}
@{fg shine}@{b}NOTES@{ub}@{fg text}@{PAR}@{lindent 4}
@{PAR}@{lindent 2}
@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}
@EndNode
@Node FM_ "FC_Area / FM_"
@{lindent 2}@{PAR}
@{fg shine}@{b}NAME@{ub}@{fg text}@{PAR}@{lindent 4}

@{b}FM_ -- (00.00)@{ub}@{PAR}@{lindent 2}

@{fg shine}@{b}SYNOPSIS@{ub}@{fg text}@{PAR}@{lindent 4}
@{PAR}@{lindent 2}
@{fg shine}@{b}FUNCTION@{ub}@{fg text}@{PAR}@{lindent 4}
@{PAR}@{lindent 2}
@{fg shine}@{b}INPUTS@{ub}@{fg text}@{PAR}@{lindent 4}
@{PAR}@{lindent 2}
@{fg shine}@{b}RESULT@{ub}@{fg text}@{PAR}@{lindent 4}
@{PAR}@{lindent 2}
@{fg shine}@{b}NOTES@{ub}@{fg text}@{PAR}@{lindent 4}
@{PAR}@{lindent 2}
@{fg shine}@{b}SEE ALSO@{ub}@{fg text}@{PAR}@{lindent 4}
@EndNode
