      PROGRAM TWIMP9
C        a Fortran wimp program mostly testing
C        interaction with the environment,
C        submitting new tasks etc.
C
C        needs the Wimp, Utilities and Graphics libraries
C
C        set up the desk-top
      CALL SETUP
C        go into the wimp loop (without null calls)
      CALL WPLOOP(1)
C        that's all we can do here
      END
C
      SUBROUTINE PRNTSS
      COMMON/HANDLE/IWH,IWHD,JSTAT,NCSIZ,NNSIZ,NFPOOL,NNOLD
C        get slot sizes
      CALL WPGTSS(NCSIZ,NNSIZ,NFPOOL)
C        print slot sizes
      CALL GRMOVE(16,-120)
      PRINT 101,'Current slot',NCSIZ/1024
      CALL GRMOVE(16,-160)
      PRINT 101,'   Next slot',NNSIZ/1024
      CALL GRMOVE(16,-200)
      PRINT 101,'   Free pool',NFPOOL/1024
      RETURN
  101 FORMAT(A,I8,'Kbytes')
      END
C
      SUBROUTINE SETUP
C          set up windows and icons
      COMMON/HANDLE/IWH,IWHD,JSTAT,NCSIZ,NNSIZ,NFPOOL,NNOLD
C          system common for allowed messages
      CHARACTER*25 COMMND
C          get command line
      CALL GTARGS(COMMND)
C          secondary job has 'next' in its command line
      IF(INDEX(COMMND,'next').GT.0) THEN
        JSTAT = -1
C          initialise the wimp for the auxiliary program
        CALL WPINIT('Auxiliary9')
C          make window
        CALL WPMKNW(800,240,0,0,800,240,0,0,'Auxiliary #9',IWH)
      ELSE
C          initialise current status
        JSTAT = 0
C          initialise the wimp for the master program
        CALL WPINIT('TWIMP9')
C          make window
        CALL WPMKNW(800,320,0,800,800,320,0,0,'Test Wimp #9',IWH)
C          and dialogue window  (no user drawing)
        CALL WPCHWF(4,.TRUE.)
        CALL WPMKNW(200,200,800,200,200,200,0,0,'TW9 dialogue',IWHD)
        CALL WPADTI(IWHD,40,-80,144,48,'Continue',0,IH)
        CALL WPADTI(IWHD,40,-140,80,48,'Quit',0,IH)
C          and icon (notify task without selecting)
        CALL WPCHTF(103)
        CALL WPADTI(IWH,40,-80,144,48,'Continue',0,IHS)
      ENDIF
C          open the window
      CALL WPOPNW(IWH)
      RETURN
      END
C
      SUBROUTINE WQCLIK(IWHAN,ICONH)
C        click over the continue icon
      COMMON/HANDLE/IWH,IWHD,JSTAT,NCSIZ,NNSIZ,NFPOOL,NNOLD
      COMMON/FILE/IDUM(8),ISIZ,LENG,ITYP
      COMMON/FILNAM/FLNAME
      CHARACTER*256 FLNAME
C           check if in dialogue box window for shutdown
      IF(IWHAN.EQ.IWHD) THEN
C           continue with shut down sequence if 'Quit' clicked
        IF(ICONH.EQ.1) CALL WPPREQ
        IF(ICONH.EQ.0) CALL WPCLSW(IWHD)
        RETURN
      ENDIF
C           stop job it it is secondary one, but let WQCLSW send message
      IF(JSTAT.LT.0) CALL WQCLSW(IWHAN)
C           check for 'Continue' icon in main window
      IF(IWHAN.NE.IWH .OR. ICONH.NE.0) RETURN
      IF(JSTAT.EQ.0) THEN
C            save Next slot size
        NNOLD = NNSIZ
C            set next to current size
        CALL WPSTNS(NCSIZ)
      ENDIF
      IF(JSTAT.EQ.1) THEN
        CALL WPTASK('Run Twimp9 next')
C            restore next slot size
        CALL WPSTNS(NNOLD)
      ENDIF
      IF(JSTAT.EQ.4) THEN
C           send file to editor if text file
        IF(ITYP.EQ.?I0FFF) CALL WPEDIT(FLNAME(1:LENG))
C           send file to !Draw if draw file
        IF(ITYP.EQ.?I0AFF) CALL WPDRAW(FLNAME(1:LENG))
C           send file to !Paint if sprite file
        IF(ITYP.EQ.?I0FF9) CALL WPAINT(FLNAME(1:LENG))
C          remove 'continue' icon because we have finished
        CALL WPDELI(IWHAN,ICONH)
      ENDIF
C            force redraw main window
      CALL WPPLOT(IWH,0,-320,800,-110)
C            increment status
      IF(JSTAT.NE.2) JSTAT = JSTAT + 1
      RETURN
      END
C
      SUBROUTINE WQCLSW(IWHAN)
C        when we're asked to close the window,
C        just shut down the job instead
      COMMON/HANDLE/IWH,IWHD,JSTAT,NCSIZ,NNSIZ,NFPOOL,NNOLD
      IF(JSTAT.LT.0) CALL WPMESG(-1,0,0,500,'Auxiliary program dies')
      CALL WPQUIT
      RETURN
      END
C
      SUBROUTINE WQPLOT
C        here we just print out messages.
      COMMON/HANDLE/IWH,IWHD,JSTAT,NCSIZ,NNSIZ,NFPOOL,NNOLD
      COMMON/FILE/IDUM(8),ISIZ,LENG,ITYP
      COMMON/FILNAM/FLNAME
      CHARACTER*256 FLNAME
      COMMON/MESAGE/TEXT
      CHARACTER*22 TEXT
C        kill if secondary job
      IF(JSTAT.LT.0) THEN
        CALL WPTEXT(48,-60,'this is a secondary task...')
        CALL WPSETC(0,11)
        CALL WPTEXT(48,-120,'please close this window now!')
        CALL WPSETC(0,7)
        CALL WPTEXT(48,-180,'it will send a message to TWimp9')
      ENDIF
C        get and print slot sizes
      IF(JSTAT.EQ.0) THEN
        CALL PRNTSS
        CALL WPTEXT(48,-280,'make next slot equal current slot')
      ENDIF
      IF(JSTAT.EQ.1) THEN
        CALL PRNTSS
        CALL WPTEXT(48,-240,'start another TWimp9 task')
        CALL WPTEXT(48,-280,'please close its window immediately')
      ENDIF
      IF(JSTAT.EQ.3) THEN
          CALL WPTEXT(16,-160,'received message "'//TEXT//'"')
          CALL WPTEXT(16,-220,'please drag a file to this window')
      ENDIF
      IF(JSTAT.EQ.4) THEN
        CALL WPTEXT(0,-120,'you dragged file:')
        CALL WPTEXT(0,-160,FLNAME(1:LENG))
        CALL GRMOVE(0,-200)
        PRINT 101,ISIZ,ITYP
  101   FORMAT(' size:',I6,', file type:',Z4)
        IF(ITYP.EQ.?I0FFF) 
     +    CALL WPTEXT(0,-260,'try to send this text file to an editor')
        IF(ITYP.EQ.?I0AFF) 
     +    CALL WPTEXT(0,-260,'try to send this draw file to !Draw')
        IF(ITYP.EQ.?I0FF9) 
     +    CALL WPTEXT(0,-260,'try to send this sprite file to !Paint')
      ENDIF
      IF(JSTAT.EQ.5) THEN
        CALL WPTEXT(16,-120,'All finished')
        CALL WPTEXT
     +     (16,-180,'Either click on the close icon to stop task,')
        CALL WPTEXT
     +     (16,-220,'or try to "quit" the job from the task manager,')
        CALL WPTEXT
     +     (16,-260,'or try a shut-down (CTRL/F12).')
      ENDIF
      RETURN
      END
C
      SUBROUTINE WQMESG(MTYPE,MFROM,MREF,MREP,MACT,MESG)
C          received message
      CHARACTER *(*) MESG
      COMMON/HANDLE/IWH,IWHD,JSTAT,NCSIZ,NNSIZ,NFPOOL,NNOLD
      COMMON/MESAGE/TEXT
      CHARACTER*22 TEXT
C           see if it is from auxiliary job
      IF(MACT.EQ.500) THEN
C           MESG is always multiple of 4 long, (NULL filled)
C           get true length of text 
        ILAST = INDEX(MESG,CHAR(0)) - 1
        IF(ILAST.LT.0) ILAST = LEN(MESG)
C           save message in COMMON/MESAGE/
        TEXT = MESG(1:ILAST)
C            force redraw main window
        CALL WPPLOT(IWH,0,-320,800,-110)
        JSTAT = JSTAT + 1
      ENDIF  
      RETURN
      END
C
      SUBROUTINE WQPREQ(IOK)
      LOGICAL IOK
      COMMON/HANDLE/IWH,IWHD,JSTAT,NCSIZ,NNSIZ,NFPOOL,NNOLD
C            prequit, open dialogue window
      CALL WPOPNW(IWHD)
      CALL BEEP
C            interrupt shut-down
      IOK = .FALSE.
      RETURN
      END
C
      SUBROUTINE WQQUIT
C         called when about to shut us down
C         can do nothing except save known files, and send a warning message
      CALL WPERR (1,'TWimp9 is about to die. '//
     +    'There is nothing more we can do!',IDUM)
      RETURN
      END
C
      SUBROUTINE WQRFIL(IWHAN,ICONH,ISIZE,ITYPE,SFILE)
      CHARACTER*(*)SFILE
      COMMON/HANDLE/IWH,IWHD,JSTAT,NCSIZ,NNSIZ,NFPOOL,NNOLD
      COMMON/FILE/IDUM(8),ISIZ,LENG,ITYP
      COMMON/FILNAM/FLNAME
      CHARACTER*256 FLNAME
      IF(JSTAT.EQ.3) THEN
        ISIZ = ISIZE
        ITYP = ITYPE
        FLNAME = SFILE
        LENG = LEN(SFILE)
        CALL WPPLOT(IWH,0,-320,800,-110)
        JSTAT = 4
      ENDIF
      RETURN
      END
