home *** CD-ROM | disk | FTP | other *** search
/ Falcon 030 Power 2 / F030_POWER2.iso / ST_STE / MAGS / ICTARI03.ARJ / ictari.03 / GFA / GFA_CODE / CLOCK.LST < prev    next >
File List  |  1993-05-10  |  7KB  |  275 lines

  1. ' CLOCK v3
  2. ' A multi tasking clock accessory with switching between analog and digital
  3. ' clocks when the FULLER is clicked. If accessory selected again when already
  4. ' open a time setting dialog will appear.
  5. '
  6. ' Requires CLOCK3.RSC to be present in program directory
  7. '
  8. ' (c) Ian Rae 22/08/92 - commented 5/5/93 :-)
  9. '
  10. $m40528                 ! Random number - seems to work!
  11. ap_id&=APPL_INIT()
  12. @init
  13. @main
  14. '
  15. PROCEDURE init
  16.   IF XBIOS(4)<>2
  17.     ALERT 1," | High resolution only... | Sorry about that...",1,"Hmmm",a%
  18.     DO
  19.       ~EVNT_TIMER(-1)
  20.     LOOP
  21.   ENDIF
  22.   IF RSRC_LOAD("clock3.rsc")=0
  23.     ALERT 1," Can't find CLOCK3.RSC... | | Take Yourself outside|   and have a word!",1," OK ",a%
  24.     DO
  25.       ~EVNT_TIMER(-1)
  26.     LOOP
  27.   ENDIF
  28.   ~RSRC_GADDR(0,0,adr%)
  29.   '
  30.   IF ap_id&<>0
  31.     me_id&=MENU_REGISTER(ap_id&,"  MT Clock")
  32.   ENDIF
  33.   open!=FALSE
  34.   analog!=TRUE
  35. RETURN
  36. '
  37. PROCEDURE main
  38.   IF ap_id&<>0
  39.     DO                                  ! We are and accessory
  40.       evnt%=EVNT_MULTI(&X110000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000)
  41.       IF BTST(evnt%,5) AND open!        ! A timer event, update clock
  42.         @dotime(FALSE)
  43.       ELSE
  44.         message                         ! a message event, process it
  45.       ENDIF
  46.     LOOP
  47.   ELSE
  48.     TITLEW #1,LEFT$(TIME$,5)            ! Not an accessory so open
  49.     OPENW #1,10,50,82,100,&X1111        ! a window and use ON MENU
  50.     handle&=W_HAND(#1)                  ! to handle it
  51.     ON MENU MESSAGE GOSUB message
  52.     EVERY 200 GOSUB dotime
  53.     exit!=FALSE
  54.     REPEAT
  55.       ON MENU
  56.     UNTIL exit!
  57.   ENDIF
  58. RETURN
  59. '
  60. PROCEDURE message
  61.   x&=MENU(5)
  62.   y&=MENU(6)
  63.   w&=MENU(7)
  64.   h&=MENU(8)
  65.   '
  66.   SELECT MENU(1)
  67.   CASE 21               ! topped
  68.     TOPW #1
  69.   CASE 23               ! Fulled ( switch between analog and digital
  70.     analog!=NOT analog!
  71.     ~WIND_GET(handle&,5,wx&,wy&,ww&,wh&)
  72.     IF analog!
  73.       ~WIND_SET(handle&,5,wx&,wy&,82,100)
  74.     ELSE
  75.       ~WIND_SET(handle&,5,wx&,wy&,82,20)
  76.     ENDIF
  77.   CASE 20               !
  78.     @dotime(TRUE)
  79.   CASE 22,41            ! Closed clicked or acc close recieved
  80.     CLOSEW #1
  81.     exit!=TRUE
  82.     open!=FALSE
  83.   CASE 28               ! Moved
  84.     IF analog!
  85.       ~WIND_SET(handle&,5,x&,y&,82,100)
  86.     ELSE
  87.       ~WIND_SET(handle&,5,x&,y&,82,20)
  88.     ENDIF
  89.   CASE 40               ! Acc open
  90.     IF open!            ! If already open then display set time dialog
  91.       timeset
  92.     ELSE
  93.       open!=TRUE
  94.       TITLEW #1,LEFT$(TIME$,5)  ! Display time in title bar
  95.       IF analog!
  96.         OPENW #1,10,50,82,100,&X1111
  97.       ELSE
  98.         OPENW #1,10,50,82,20,&X1111
  99.       ENDIF
  100.       handle&=W_HAND(#1)
  101.     ENDIF
  102.   ENDSELECT
  103. RETURN
  104. '
  105. PROCEDURE dotime(redraw!)       ! redraw TRUE if we need to redraw
  106.   hours&=VAL(LEFT$(TIME$,2))    ! FALSE if we just updating time
  107.   mins&=VAL(MID$(TIME$,4,2))
  108.   IF hours&>12
  109.     hours&=hours&-12
  110.   ENDIF
  111.   IF (mins&<>oldm&) OR redraw!
  112.     TITLEW #1,LEFT$(TIME$,5)
  113.     IF analog!
  114.       hdeg=(360*hours&)/12+(mins&*0.5)
  115.       mdeg=(360*mins&)/60
  116.       ~WIND_UPDATE(1)                           ! Grab mouse control
  117.       ~WIND_GET(handle&,11,x&,y&,w&,h&)
  118.       ~WIND_GET(handle&,4,wx&,wy&,ww&,wh&)
  119.       REPEAT
  120.         IF RC_INTERSECT(wx&,wy&,ww&,wh&,x&,y&,w&,h&)    ! get clipping
  121.           CLIP x&,y&,w&,h& OFFSET wx&,wy&               ! rectangles
  122.           @drawclock(hdeg,mdeg)                         ! draw it all
  123.           CLIP 0,0,WORK_OUT(0),WORK_OUT(1)
  124.         ENDIF
  125.         ~WIND_GET(handle&,12,x&,y&,w&,h&)
  126.       UNTIL w&=0 AND h&=0
  127.       ~WIND_UPDATE(0)                           ! release mouse control
  128.     ENDIF
  129.   ENDIF
  130.   oldm&=mins&
  131. RETURN
  132. '
  133. PROCEDURE drawclock(hdeg,mdeg)  ! Can't be bothered with trig and stuff
  134.   DEFFILL 0,0                   ! so I'll cheat and use the logo type stuff
  135.   PBOX 0,0,82,80
  136.   CIRCLE 40,40,30
  137.   DEFTEXT 1,0,0,6
  138.   TEXT 32,8,"12"
  139.   TEXT 37,78,"6"
  140.   TEXT 1,43,"9"
  141.   TEXT 71,43,"3"
  142.   SETDRAW 40,40,hdeg
  143.   DRAW "PU FD 20 PD"
  144.   x=DRAW(0)
  145.   y=DRAW(1)
  146.   DRAW "RT 170 FD 10 DA 40,40"
  147.   SETDRAW x,y,hdeg
  148.   DRAW "LT 170 FD 10 DA 40,40"
  149.   SETDRAW 40,40,mdeg
  150.   DRAW "PU FD 28 PD"
  151.   x=DRAW(0)
  152.   y=DRAW(1)
  153.   DRAW "RT 175 FD 15 DA 40,40"
  154.   SETDRAW x,y,mdeg
  155.   DRAW "LT 175 FD 15 DA 40,40"
  156. RETURN
  157. '
  158. PROCEDURE timeset       ! open up the timeset dialog, this proc is MESSY
  159.   exit!=FALSE
  160.   ~FORM_CENTER(adr%,x&,y&,w&,h&)
  161.   ~FORM_DIAL(0,x&,y&,w&,h&,x&,y&,w&,h&) ! prepare draw area
  162.   '
  163.   ' set up initial time...
  164.   '
  165.   h1&=VAL(LEFT$(TIME$,1))
  166.   h2&=VAL(MID$(TIME$,2,1))
  167.   m1&=VAL(MID$(TIME$,4,1))
  168.   m2&=VAL(MID$(TIME$,5,1))
  169.   t$="        "
  170.   '
  171.   CHAR{{OB_SPEC(adr%,13)}}=STR$(h1&)
  172.   CHAR{{OB_SPEC(adr%,14)}}=STR$(h2&)
  173.   CHAR{{OB_SPEC(adr%,15)}}=STR$(m1&)
  174.   CHAR{{OB_SPEC(adr%,16)}}=STR$(m2&)
  175.   ~OBJC_DRAW(adr%,0,3,x&,y&,w&,h&)
  176.   '
  177.   REPEAT
  178.     but%=FORM_DO(adr%,0)
  179.     SELECT but%
  180.       '
  181.     CASE 5                        !h1down
  182.       DEC h1&
  183.       IF h1&<0
  184.         h1&=2
  185.       ENDIF
  186.       CHAR{{OB_SPEC(adr%,13)}}=STR$(h1&)
  187.       ~OBJC_DRAW(adr%,13,0,x&,y&,w&,h&)
  188.       PAUSE 5
  189.       '
  190.     CASE 6                        !h2down
  191.       DEC h2&
  192.       IF h2&<0
  193.         h2&=9
  194.       ENDIF
  195.       CHAR{{OB_SPEC(adr%,14)}}=STR$(h2&)
  196.       ~OBJC_DRAW(adr%,14,0,x&,y&,w&,h&)
  197.       PAUSE 5
  198.       '
  199.     CASE 7                        !m1down
  200.       DEC m1&
  201.       IF m1&<0
  202.         m1&=5
  203.       ENDIF
  204.       CHAR{{OB_SPEC(adr%,15)}}=STR$(m1&)
  205.       ~OBJC_DRAW(adr%,15,0,x&,y&,w&,h&)
  206.       PAUSE 5
  207.       '
  208.     CASE 8                        !m2 down
  209.       DEC m2&
  210.       IF m2&<0
  211.         m2&=9
  212.       ENDIF
  213.       CHAR{{OB_SPEC(adr%,16)}}=STR$(m2&)
  214.       ~OBJC_DRAW(adr%,16,0,x&,y&,w&,h&)
  215.       PAUSE 5
  216.       '
  217.     CASE 9                        ! h1 up
  218.       INC h1&
  219.       IF h1&>2
  220.         h1&=0
  221.       ENDIF
  222.       IF h1&>1 AND h2&>3
  223.         h1&=0
  224.       ENDIF
  225.       CHAR{{OB_SPEC(adr%,13)}}=STR$(h1&)
  226.       ~OBJC_DRAW(adr%,13,0,x&,y&,w&,h&)
  227.       PAUSE 5
  228.       '
  229.     CASE 10                       ! h2 up
  230.       INC h2&
  231.       IF h2&>9
  232.         h2&=0
  233.       ENDIF
  234.       CHAR{{OB_SPEC(adr%,14)}}=STR$(h2&)
  235.       ~OBJC_DRAW(adr%,14,0,x&,y&,w&,h&)
  236.       PAUSE 5
  237.       '
  238.     CASE 11                       ! m1 up
  239.       INC m1&
  240.       IF m1&>5
  241.         m1&=0
  242.       ENDIF
  243.       CHAR{{OB_SPEC(adr%,15)}}=STR$(m1&)
  244.       ~OBJC_DRAW(adr%,15,0,x&,y&,w&,h&)
  245.       PAUSE 5
  246.       '
  247.     CASE 12                       ! m2 up
  248.       INC m2&
  249.       IF m2&>9
  250.         m2&=0
  251.       ENDIF
  252.       CHAR{{OB_SPEC(adr%,16)}}=STR$(m2&)
  253.       ~OBJC_DRAW(adr%,16,0,x&,y&,w&,h&)
  254.       PAUSE 5
  255.       '
  256.     CASE 18                         ! OK
  257.       set!=TRUE
  258.       exit!=TRUE
  259.       '
  260.     CASE 19                         ! Cancel
  261.       set!=FALSE
  262.       exit!=TRUE
  263.     ENDSELECT
  264.   UNTIL exit!
  265.   '
  266.   ~FORM_DIAL(3,x&,y&,w&,h&,x&,y&,w&,h&) ! redraw area...
  267.   '
  268.   OB_STATE(adr%,18)=0               ! Deselect OK and Cancel buttons
  269.   OB_STATE(adr%,19)=0
  270.   IF set!
  271.     t$=STR$(h1&)+STR$(h2&)+":"+STR$(m1&)+STR$(m2&)+":00"    ! Set the time !
  272.     TIME$=t$
  273.   ENDIF
  274. RETURN
  275.