=head1 NAMEMac::.Controls - Macintosh Toolbox Interface to Control Manager=head1 SYNOPSIS=head1 DESCRIPTIONAccess to Inside Macintosh is essential for proper use of these functions.Explanations of terms, processes and procedures are provided there.Any attempt to use these functions without guidance can cause severe errors in your machine, including corruption of data. B<You have been warned.>=cutuse strict;package Mac::Controls;BEGIN {    use Exporter   ();    use DynaLoader ();        use vars qw(@ISA @EXPORT @EXPORT_OK $gControlManager);        @ISA = qw(Exporter DynaLoader);    @EXPORT = qw(        NewControl        GetNewControl        DisposeControl        KillControls        ShowControl        HideControl        DrawControls        Draw1Control        UpdateControls        HiliteControl        TrackControl        DragControl        TestControl        FindControl        MoveControl        SizeControl        SetControlTitle        GetControlTitle        GetControlValue        SetControlValue        GetControlMinimum        SetControlMinimum        GetControlMaximum        SetControlMaximum        GetControlVariant        SetControlReference        GetControlReference            pushButProc        checkBoxProc        radioButProc        scrollBarProc        popupMenuProc        kControlUsesOwningWindowsFontVariant        kControlNoPart        kControlLabelPart        kControlMenuPart        kControlTrianglePart        kControlButtonPart        kControlCheckBoxPart        kControlRadioButtonPart        kControlUpButtonPart        kControlDownButtonPart        kControlPageUpPart        kControlPageDownPart        kControlIndicatorPart        kControlDisabledPart        kControlInactivePart        kControlCheckboxUncheckedValue        kControlCheckboxCheckedValue        kControlCheckboxMixedValue        kControlRadioButtonUncheckedValue        kControlRadioButtonCheckedValue        kControlRadioButtonMixedValue        popupFixedWidth        popupVariableWidth        popupUseAddResMenu        popupUseWFont        popupTitleBold        popupTitleItalic        popupTitleUnderline        popupTitleOutline        popupTitleShadow        popupTitleCondense        popupTitleExtend        popupTitleNoStyle        popupTitleLeftJust        popupTitleCenterJust        popupTitleRightJust        noConstraint        hAxisOnly        vAxisOnly        cFrameColor        cBodyColor        cTextColor        cThumbColor        kNoHiliteControlPart        kInLabelControlPart        kInMenuControlPart        kInTriangleControlPart        kInButtonControlPart        kInCheckBoxControlPart        kInUpButtonControlPart        kInDownButtonControlPart        kInPageUpControlPart        kInPageDownControlPart        kInIndicatorControlPart        kReservedControlPart        kControlInactiveControlPart    );    @EXPORT_OK = qw(        $gControlManager    );}=head2 Constants=over 4=item pushButProc=item checkBoxProc=item radioButProc=item scrollBarProc=item popupMenuProc=item kControlUsesOwningWindowsFontVariantStandard control definition procedures and a variant to make them use the windowfont instead of the system font.=cutsub pushButProc ()                 {          0; }sub checkBoxProc ()                {          1; }sub radioButProc ()                {          2; }sub scrollBarProc ()               {         16; }sub popupMenuProc ()               {       1008; }sub kControlUsesOwningWindowsFontVariant () {     1 << 3; }=item kControlNoPart=item kControlLabelPart=item kControlMenuPart=item kControlTrianglePart=item kControlButtonPart=item kControlCheckBoxPart=item kControlRadioButtonPart=item kControlUpButtonPart=item kControlDownButtonPart=item kControlPageUpPart=item kControlPageDownPart=item kControlIndicatorPart=item kControlDisabledPart=item kControlInactivePartStandard control parts.=cutsub kControlNoPart ()              {          0; }sub kControlLabelPart ()           {          1; }sub kControlMenuPart ()            {          2; }sub kControlTrianglePart ()        {          4; }sub kControlButtonPart ()          {         10; }sub kControlCheckBoxPart ()        {         11; }sub kControlRadioButtonPart ()     {         11; }sub kControlUpButtonPart ()        {         20; }sub kControlDownButtonPart ()      {         21; }sub kControlPageUpPart ()          {         22; }sub kControlPageDownPart ()        {         23; }sub kControlIndicatorPart ()       {        129; }sub kControlDisabledPart ()        {        254; }sub kControlInactivePart ()        {        255; }=item kControlCheckboxUncheckedValue=item kControlCheckboxCheckedValue=item kControlCheckboxMixedValue=item kControlRadioButtonUncheckedValue=item kControlRadioButtonCheckedValue=item kControlRadioButtonMixedValueStandard control values.=cutsub kControlCheckboxUncheckedValue () {          0; }sub kControlCheckboxCheckedValue () {          1; }sub kControlCheckboxMixedValue ()  {          2; }sub kControlRadioButtonUncheckedValue () {          0; }sub kControlRadioButtonCheckedValue () {          1; }sub kControlRadioButtonMixedValue () {          2; }=item popupFixedWidth=item popupVariableWidth=item popupUseAddResMenu=item popupUseWFont=item popupTitleBold=item popupTitleItalic=item popupTitleUnderline=item popupTitleOutline=item popupTitleShadow=item popupTitleCondense=item popupTitleExtend=item popupTitleNoStyle=item popupTitleLeftJust=item popupTitleCenterJust=item popupTitleRightJustPopup menu options, for use in the C<value> parameter of the control creation.=cutsub popupFixedWidth ()             {     1 << 0; }sub popupVariableWidth ()          {     1 << 1; }sub popupUseAddResMenu ()          {     1 << 2; }sub popupUseWFont ()               {     1 << 3; }sub popupTitleBold ()              {     1 << 8; }sub popupTitleItalic ()            {     1 << 9; }sub popupTitleUnderline ()         {    1 << 10; }sub popupTitleOutline ()           {    1 << 11; }sub popupTitleShadow ()            {    1 << 12; }sub popupTitleCondense ()          {    1 << 13; }sub popupTitleExtend ()            {    1 << 14; }sub popupTitleNoStyle ()           {    1 << 15; }sub popupTitleLeftJust ()          { 0x00000000; }sub popupTitleCenterJust ()        { 0x00000001; }sub popupTitleRightJust ()         { 0x000000FF; }=item noConstraint=item hAxisOnly=item vAxisOnlyDrag axis.=cutsub noConstraint ()                {          0; }sub hAxisOnly ()                   {          1; }sub vAxisOnly ()                   {          2; }=item cFrameColor=item cBodyColor=item cTextColor=item cThumbColorColor specification parts for control colors.=cutsub cFrameColor ()                 {          0; }sub cBodyColor ()                  {          1; }sub cTextColor ()                  {          2; }sub cThumbColor ()                 {          3; }=item kNoHiliteControlPart=item kInLabelControlPart=item kInMenuControlPart=item kInTriangleControlPart=item kInButtonControlPart=item kInCheckBoxControlPart=item kInUpButtonControlPart=item kInDownButtonControlPart=item kInPageUpControlPart=item kInPageDownControlPart=item kInIndicatorControlPart=item kReservedControlPart=item kControlInactiveControlPartPart codes for controls.=cutsub kNoHiliteControlPart ()        {          0; }sub kInLabelControlPart ()         {          1; }sub kInMenuControlPart ()          {          2; }sub kInTriangleControlPart ()      {          4; }sub kInButtonControlPart ()        {         10; }sub kInCheckBoxControlPart ()      {         11; }sub kInUpButtonControlPart ()      {         20; }sub kInDownButtonControlPart ()    {         21; }sub kInPageUpControlPart ()        {         22; }sub kInPageDownControlPart ()      {         23; }sub kInIndicatorControlPart ()     {        129; }sub kReservedControlPart ()        {        254; }sub kControlInactiveControlPart () {        255; }=back=cutbootstrap Mac::Controls;=include Controls.xs=head2 Variables=over 4=item $gControlManagerA pane to handle all controls in a window. The default control manager shouldusually do what you want.=back=cut$gControlManager = undef;=head2 MacControlWindow - The Object InterfaceThe C<MacControlWindow> class used to be necessary to manage a window with controls, but is now obsolete.=cutpackage MacControlWindow;BEGIN {    use Carp;    use vars qw(@ISA);        @ISA = qw(MacWindow);}sub new {    carp("MacControlWindow is obsolete, simply use MacWindow") if $^W;        &MacWindow::new;}# Name dropping so new MacControlManager below workspackage MacControlManager;package MacWindow;BEGIN {    use Carp;    use Mac::Windows ();    import Mac::Controls;}=item new_control [CLASS, ] CONTROL=item new_control [CLASS, ] BOUNDS, TITLE, VISIBLE, VAL, MIN, MAX, PROC [, REFCON]Register a new control for the window. In the first form, registers an existing control. In the second form, calls  C<NewControl>.=cutsub new_control {    my($my) = shift @_;    my($type) = @_;    my($class,$control,$popup,$c);        unless ($my->{controlmanager}) {        $my->{controlmanager} = new MacControlManager;        $my->add_pane($my->{controlmanager});    }    if (ref($type)) {        $class = "MacControl"    } else {        $class = shift @_;        $type  = $_[0];    }    if (ref($type) eq "ControlHandle") {        $control = $type;    } else {        $control = NewControl($my->{port}, @_) or croak "NewControl failed";        $popup   = ($_[6] & ~0x0F) == popupMenuProc;    }     $c = $class->new($my, $control);    if ($popup) {        $c->{action} = -1;    }    $my->{controls}->{$$control} = $c;}=head2 MacControlManager - Managing the controls in a windowThe C<MacControlManager> pane handles all controls in a window. This class isimplemented as a flyweight, so only one instance is needed for the entire program.=cutpackage MacControlManager;BEGIN {    use Mac::Pane;    import Mac::Controls;    use vars qw(@ISA);        @ISA = qw(Mac::Pane);}sub new {    my($class) = @_;        $Mac::Controls::gControlManager ||= bless {}, $class;}sub redraw {    my($my,$win) = @_;    UpdateControls($win->window);}sub click {    my($my, $win, $pt) = @_;        my($part,$control) = FindControl($pt, $win->window);    return 0 unless $control;        my($ctrl) = $win->{controls}->{$$control};    return 0 unless $ctrl;    $ctrl->track($win, $pt);        1;}=head2 MacControl - The Object InterfaceThe C<MacControlWindow> class manages a single control in a window.=over 4=cutpackage MacControl;BEGIN {    use Mac::Hooks ();    import Mac::Controls;    use vars qw(@ISA);        @ISA = qw(Mac::Hooks);}=item new WINDOW, CONTROLInitialize a C<MacControl> (which is always created with C<MacWindow::new_control>).=cutsub new {    my($class, $window, $control) = @_;    my(%vars) = (window => $window, control => $control);        bless \%vars, $class;}=item DESTROYDestroys the C<MacControl>.=cutsub DESTROY {    my($my) = @_;    DisposeControl($my->{control});}=item track WINDOW, PTTrack a mouse click in the control.=cutsub track {    defined($_[0]->callhook("track", @_)) and return;    my($my, $window, $pt) = @_;    my($part);    if ($my->{action}) {        $part = TrackControl($my->{control}, $pt, $my->{action});    } else {        $part = TrackControl($my->{control}, $pt);    }    $part && $my->hit($part);}=item hit WINDOW, PARTHandle user action in a part. =cutsub hit {    defined($_[0]->callhook("hit", @_)) and return;}=back=head1 BUGS/LIMITATIONS=head1 FILES=head1 AUTHOR(S)Matthias Ulrich Neeracher <neeri@iis.ee.ethz.ch> =cut1;__END__