home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / MUI / MUI22E.LHA / Amiga-E / Source / PopUp.em < prev   
Encoding:
Text File  |  1994-08-11  |  6.7 KB  |  313 lines

  1. /*
  2. **    Original C Code written by Stefan Stuntz
  3. **
  4. **    Translation into E by Jan Hendrik Schulz
  5. **
  6. ** To compile this source you need the files muimaster.m,
  7. ** mui.m and mui.e that came with this source and Mac2E.
  8. ** (And of course the E Compiler "EC".)
  9. */
  10.  
  11.  
  12. /*
  13. ** Loading the needed MODULEs
  14. */
  15.  
  16. MODULE 'muimaster', 'libraries/mui'
  17. MODULE 'utility/tagitem', 'utility/hooks'
  18. MODULE 'intuition/classes', 'intuition/classusr'
  19. MODULE 'libraries/asl'
  20.  
  21.  
  22. /*
  23. ** defining some CONSTs
  24. */
  25.  
  26. ENUM ER_NON, ER_MUILIB, ER_APP
  27.  
  28.  
  29. /*
  30. ** DEFining the global vars
  31. */
  32.  
  33. DEF setAttrsA=0        /* for the SetAttrsA()-problem */
  34.  
  35.  
  36. /*
  37. ** Now the two hook-functions
  38. */
  39.  
  40. PROC hook_StrObjFunc(pop,str)
  41.  
  42.    DEF x,s,i
  43.  
  44.    get(str,MUIA_String_Contents,{s})
  45.  
  46.    i:=0
  47.    LOOP
  48.       doMethod(pop,[MUIM_List_GetEntry,i,{x}])
  49.  
  50.       IF x=NIL
  51.  
  52.      set(pop,MUIA_List_Active,MUIV_List_Active_Off)
  53.      RETURN MUI_TRUE
  54.  
  55.       ELSEIF StrCmp(x,s,ALL)
  56.  
  57.      set(pop,MUIA_List_Active,i)
  58.      RETURN MUI_TRUE
  59.  
  60.       ENDIF
  61.    INC i
  62.    ENDLOOP
  63. ENDPROC
  64.  
  65.  
  66. PROC hook_ObjStrFunc(pop,str)
  67.  
  68.    DEF x
  69.  
  70.    doMethod(pop,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{x}])
  71.    set(str,MUIA_String_Contents,x)
  72.  
  73. ENDPROC
  74.  
  75.  
  76. /*
  77. ** main PROC with exception handling
  78. */
  79.  
  80. PROC main() HANDLE
  81.  
  82.    DEF popNames
  83.    DEF hookStrObj:hook, hookObjStr:hook
  84.    DEF app,window,pop1,pop2,pop3,pop4,pop5,plist
  85.    DEF signals, result, active, running=TRUE
  86.  
  87. /*
  88. ** creating the hooks
  89. */
  90.  
  91.    installhook(hookStrObj, {hook_StrObjFunc})
  92.    installhook(hookObjStr, {hook_ObjStrFunc})
  93.  
  94. /*
  95. ** creating array for PopUp
  96. */
  97.  
  98.   popNames := [ 'Stefan Becker',
  99.         'Martin Berndt',
  100.         'Georg Heßmann',
  101.         'Martin Horneffer',
  102.         'Martin Huttenloher',
  103.         'Kai Iske',
  104.         'Oliver Kilian',
  105.         'Franke Mariak',
  106.         'Klaus Melchior',
  107.         'Armin Sander',
  108.         'Matthias Scheler',
  109.         'Andreas Schildbach',
  110.         'Wolfgang Schildbach',
  111.         'Christian Scholz',
  112.         'Markus Stipp',
  113.         'Ibrahim Solmaz',
  114.         'Henri Veistera',
  115.         'Alber Weinert',
  116.         NIL ]
  117.  
  118. /*
  119. ** open muimaster.library
  120. */
  121.  
  122.    IF (muimasterbase := OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN))=NIL THEN Raise(ER_MUILIB)
  123.  
  124. /*
  125. ** creating the application
  126. */
  127.  
  128.    app := ApplicationObject,
  129.     MUIA_Application_Title      , 'Popup-Demo',
  130.     MUIA_Application_Version    , '$VER: Popup-Demo 8.37 (03.07.94)',
  131.     MUIA_Application_Copyright  , '©1993, Stefan Stuntz',
  132.     MUIA_Application_Author     , 'Stefan Stuntz',
  133.     MUIA_Application_Description, 'Demostrate popup objects.',
  134.     MUIA_Application_Base       , 'POPUP',
  135.  
  136.     SubWindow, window := WindowObject,
  137.         MUIA_Window_Title, 'Popup Objects',
  138.         MUIA_Window_ID   , "POPP",
  139.         WindowContents, VGroup,
  140.  
  141.         Child, ColGroup(2),
  142.  
  143.             Child, KeyLabel2('File:',"f"),
  144.             Child, pop1 := PopaslObject,
  145.             MUIA_Popstring_String, KeyString(0,256,"f"),
  146.             MUIA_Popstring_Button, PopButton(MUII_PopFile),
  147.             ASLFR_TITLETEXT, 'Please select a file...',
  148.             End,
  149.  
  150.             Child, KeyLabel2('Drawer:',"d"),
  151.             Child, pop2 := PopaslObject,
  152.             MUIA_Popstring_String, KeyString(0,256,"d"),
  153.             MUIA_Popstring_Button, PopButton(MUII_PopDrawer),
  154.             ASLFR_TITLETEXT  , 'Please select a drawer...',
  155.             ASLFR_DRAWERSONLY, MUI_TRUE,
  156.             End,
  157.  
  158.             Child, KeyLabel2('Font:',"o"),
  159.             Child, pop3 := PopaslObject,
  160.             MUIA_Popstring_String, KeyString(0,80,"o"),
  161.             MUIA_Popstring_Button, PopButton(MUII_PopUp),
  162.             MUIA_Popasl_Type , ASL_FONTREQUEST,
  163.             ASLFO_TITLETEXT  , 'Please select a font...',
  164.             End,
  165.  
  166.             Child, KeyLabel2('Fixed Font:',"i"),
  167.             Child, pop4 := PopaslObject,
  168.             MUIA_Popstring_String, KeyString(0,80,"i"),
  169.             MUIA_Popstring_Button, PopButton(MUII_PopUp),
  170.             MUIA_Popasl_Type , ASL_FONTREQUEST,
  171.             ASLFO_TITLETEXT  , 'Please select a fixed font...',
  172.             ASLFO_FIXEDWIDTHONLY, MUI_TRUE,
  173.             End,
  174.  
  175.             Child, KeyLabel2('Thanks To:',"n"),
  176.             Child, pop5 := PopobjectObject,
  177.             MUIA_Popstring_String, KeyString(0,60,"n"),
  178.             MUIA_Popstring_Button, PopButton(MUII_PopUp),
  179.             MUIA_Popobject_StrObjHook, hookStrObj,
  180.             MUIA_Popobject_ObjStrHook, hookObjStr,
  181.             MUIA_Popobject_Object, plist := ListviewObject,
  182.                 MUIA_Listview_List, ListObject,
  183.                 InputListFrame,
  184.                 MUIA_List_SourceArray, popNames,
  185.                 End,
  186.             End,
  187.             End,
  188.         End,
  189.         End,
  190.     End,
  191.     End
  192.  
  193.    IF app=NIL THEN Raise(ER_APP)
  194.  
  195.    doMethod(window,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,
  196.         app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit])
  197.  
  198.    doMethod(window,[MUIM_Window_SetCycleChain,pop1,pop2,pop3,pop4,pop5,NIL])
  199.  
  200.    /* A double click terminates the popping list with a successful return value. */
  201.    doMethod(plist,[MUIM_Notify,MUIA_Listview_DoubleClick,MUI_TRUE,
  202.         pop5,2,MUIM_Popstring_Close,MUI_TRUE])
  203.  
  204. /*
  205. ** Input loop...
  206. */
  207.  
  208.    set(window,MUIA_Window_Open,MUI_TRUE);
  209.  
  210.    WHILE running
  211.  
  212.       result := doMethod(app,[MUIM_Application_Input,{signals}])
  213.    
  214.       SELECT result
  215.  
  216.      CASE MUIV_Application_ReturnID_Quit
  217.  
  218.          get(pop1,MUIA_Popasl_Active,{active})
  219.          IF active=FALSE THEN get(pop2,MUIA_Popasl_Active,{active})
  220.          IF active=FALSE THEN get(pop3,MUIA_Popasl_Active,{active})
  221.          IF active=FALSE THEN get(pop4,MUIA_Popasl_Active,{active})
  222.  
  223.          IF active
  224.         MuI_RequestA(app,window,0,NIL,'OK','Cannot quit now, still\nsome asl popups opened.',NIL)
  225.          ELSE
  226.         running := FALSE
  227.          ENDIF
  228.        ENDSELECT
  229.  
  230.        IF running OR signals THEN Wait(signals)
  231.    ENDWHILE
  232.  
  233.    set(window,MUIA_Window_Open,FALSE)
  234.  
  235. /*
  236. ** Shut down...
  237. */
  238.  
  239.    Raise(ER_NON)
  240.  
  241. EXCEPT
  242.  
  243.   IF app THEN MuI_DisposeObject(app)
  244.   IF muimasterbase THEN CloseLibrary(muimasterbase)
  245.   
  246.   SELECT exception
  247.     CASE ER_MUILIB
  248.       WriteF('Failed to open \s.\n',MUIMASTER_NAME)
  249.       CleanUp(20)
  250.  
  251.     CASE ER_APP
  252.       WriteF('Failed to create application.\n')
  253.       CleanUp(20)
  254.       
  255.   ENDSELECT
  256. ENDPROC 0
  257.  
  258.  
  259. /*
  260. ** doMethod (written by Wouter van Oortmerssen)
  261. */
  262.  
  263. PROC doMethod( obj:PTR TO object, msg:PTR TO msg )
  264.  
  265.     DEF h:PTR TO hook, o:PTR TO object, dispatcher
  266.  
  267.     IF obj
  268.         o := obj-SIZEOF object    /* instance data is to negative offset */
  269.         h := o.class
  270.         dispatcher := h.entry    /* get dispatcher from hook in iclass */
  271.         MOVEA.L h,A0
  272.         MOVEA.L msg,A1
  273.         MOVEA.L obj,A2        /* probably should use CallHookPkt, but the */
  274.         MOVEA.L dispatcher,A3    /*   original code (DoMethodA()) doesn't. */
  275.         JSR (A3)        /* call classDispatcher() */
  276.         MOVE.L D0,o
  277.         RETURN o
  278.     ENDIF
  279. ENDPROC NIL
  280.  
  281.  
  282. /*
  283. ** installhook (written by Wouter van Oortmerssen)
  284. */
  285.  
  286. PROC installhook(hook,func)
  287.     DEF r
  288.     MOVE.L hook,A0
  289.     MOVE.L func,12(A0)
  290.     LEA hookentry(PC),A1
  291.     MOVE.L A1,8(A0)
  292.     MOVE.L A4,16(A0)
  293.     MOVE.L A0,r
  294. ENDPROC r
  295.  
  296. hookentry:
  297.    MOVEM.L D2-D7/A2-A6,-(A7)
  298.    MOVE.L 16(A0),A4
  299. /* MOVE.L A0,-(A7)    I never need a PTR to the hook-structure in my
  300.               hook-functions! therefore I removed this.*/
  301.    MOVE.L A2,-(A7)
  302.    MOVE.L A1,-(A7)
  303.    MOVE.L 12(A0),A0
  304.    JSR (A0)
  305.    LEA 8(A7),A7     /* Changed from LEA 12... to LEA 8... because of
  306.                the removed MOVE above */
  307.    MOVEM.L (A7)+,D2-D7/A2-A6
  308. RTS
  309.  
  310. /*
  311. ** End Of File
  312. */
  313.