home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / grafica / picfx / e-source / picfx.e < prev    next >
Encoding:
Text File  |  2000-06-02  |  136.8 KB  |  3,274 lines

  1. OPT LARGE
  2. OPT PREPROCESS,OSVERSION=39
  3.  
  4. #define PlaneFuncObject NewObjectA(cl_planefunc.mcc_class,NIL,[TAG_IGNORE,0
  5. #define ProjectListObject NewObjectA(cl_projectlist.mcc_class,NIL,[TAG_IGNORE,0
  6. #define uSliderObject NewObjectA(cl_uslider.mcc_class,NIL,[TAG_IGNORE,0
  7. #define SizeTextObject NewObjectA(cl_sizetxt.mcc_class,NIL,[TAG_IGNORE,0
  8. #define ProjectholdObject NewObjectA(cl_projecthold.mcc_class,NIL,[TAG_IGNORE,0
  9. #define MyApplicationObject NewObjectA(cl_myapp.mcc_class,NIL,[TAG_IGNORE,0
  10. /*****/
  11. #define VarListObject NewObjectA(varlist_mcc,NIL,[MUIA_List_Format,'MIW=50 BAR,',\
  12.                                                   MUIA_List_ConstructHook,vl_constructhook,\
  13.                                                   MUIA_List_DestructHook,vl_destructhook,\
  14.                                                   MUIA_List_DisplayHook,vl_displayhook
  15.  
  16. #define label(t) TextObject,MUIA_Text_Contents,t,MUIA_Text_SetMax,MUI_TRUE,End
  17.  
  18. #define modt(val) val AND $FF
  19. #define pixel(raw,w,x,y) raw[x+(y*w)]
  20.  
  21. #define PICVERSION 'PicFX 1.5'
  22. #define FULLVERSION '$VER: PicFX 1.5 (02/06/00)'
  23.  
  24. ->MODULE 'afc/super_picture','afc/trueBitmap'
  25. MODULE       'amigalib/boopsi','amigalib/lists',
  26.        'asl',
  27.        'datatypes','datatypes/datatypes','datatypes/pictureclass','datatypes/pictureclassext','datatypes/datatypesclass',
  28.        'devices/timer',
  29.        'dos/dos','dos/dosextens','dos/dostags',
  30.        'exec/io','exec/lists','exec/memory','exec/nodes','exec/ports','exec/semaphores','exec/tasks',
  31.        'fork',
  32.        'graphics/gfx','graphics/rastport','graphics/view','guigfx','guigfx/guigfx',
  33.        'iffparse','libraries/iffparse',
  34.        'intuition/classes','intuition/classusr','intuition/intuition','intuition/screens',
  35.        'libraries/asl','libraries/cybergraphics','libraries/gadtools','libraries/iffparse','libraries/mui',
  36.            'libraries/muip',
  37.        'mui/lamp_mcc','mui/muicustomclass',
  38.        'muimaster',
  39.        '*varlist',
  40.        'utility','utility/tagitem','utility/hooks','tools/installhook',
  41.        '*parser','tools/longreal',
  42.        'tools/ilbmdefs',
  43.        '*picFXlocale',
  44.        'render/render',
  45.        '*classes'
  46.  
  47. ->MODULE 'tools/debug' ->kputfmt(formatstring,[values])
  48.  
  49. CONST TICKS_PER_MINUTE = TICKS_PER_SECOND*60
  50.  
  51. DEF app,
  52.     messages_win,messages_lst,
  53.     about_win,abouttext,
  54.     prefs_win, /*Preference button*/
  55.         mainpri_sld,renderpri_sld,renderupdate_sld,mui_btn,currpri_sld,
  56.         recompile_chk,
  57.         close_cyc,showmess_chk,dither_cyc,dither_sld,savep_btn,
  58.     settings_win,colour_txt,
  59.     menus, -> First a newmenu object and later an mui object :-)
  60.     opened_lsv,opened_lst,
  61.     new_btn,prefs_btn,var_btn,
  62.     varlist_win,varlist_lsv,varlist_lst,varname_str,varval_str,varadd_btn,vardel_btn,
  63.     sgroup,     /*settings gadgets*/ -> sgroup is the group with the gadgets,
  64.     egroup,                          -> and egroup, when non NIL, is a stupid text object replacing that group
  65.     stat_grp,                        -> this the group that goes below ?group...
  66.     name_str,type_reg,
  67.         path_str,size_rad,size_txt, -> for the DTPic type
  68.         r_lbl,g_lbl,b_lbl,
  69.         red_str,green_str,blue_str,outr_cyc,outg_cyc,outb_cyc, -> for the Function type
  70.         red_fail,green_fail,blue_fail,
  71.     width_str,height_str,
  72.             /*action buttons*/
  73.     draw_btn,savepic_btn,savefunc_btn,abort_btn,showme_cyc,close_btn,
  74.     loadfunc_btn,clear_btn,
  75.             /*state area*/
  76.     lamp_lmp,state_txt,state_gau,
  77.  
  78.     ftype_registertitles,size_radiolabels,showme_cyclelabels,
  79.             /*animation stuff*/
  80.     animate_win,parameter_str,frames_str,
  81.         render_lst,render_lsv,
  82.         insertP_btn,delP_btn,
  83.         saveP,savename_str,
  84.         doAnim_btn,
  85.         animation_helptext,
  86.         animstatus_txt,
  87.     sigs=0,
  88.     lastid=0,/* lastid is a global variable incremented everytime a project is opened.
  89.                 absolutely no risk to have several projects with same ID*/
  90.     screentitle,
  91.     title[15]:STRING,counter=1, -> number of messages
  92.     messages[15]:ARRAY OF LONG,
  93.     picdir:PTR TO CHAR,funcdir:PTR TO CHAR,
  94.  
  95.     cat:PTR TO catalog_picFX,
  96.  
  97.     rp=-2,cp=-1,        -> Priorities
  98.     rupd=10,wclose,dithm,ditha,     -> Some preference variables..
  99.  
  100. ->    psema:ss,           -> Semaphore for preferences  (!!)
  101.  
  102.     currid=-1,quiet=FALSE     -> currid contains the id of the currently selected project. Quiet controls attributes refreshing.
  103.  
  104. DEF nodraw,friend=NIL
  105.  
  106. ENUM MENU_G_About=1,MENU_G_AboutMui, -> Not very oo-style but compact :-) These are the IDs of the menus.
  107.      MENU_G_Prefs,MENU_G_PrefsMui,
  108.      MENU_G_New,MENU_G_Animation,
  109.      MENU_G_Varlist,
  110.      MENU_G_Hide,
  111.  
  112.      MENU_Project,
  113.      MENU_P_Render,MENU_P_Abort,
  114.      MENU_P_Visible,MENU_P_Close,
  115.      MENU_P_SaveP,MENU_P_Clear,
  116.      MENU_P_LoadF,MENU_P_SaveF
  117.  
  118. DEF pl_displayer:PTR TO hook
  119.  
  120. DEF cl_planefunc:PTR TO mui_customclass
  121. DEF cl_projectlist:PTR TO mui_customclass
  122. DEF cl_uslider:PTR TO mui_customclass
  123. DEF cl_sizetxt:PTR TO mui_customclass
  124. DEF cl_projecthold:PTR TO mui_customclass
  125. DEF cl_myapp:PTR TO mui_customclass
  126.  
  127. ENUM STC_STARTUP=-2,
  128.     STC_SHUTDOWN,      /*messages to the subtask*/
  129.     STC_START,
  130.     STC_PAUSE,
  131.     STC_RESTART,
  132.     STC_CHANGEDONE
  133.  
  134. /***************************************************************
  135. **            Custom PlaneFunc private Class                  **
  136. ****************************************************************
  137. This class is responsible for rendering the functions. It uses a
  138. subtask to avoid the main program to be freezed during rendering
  139. ***************************************************************/
  140.  
  141. OBJECT empty_data -> class(es) that doesn't use any data
  142.     nothing
  143. ENDOBJECT
  144.  
  145. OBJECT projectList_data
  146. /* Stuff for timer (title bar) */
  147. /* Everything is copied from mui demo "inputhandler" Thanks for its authors ;-) */
  148.     port:PTR TO mp
  149.     req:PTR TO timerequest
  150.     ihnode:mui_inputhandlernode_timer
  151. ENDOBJECT
  152.  
  153. OBJECT uslider_data
  154.     buffer:PTR TO CHAR
  155.     stringify
  156. ENDOBJECT
  157.  
  158. OBJECT args_compare -> MUIM_uSlider_Bigger/Smaller
  159.     id
  160.     than
  161. ENDOBJECT
  162.  
  163. OBJECT args_abort -> Used by MUIM_PlaneFunc_Abort
  164.     id
  165.     reason
  166. ENDOBJECT
  167.  
  168. OBJECT args_stp -> MUIM_PlaneFunc_SetTaskPri
  169.     id
  170.     value
  171. ENDOBJECT
  172.  
  173. OBJECT args_savepic
  174.     id
  175.     filegiven
  176.     filename
  177. ENDOBJECT
  178.  
  179. OBJECT args_notify -> Used by MUIM_ProjectList_Notify
  180.     id
  181.     gadget -> MUIV_ProjectList_Notify_<something>
  182.     value
  183. ENDOBJECT
  184.  
  185. OBJECT args_showme -> Used by MUIM_ProjectList_ShowMe
  186.     id
  187.     value
  188. ENDOBJECT
  189.  
  190. OBJECT args_forward -> Used by MUIM_ProjectList_Forward
  191.     id
  192.     cnt
  193.     method
  194.     args[10]:ARRAY OF LONG -> We've got to give a number, so I put 10 :-)
  195. ENDOBJECT
  196.  
  197. OBJECT args_prefs -> MUIM_ProjectList_Prefs
  198.     id
  199.     var:PTR TO LONG
  200.     value
  201. ENDOBJECT
  202.  
  203. OBJECT args_refresh -> Used by MUIM_ProjectList_Refresh
  204.     id
  205.     ostate -> TRUE if only the 'state' field must be refreshed.
  206. ENDOBJECT
  207.  
  208. OBJECT args_setpri -> MUIM_ProjectList_SetPri
  209.     id
  210.     task -> MUIV_ProjectList_SetPri_*
  211.     value
  212. ENDOBJECT
  213.  
  214. OBJECT args_iil
  215.     id
  216.     list
  217. ENDOBJECT
  218.  
  219. OBJECT projecthold_data
  220.     current:PTR TO planeFunc_data
  221.     animating -> this is TRUE when animation is being rendered
  222. /*other animation data. Available only during render!*/
  223.     line:LONG             -> This is the line of the list that is being worked on
  224.     varname:PTR TO CHAR   -> time parameter name
  225.     frameCnt:LONG         -> maximum value (float!)
  226.     filenamebase:PTR TO CHAR -> for the saved pictures
  227. ENDOBJECT
  228.  
  229. /*--------------*/
  230. /* A little tool to help reading IFF chunks from any version */
  231. OBJECT chunkSeeker
  232.     data:PTR TO LONG
  233.     size
  234.     shift -> this how far we are in data...
  235. ENDOBJECT
  236.  
  237. PROC create(sp:PTR TO storedproperty) OF chunkSeeker
  238.     self.data:=sp.data
  239.     self.size:=sp.size
  240. ENDPROC
  241.  
  242. PROC read(object,attribute) OF chunkSeeker
  243. DEF dt:PTR TO LONG
  244.     IF self.shift > self.size THEN RETURN
  245.  
  246.     dt:=self.data+self.shift
  247.     set(object,attribute,dt[])
  248.     self.shift:=self.shift+4
  249. ENDPROC
  250.  
  251. PROC write(object,attribute) OF chunkSeeker
  252. DEF dt:PTR TO LONG
  253.     IF self.shift > self.size THEN RETURN
  254.     dt:=self.data
  255.     get(object,attribute,dt+self.shift)
  256.     self.shift:=self.shift+4
  257. ENDPROC
  258. /*--------------*/
  259. PROC planeFunc_dispatcher(cl:PTR TO iclass,obj,msg:PTR TO msg)
  260. DEF methodid
  261.     methodid:=msg.methodid
  262.     SELECT methodid
  263.     CASE OM_NEW;        RETURN planeFunc_new(cl,obj,msg)
  264.     CASE OM_DISPOSE;    RETURN planeFunc_dispose(cl,obj,msg)
  265.     CASE OM_GET;        RETURN planeFunc_get(cl,obj,msg)   /*gets an attribute*/
  266.     CASE OM_SET;        RETURN planeFunc_set(cl,obj,msg)   /*sets an attribute*/
  267.     CASE MUIM_AskMinMax;RETURN planeFunc_askminmax(cl,obj,msg)
  268.     CASE MUIM_Cleanup;  RETURN planeFunc_cleanup(cl,obj,msg)
  269.     CASE MUIM_Draw;     RETURN planeFunc_draw(cl,obj,msg)  /*mui (or the subtask) asked to redraw*/
  270.     CASE MUIM_HandleInput;RETURN planeFunc_handleinput(cl,obj,msg)
  271.     CASE MUIM_Setup;    RETURN planeFunc_setup(cl,obj,msg)
  272.  
  273.     CASE MUIM_PlaneFunc_Abort;      RETURN planeFunc_abort(cl,obj,msg)      /*public methods...*/
  274.     CASE MUIM_PlaneFunc_Clear;      RETURN planeFunc_clear(cl,obj/*,msg*/)
  275.     CASE MUIM_PlaneFunc_Close;      RETURN planeFunc_close(cl,obj/*,msg*/)
  276.     CASE MUIM_PlaneFunc_DrawHandle; RETURN planeFunc_drawhandle(cl,obj,msg)
  277.     CASE MUIM_PlaneFunc_Lamps;      RETURN planeFunc_lamps(cl,obj/*,msg*/)
  278.     CASE MUIM_PlaneFunc_LoadFunc;   RETURN planeFunc_loadfunc(cl,obj/*,msg*/)
  279.     CASE MUIM_PlaneFunc_Render;     RETURN planeFunc_render(cl,obj/*,msg*/)
  280.     CASE MUIM_PlaneFunc_SaveFunc;   RETURN planeFunc_savefunc(cl,obj/*,msg*/)
  281.     CASE MUIM_PlaneFunc_SavePic;    RETURN planeFunc_savepic(cl,obj,msg)
  282.     CASE MUIM_PlaneFunc_SetSize;    RETURN planeFunc_setsize(cl,obj/*,msg*/)
  283.     CASE MUIM_PlaneFunc_SetTaskPri; RETURN planeFunc_settaskpri(cl,obj,msg)
  284.     CASE MUIM_PlaneFunc_Update;     RETURN planeFunc_update(cl,obj/*,msg*/)
  285.     ENDSELECT
  286. ENDPROC doSuperMethodA(cl,obj,msg)
  287.  
  288. PROC planeFunc_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  289. DEF data:PTR TO planeFunc_data
  290.  
  291.     IF (obj:=doSuperMethodA(cl,obj,msg)) = NIL THEN RETURN NIL
  292.  
  293.     data:=INST_DATA(cl,obj)
  294.     data.self:=obj
  295.  
  296.     data.app:=TRUE
  297.     InitSemaphore(data.sema)
  298.  
  299.     data.projectid:=lastid++
  300.     data.failure:=$000
  301.     data.rstr:=String(256)
  302.     data.gstr:=String(256)
  303.     data.bstr:=String(256)
  304.     StrCopy(data.rstr,'x')
  305.     StrCopy(data.gstr,'y')
  306.     StrCopy(data.bstr,'(x+y)/2')
  307.     data.outputr:=OUT_Integer
  308.     data.outputg:=OUT_Integer
  309.     data.outputb:=OUT_Integer
  310.  
  311.     NEW data.rfunc.create(data.outputr,data.rstr)
  312.     NEW data.gfunc.create(data.outputg,data.gstr)
  313.     NEW data.bfunc.create(data.outputb,data.bstr)
  314.     data.imagefile:=String(512)
  315.     data.imagefilename:=String(512)
  316.  
  317.     data.height:=256
  318.     data.loadm:=MUIV_PlaneFunc_LoadM_CutTile
  319.     data.lock:=0
  320.     StrCopy(data.imagefile,cat.msg_Unnamed.getstr())
  321.     data.modified:=0
  322.     data.newleft:=-1
  323.     data.name:=String(32)
  324.     StrCopy(data.name,cat.msg_Unnamed.getstr())
  325.     data.paused:=FALSE
  326.     data.ratio:=100000
  327.     data.newtop:=-1
  328.     data.type:=MUIV_PlaneFunc_Type_Graph
  329.     data.width:=256
  330.  
  331.     data.xmin:=10
  332.     data.xmax:=240
  333.     data.ymin:=30
  334.     data.ymax:=80
  335.  
  336.     data.imagedata:=AllocMem(data.width*data.height*4,MEMF_CLEAR OR MEMF_PUBLIC);data.vec:=TRUE
  337.     data.picture:=MakePictureA(data.imagedata,data.width,data.height,[GGFX_PixelFormat,PIXFMT_0RGB_32,TAG_DONE])
  338.  
  339. ENDPROC obj
  340. PROC planeFunc_askminmax(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_askminmax)
  341. DEF minmax:PTR TO mui_minmax,data:PTR TO planeFunc_data
  342.     data:=INST_DATA(cl,obj)
  343.     doSuperMethodA(cl,obj,msg)
  344.     minmax:=msg.minmaxinfo
  345.     minmax.maxwidth:=minmax.maxwidth+MUI_MAXMAX
  346.     minmax.maxheight:=minmax.maxheight+MUI_MAXMAX
  347.     minmax.defwidth:=minmax.defwidth+(data.width)
  348.     minmax.defheight:=minmax.defheight+(data.height)
  349. ENDPROC 0
  350.  
  351. PROC planeFunc_setup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  352.  
  353.     IF doSuperMethodA(cl,obj,msg)=NIL THEN RETURN FALSE
  354.     Mui_RequestIDCMP(obj,IDCMP_MOUSEBUTTONS)
  355.  
  356.     ->Mui_RequestIDCMP(obj,IDCMP_RAWKEY)
  357. ENDPROC MUI_TRUE
  358.  
  359. PROC planeFunc_cleanup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  360. DEF data:PTR TO planeFunc_data
  361.     Mui_RejectIDCMP(obj,IDCMP_MOUSEBUTTONS)
  362.     ->Mui_RejectIDCMP(obj,IDCMP_RAWKEY)
  363.  
  364.     data:=INST_DATA(cl,obj)
  365.     IF data.drawhandle
  366.         ReleaseDrawHandle(data.drawhandle);data.drawhandle:=NIL
  367.     ENDIF
  368.  
  369. ENDPROC doSuperMethodA(cl,obj,msg)
  370.  
  371. PROC planeFunc_handleinput(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_handleinput)
  372. #define _between(a,x,b) (((x)>=(a)) AND ((x)<=(b)))
  373. DEF data:PTR TO planeFunc_data,col,colourstr[30]:STRING,x,y
  374.  
  375.     data:=INST_DATA(cl,obj)
  376.     IF msg.imsg
  377.         IF (msg.imsg.class=IDCMP_MOUSEBUTTONS) AND (msg.imsg.code=SELECTDOWN)
  378.             _mwidth(obj)*(data.width-data.left)/Div(Mul(_mwidth(obj),100000),data.ratio)
  379.             IF (_between(_mleft(obj),msg.imsg.mousex,_mright(obj)) AND _between(_mtop(obj),msg.imsg.mousey,_bottom(obj)))
  380.                 x:=Div(Mul(msg.imsg.mousex-_mleft(obj),100000),data.ratio)+data.left
  381.                 y:=Div(Mul(msg.imsg.mousey-_mtop(obj),100000),data.ratio)+data.top
  382.                 IF (x>=data.width) OR (y>=data.height) THEN RETURN doSuperMethodA(cl,obj,msg)
  383.                 /*get colour*/
  384.                 ObtainSemaphore(data.sema)
  385.                 /*IF cybergfxbase
  386.                     col:=ReadRGBPixel(data.rp,x,y)
  387.                 ELSE
  388.                     col:=Pi96ReadPixel(data.rp,x,y)
  389.                 ENDIF*/
  390.                 IF data.imagedata THEN
  391.                     col:=pixel(data.imagedata,data.width,x,y)
  392.                 ReleaseSemaphore(data.sema)
  393.                 StringF(colourstr,'c(\d,\d,\d)=[\d,\d,\d]',data.projectid,x,y,Shr(col,16),Shr(col AND $FF00,8),col AND $FF)
  394.                 set(colour_txt,MUIA_Text_Contents,colourstr)
  395.             ENDIF
  396. /*        ELSEIF (msg.imsg.class=IDCMP_RAWKEY)
  397.             IF (msg.imsg.code=96) OR (msg.imsg.code=97)
  398.                 data.shift:=TRUE
  399.             ELSEIF (msg.imsg.code=224) OR (msg.imsg.code=225)
  400.                 data.shift:=FALSE
  401.             ENDIF*/
  402.         ENDIF
  403.     ENDIF
  404. ENDPROC doSuperMethodA(cl,obj,msg)
  405.  
  406. PROC planeFunc_clear(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  407. DEF data:PTR TO planeFunc_data
  408.     data:=INST_DATA(cl,obj)
  409.     ObtainSemaphore(data.sema)
  410.     IF data.lock=0
  411.         DeletePicture(data.picture)
  412.         data.imagedata:=AllocMem(data.width*data.height*4,MEMF_CLEAR OR MEMF_PUBLIC);data.vec:=TRUE
  413.         data.picture:=MakePictureA(data.imagedata,data.width,data.height,[GGFX_PixelFormat,PIXFMT_0RGB_32,TAG_DONE])
  414.  
  415.         ReleaseSemaphore(data.sema)
  416.         Mui_Redraw(obj,MADF_DRAWUPDATE)
  417.     ELSE
  418.         ReleaseSemaphore(data.sema)
  419.         message(data.projectid,cat.msgm_WriteVsLock.getstr())
  420.     ENDIF
  421. ENDPROC
  422.  
  423. PROC planeFunc_drawhandle(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  424. DEF data:PTR TO planeFunc_data,window
  425.     data:=INST_DATA(cl,obj)
  426.  
  427.     IF data.drawhandle
  428.         ReleaseDrawHandle(data.drawhandle);data.drawhandle:=NIL
  429.     ENDIF
  430.     get(obj,MUIA_Window,{window})
  431.     IF window
  432.         data.drawhandle:=odhandle(obj)
  433.         Mui_Redraw(obj,MADF_DRAWUPDATE)
  434.     ENDIF
  435. ENDPROC
  436.  
  437. PROC odhandle(obj:PTR TO object)
  438. DEF dm,id
  439.     SELECT dithm
  440.         CASE 0; dm:=DITHERMODE_NONE
  441.         CASE 1; dm:=DITHERMODE_EDD
  442.         CASE 2; dm:=DITHERMODE_FS
  443.         CASE 3; dm:=DITHERMODE_RANDOM
  444.         ENDSELECT
  445.  
  446.         id:=GetVPModeID(_screen(obj).viewport)
  447.  
  448.         RETURN ObtainDrawHandleA(NIL,_window(obj).rport,_window(obj).wscreen.viewport.colormap,[
  449.         GGFX_DitherMode,dm,
  450.         GGFX_DitherAmount,ditha,
  451.         GGFX_ModeID,id,
  452.  
  453.         TAG_DONE])
  454. ENDPROC
  455.  
  456. PROC planeFunc_close(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  457. DEF data:PTR TO planeFunc_data,kdata:PTR TO projectList_data
  458. DEF state,count=0,i,d:PTR TO planeFunc_data,win
  459.     data:=INST_DATA(cl,obj)
  460.     get(obj,MUIA_P_WindowObject,{win})
  461.     IF wclose=0
  462.         set(win,MUIA_Window_Open,FALSE)
  463.         IF data.projectid=currid
  464.             nnset(showme_cyc,MUIA_Cycle_Active,0) -> update cycle display.
  465.             i:=doMethodA(menus,[MUIM_FindUData,MENU_P_Visible])
  466.             nnset(i,MUIA_Menuitem_Checked,FALSE)
  467.         ENDIF
  468.     ELSEIF wclose=1
  469. quiet:=TRUE
  470.         IF data.modified <> 0
  471.             i:=String(StrLen(cat.msgr_Remove.getstr())+StrLen(cat.msgr_Cancel.getstr())+1)
  472.             StringF(i,'\s|\s',cat.msgr_Remove.getstr(),cat.msgr_Cancel.getstr())
  473.             IF Mui_RequestA(app,data.win,0,cat.msgr_RemProject.getstr(),i,cat.msgr_RemoveLong.getstr(),[data.projectid,data.name])<>1
  474.                 DisposeLink(i)
  475.                 quiet:=FALSE
  476.                 RETURN
  477.             ENDIF
  478.             DisposeLink(i)
  479.         ENDIF
  480.         set(win,MUIA_Window_Open,FALSE)
  481.         kdata:=INST_DATA(cl_projectlist.mcc_class,opened_lst)
  482.         doMethodA(obj,[MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])
  483.         get(obj,MUIA_PlaneFunc_State,{state})
  484.         IF state = MUIV_PlaneFunc_State_Frozen
  485.             message(data.projectid,cat.msgm_RemVsFreeze.getstr())
  486.             quiet:=FALSE
  487.             RETURN
  488.         ENDIF
  489.         IF currid=data.projectid THEN currid:=-1
  490. /*remove the list item*/
  491.         get(opened_lst,MUIA_List_Entries,{count})
  492.         FOR i:=0 TO (count-1)
  493.             doMethodA(opened_lst,[MUIM_List_GetEntry,i,{d}])
  494.             EXIT d=data
  495.         ENDFOR
  496.         doMethodA(opened_lst,[MUIM_List_Remove,i]) -> was the object really found??
  497. /*free the window*/
  498.         doMethodA(app,[OM_REMMEMBER,win])
  499.         Mui_DisposeObject(win)
  500. quiet:=FALSE
  501.         doMethodA(opened_lst,[MUIM_ProjectList_Refresh,0])
  502. ->Delay(50)
  503. ->WriteF('\n»»»Done with refreshing.\n')
  504.     ENDIF
  505. ENDPROC
  506.  
  507. PROC planeFunc_dispose(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  508. DEF data:PTR TO planeFunc_data
  509.     data:=INST_DATA(cl,obj)
  510.     ObtainSemaphore(data.sema)
  511.     data.app:=FALSE
  512.     ReleaseSemaphore(data.sema)
  513.     IF data.subtask
  514.         killsubtask(data)
  515.         set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  516.     ENDIF
  517.     DisposeLink(data.name)
  518.     DisposeLink(data.rstr)
  519.     DisposeLink(data.gstr)
  520.     DisposeLink(data.bstr)
  521.     END data.rfunc
  522.     END data.gfunc
  523.     END data.bfunc
  524.     DisposeLink(data.imagefile)
  525.     DisposeLink(data.imagefilename)
  526.  
  527.     IF data.picture THEN DeletePicture(data.picture)
  528.     IF data.imagedata AND data.vec THEN FreeMem(data.imagedata,data.width*data.height*4)
  529. ENDPROC doSuperMethodA(cl,obj,msg)
  530. PROC planeFunc_lamps(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  531. DEF data:PTR TO planeFunc_data
  532.     data:=INST_DATA(cl,obj)
  533.     IF data.failure AND $1
  534.         set(blue_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Error)
  535.     ELSE
  536.         set(blue_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Ok)
  537.     ENDIF
  538.     data:=INST_DATA(cl,obj)
  539.     IF data.failure AND $10
  540.         set(green_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Error)
  541.     ELSE
  542.         set(green_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Ok)
  543.     ENDIF
  544.     IF data.failure AND $100
  545.         set(red_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Error)
  546.     ELSE
  547.         set(red_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Ok)
  548.     ENDIF
  549. ENDPROC
  550.  
  551. PROC planeFunc_draw(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_draw)
  552. DEF data:PTR TO planeFunc_data,delta,d=FALSE,window:PTR TO window,mw,mh,w,h
  553.     doSuperMethodA(cl,obj,msg)
  554.     data:=INST_DATA(cl,obj)
  555.  
  556.     mw:=_mwidth(obj);mh:=_mheight(obj)
  557.  
  558.     IF data.drawhandle = NIL
  559.         get(obj,MUIA_Window,{window})
  560.         IF window
  561.             data.drawhandle:=odhandle(obj)
  562.             IF data.drawhandle = 0
  563.                 WriteF('\s\n\n',cat.msgm_NoDrawHandle.getstr());RETURN
  564.             ENDIF
  565.         ELSE ; WriteF('\s\n',cat.msgm_NoWindow.getstr());RETURN
  566.         ENDIF
  567.     ENDIF
  568.  
  569.     ObtainSemaphore(data.sema)
  570.     IF (msg.flags AND MADF_DRAWUPDATE)
  571.         IF data.newtop <> -1/*scroll vertically*/
  572.             data.top:=data.newtop;data.newtop:=-1
  573.             d:=TRUE
  574.         ENDIF
  575.         IF data.newleft <> -1/*scroll horizontally*/
  576.             data.left:=data.newleft;data.newleft:=-1
  577.             d:=TRUE
  578.         ENDIF
  579.  
  580.     ELSEIF (msg.flags AND MADF_DRAWOBJECT)
  581.         /*the window may have been resized..*/
  582.         set(data.hscroll,MUIA_Prop_Visible,Div(Mul(mw,100000),data.ratio))
  583.         set(data.vscroll,MUIA_Prop_Visible,Div(Mul(mh,100000),data.ratio))
  584.         get(data.vscroll,MUIA_Prop_First,{delta})
  585.         data.top:=delta
  586.         get(data.hscroll,MUIA_Prop_First,{delta})
  587.         data.left:=delta
  588.         d:=TRUE
  589.     ENDIF
  590.  
  591.     IF mw*mh=0 THEN
  592.         RETURN ReleaseSemaphore(data.sema) -> Would be silly to draw when size is zero :)
  593.  
  594.     w:=Div(Mul(mw,100000),data.ratio) -> dimensions of source to display.
  595.     h:=Div(Mul(mh,100000),data.ratio)
  596.     DrawPictureA(data.drawhandle,data.picture,_mleft(obj),_mtop(obj),[
  597.                                             GGFX_SourceX,data.left,
  598.                                             GGFX_SourceY,data.top,
  599.                                             GGFX_SourceWidth,Min(w,data.width-data.left),
  600.                                             GGFX_DestWidth,Min(mw,mw*(data.width-data.left)/w),
  601.                                             GGFX_SourceHeight,Min(h,data.height-data.top),
  602.                                             GGFX_DestHeight,Min(mh,mh*(data.height-data.top)/h),
  603.                                             TAG_DONE])
  604.     ReleaseSemaphore(data.sema)
  605. ENDPROC
  606.  
  607. /*not yet finished: ability to select a destination area*/
  608.  
  609. /*PROC drawhoriz(x,y,xx,obj:PTR TO object,data:PTR TO planeFunc_data)
  610.     IF data.ymin > data.top              ->top border
  611.         Move(_rp(obj),_mleft(obj)+Max(0,data.xmin-data.left),         _mtop(obj)+data.ymin-data.top)
  612.         Draw(_rp(obj),_mleft(obj)+Min(_mwidth(obj),data.xmax-data.left),_mtop(obj)+data.ymin-data.top)
  613.     ENDIF
  614.  
  615.     Move(_rp(obj),x,y)
  616.     Draw(_rp(obj),xx,y)
  617. ENDPROC*/
  618.  
  619. PROC planeFunc_get(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opget)
  620. DEF data:PTR TO planeFunc_data,storage,attrid
  621.  
  622.     data:=INST_DATA(cl,obj)
  623.     attrid:=msg.attrid
  624.     storage:=msg.storage
  625.     ObtainSemaphore(data.sema)
  626.     SELECT attrid
  627.     CASE MUIA_PlaneFunc_Bstr
  628.         ^storage:=data.bstr
  629. /*    CASE MUIA_CompileR
  630.         ^storage:=data.compiler
  631.     CASE MUIA_CompileG
  632.         ^storage:=data.compileg
  633.     CASE MUIA_CompileB
  634.         ^storage:=data.compileb
  635. */    CASE MUIA_PlaneFunc_Gstr
  636.         ^storage:=data.gstr
  637.     CASE MUIA_PlaneFunc_Height
  638.         ^storage:=data.height
  639.     CASE MUIA_PlaneFunc_ImageFile
  640.         ^storage:=data.imagefile
  641.     CASE MUIA_PlaneFunc_Loading
  642.         ^storage:=data.loading
  643.     CASE MUIA_PlaneFunc_LoadM
  644.         ^storage:=data.loadm
  645.     CASE MUIA_PlaneFunc_Lock
  646.         ^storage:=data.lock
  647.     CASE MUIA_PlaneFunc_Modified
  648.         ^storage:=data.modified
  649.     CASE MUIA_PlaneFunc_Name
  650.         ^storage:=data.name
  651.     CASE MUIA_PlaneFunc_Percent
  652.         IF data.lock=MUIV_PlaneFunc_Lock_Write
  653.             ^storage:=data.calculated*100/data.height
  654.         ELSE
  655.             ^storage:=0
  656.         ENDIF
  657.     CASE MUIA_PlaneFunc_OutputR
  658.         ^storage:=data.outputr
  659.     CASE MUIA_PlaneFunc_OutputG
  660.         ^storage:=data.outputg
  661.     CASE MUIA_PlaneFunc_OutputB
  662.         ^storage:=data.outputb
  663.     CASE MUIA_PlaneFunc_ProjectID
  664.         ^storage:=data.projectid
  665.     CASE MUIA_PlaneFunc_Quiet
  666.         ^storage:=data.quiet
  667.     CASE MUIA_PlaneFunc_Rstr
  668.         ^storage:=data.rstr
  669.     CASE MUIA_PlaneFunc_State
  670.         IF data.lock = MUIV_PlaneFunc_Lock_Write
  671.             IF data.paused
  672.                 ^storage:=MUIV_PlaneFunc_State_Paused
  673.             ELSEIF data.loading
  674.                 ^storage:=MUIV_PlaneFunc_State_Loading
  675.             ELSE
  676.                 ^storage:=MUIV_PlaneFunc_State_Drawing
  677.             ENDIF
  678.         ELSE
  679.             IF data.lock = 0
  680.                 ^storage:=MUIV_PlaneFunc_State_Idle
  681.             ELSE
  682.                 ^storage:=MUIV_PlaneFunc_State_Frozen
  683.             ENDIF
  684.         ENDIF
  685.     CASE MUIA_PlaneFunc_Type
  686.         ^storage:=data.type
  687.     CASE MUIA_PlaneFunc_Width
  688.         ^storage:=data.width
  689.     CASE MUIA_P_WindowObject -> MUIA_WindowObject does not work >:-(
  690.         ^storage:=data.win
  691.     DEFAULT
  692.         ReleaseSemaphore(data.sema)
  693.         RETURN doSuperMethodA(cl,obj,msg)
  694.     ENDSELECT
  695.     ReleaseSemaphore(data.sema)
  696. ENDPROC MUI_TRUE
  697.  
  698. PROC planeFunc_set(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opset)
  699. DEF data:PTR TO planeFunc_data,
  700.     tags:PTR TO tagitem,
  701.     tag:PTR TO tagitem,
  702.     attrid
  703. DEF window,group
  704.     data:=INST_DATA(cl,obj)
  705.     tags:=msg.attrlist
  706.     ObtainSemaphore(data.sema)
  707.     WHILE tag:=NextTagItem({tags})
  708.         attrid:=tag.tag
  709.         SELECT attrid
  710.         CASE MUIA_PlaneFunc_ImageFile
  711.             StrCopy(data.imagefile,tag.data)
  712.         CASE MUIA_PlaneFunc_Loading
  713.             data.loading:=tag.data
  714.             IF data.projectid=currid THEN
  715.                 setlamp(obj)
  716.         CASE MUIA_PlaneFunc_Left
  717.             data.newleft:=tag.data
  718.             Mui_Redraw(obj,MADF_DRAWUPDATE)
  719.         CASE MUIA_PlaneFunc_Top
  720.             data.newtop:=tag.data
  721.             Mui_Redraw(obj,MADF_DRAWUPDATE)
  722.         CASE MUIA_PlaneFunc_Lock
  723.             IF data.lock=MUIV_PlaneFunc_Lock_Write-> If the object is being written, the only tag allowed is NoWrite
  724.                 IF tag.data=MUIV_PlaneFunc_Lock_NoWrite
  725.                     data.lock:=0
  726.                 ENDIF
  727.             ELSEIF data.lock=0            -> If the object is free, it can either be read or write - locked
  728.                 data.lock:=tag.data
  729.             ELSE                         -> If the object is read locked, it can be read unlocked or read locked again.
  730.                 IF tag.data=MUIV_PlaneFunc_Lock_NoRead
  731.                     data.lock:=data.lock-1
  732.                 ELSEIF tag.data=MUIV_PlaneFunc_Lock_Read
  733.                     data.lock:=data.lock+1
  734.                 ENDIF
  735.             ENDIF
  736.             doMethodA(opened_lst,[MUIM_ProjectList_Refresh,data.projectid+2]) -> Refresh the "state" lamp.
  737.         CASE MUIA_PlaneFunc_Name
  738.             StrCopy(data.name,tag.data)
  739.             get(obj,MUIA_P_WindowObject,{window})
  740.             set(window,MUIA_Window_Title,data.name)
  741.         CASE MUIA_PlaneFunc_Quiet
  742.             data.quiet:=tag.data
  743.             IF data.quiet=FALSE
  744.                 get(obj,MUIA_Parent,{group})
  745.                 doMethodA(group,[MUIM_Group_InitChange])
  746.                 doMethodA(group,[MUIM_Group_ExitChange])
  747. ->                IF data.imagedata AND data.vec THEN FreeMem(data.imagedata,data.width*data.height*4);data.imagedata:=NIL
  748.  
  749.               /*  data.imagedata:=AllocMem(data.width*data.height*4,MEMF_CLEAR OR MEMF_PUBLIC);data.vec:=TRUE
  750.                 data.picture:=MakePictureA(data.imagedata,data.width,data.height,[GGFX_PixelFormat,PIXFMT_0RGB_32,TAG_DONE])
  751.               */
  752.                 IF data.projectid=currid
  753.                     nnset(width_str,MUIA_String_Integer,data.width)
  754.                     nnset(height_str,MUIA_String_Integer,data.height)
  755.                 ENDIF
  756.                 /*IF data.subtask THEN
  757.                     sendsubtaskmsg(data.subtask,STC_CHANGEDONE,NIL) */
  758.             ENDIF
  759.         CASE MUIA_P_WindowObject
  760.             data.win:=tag.data
  761.         DEFAULT
  762.             IF (data.lock <> MUIV_PlaneFunc_Lock_Write) OR (data.quiet=-2)
  763.                 SELECT attrid
  764.                 CASE MUIA_PlaneFunc_Bstr
  765.                     StrCopy(data.bstr,tag.data)
  766.                     LowerStr(data.bstr)
  767.                     idecode(data.bfunc,tag.data,$1,data)
  768.                     data.modified:=data.modified OR 1
  769.                 CASE MUIA_PlaneFunc_Gstr
  770.                     StrCopy(data.gstr,tag.data)
  771.                     idecode(data.gfunc,tag.data,$10,data)
  772.                     data.modified:=data.modified OR 1
  773.                 CASE MUIA_PlaneFunc_LoadM
  774.                     data.loadm:=tag.data
  775.                 CASE MUIA_PlaneFunc_OutputR
  776.                     data.outputr:=tag.data
  777.                     idecode(data.rfunc,data.rstr,$100,data,data.outputr)
  778.                     data.modified:=data.modified OR 1
  779.                 CASE MUIA_PlaneFunc_OutputG
  780.                     data.outputg:=tag.data
  781.                     idecode(data.gfunc,data.gstr,$10,data,data.outputg)
  782.                     data.modified:=data.modified OR 1
  783.                 CASE MUIA_PlaneFunc_OutputB
  784.                     data.outputb:=tag.data
  785.                     idecode(data.bfunc,data.bstr,$1,data,data.outputb)
  786.                     data.modified:=data.modified OR 1
  787.                 CASE MUIA_PlaneFunc_Rstr
  788.                     StrCopy(data.rstr,tag.data)
  789.                     LowerStr(data.rstr)
  790.                     idecode(data.rfunc,tag.data,$100,data)
  791.                     data.modified:=data.modified OR 1
  792.                 CASE MUIA_PlaneFunc_Type
  793.                     data.type:=tag.data
  794.                 DEFAULT
  795.                     IF (data.lock <> MUIV_PlaneFunc_Lock_NoRead) AND (data.quiet<>-2)
  796.                         message(data.projectid,cat.msgm_AttrVsLock.getstr())
  797.                     ELSEIF attrid = MUIA_PlaneFunc_Width
  798.                         data.width:=tag.data
  799.                         set(data.hscroll,MUIA_Prop_Entries,tag.data)
  800.                         IF data.quiet=FALSE
  801.                             get(obj,MUIA_Parent,{group})
  802.                             doMethodA(group,[MUIM_Group_InitChange])
  803.                             doMethodA(group,[MUIM_Group_ExitChange])
  804. ->                            IF data.imagedata AND data.vec THEN FreeMem(data.imagedata,data.width*data.height*4);data.imagedata:=NIL
  805.                             IF data.picture THEN DeletePicture(data.picture);data.picture:=NIL
  806.                             data.imagedata:=AllocMem(data.width*data.height*4,MEMF_CLEAR OR MEMF_PUBLIC);data.vec:=TRUE
  807.                             data.picture:=MakePictureA(data.imagedata,data.width,data.height,[GGFX_PixelFormat,PIXFMT_0RGB_32,TAG_DONE])
  808.                         ENDIF
  809.                         data.modified:=data.modified OR 3 -> (both definition and picture)
  810.                     ELSEIF attrid = MUIA_PlaneFunc_Height
  811.                         data.height:=tag.data
  812.                         set(data.vscroll,MUIA_Prop_Entries,tag.data)
  813.                         IF data.quiet=FALSE
  814.                             get(obj,MUIA_Parent,{group})
  815.                             doMethodA(group,[MUIM_Group_InitChange])
  816.                             doMethodA(group,[MUIM_Group_ExitChange])
  817. ->                            IF data.imagedata AND data.vec THEN FreeMem(data.imagedata,data.width*data.height*4);data.imagedata:=NIL
  818.                             IF data.picture THEN DeletePicture(data.picture);data.picture:=NIL
  819.                             data.imagedata:=AllocMem(data.width*data.height*4,MEMF_CLEAR OR MEMF_PUBLIC);data.vec:=TRUE
  820.                             data.picture:=MakePictureA(data.imagedata,data.width,data.height,[GGFX_PixelFormat,PIXFMT_0RGB_32,TAG_DONE])
  821.                         ENDIF
  822.                         data.modified:=data.modified OR 3
  823.                     ENDIF
  824.                 ENDSELECT
  825.             ELSE
  826.                 message(data.projectid,cat.msgm_AttrVsLock.getstr())
  827.             ENDIF
  828.         ENDSELECT
  829.     ENDWHILE
  830.     ReleaseSemaphore(data.sema)
  831. ENDPROC doSuperMethodA(cl,obj,msg)
  832.  
  833. /*idecode, extends f.create(). Ok, I know I should maybe have written a method, but it's easier like this :-¦*/
  834. PROC idecode(f:PTR TO expression,s:PTR TO CHAR,l,data:PTR TO planeFunc_data,in=-1)
  835. DEF out/*:PTR TO outinfo,err*/,i:PTR TO CHAR
  836.  
  837.     i:=String(StrLen(s)) -> New string so that lowerstr doesn't change text in field.
  838.     StrCopy(i,s)
  839.     LowerStr(i)
  840.  
  841.     IF in = -1 THEN
  842.         in:=f.precision
  843.  
  844.     IF in = OUT_Float64
  845.         message(data.projectid,cat.msgm_Nof64.getstr())
  846.         DisposeLink(i)
  847.         RETURN
  848.     ENDIF
  849.  
  850.     END f
  851.  
  852.     NEW f.create(in,i)
  853.     out:=f.message
  854.     IF out AND FAILURE
  855.         data.failure:=data.failure OR l
  856.         /*err:=out.error
  857.         SELECT err
  858.         CASE ERR_NoParse
  859.             messagefmt(data.projectid,cat.msgm_NoParse.getstr(),out.quote)
  860.         CASE ERR_NoFunc
  861.             messagefmt(data.projectid,cat.msgm_NoFunc.getstr(),out.quote)
  862.         CASE ERR_NoChar
  863.             messagefmt(data.projectid,cat.msgm_NoChar.getstr(),out.quote)
  864.         DEFAULT
  865.             message(data.projectid,cat.msgm_Failure.getstr())
  866.         ENDSELECT
  867.         END out*/
  868.     ELSE -> Can't currently have both failure and warning. It will come :-)
  869.         data.failure:=data.failure AND Not(l)
  870.         IF out AND WARN_NoSupport THEN
  871.             message(data.projectid,cat.msgm_WarnNoSupport.getstr())
  872.         IF out AND WARN_EPi THEN
  873.             message(data.projectid,cat.msgm_WarnEPi.getstr())
  874.     ENDIF
  875.     doMethodA(data.self,[MUIM_PlaneFunc_Lamps])
  876.     DisposeLink(i)
  877. ENDPROC
  878.  
  879. PROC planeFunc_abort(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_abort)
  880. DEF data:PTR TO planeFunc_data,ds1:PTR TO datestamp,ds2:datestamp,qe[30]:STRING,u
  881.     data:=INST_DATA(cl,obj)
  882.     IF data.subtask
  883.         killsubtask(data)
  884.         set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  885.  
  886.         u:=msg.reason
  887.         SELECT u
  888.         CASE MUIV_PlaneFunc_Abort_Finish
  889.             ds1:=data.ds
  890.             DateStamp(ds2)
  891.             u:=(ds2.minute-ds1.minute)*TICKS_PER_MINUTE+ds2.tick-ds1.tick -> number of ticks
  892.             StringF(qe,'\s  \z\d[2]:\z\d[2].\z\d[2].',cat.msgm_Done.getstr(),u/TICKS_PER_MINUTE,Mod(u,TICKS_PER_MINUTE)/TICKS_PER_SECOND,Mod(u,TICKS_PER_SECOND)*100/TICKS_PER_SECOND)
  893.             message(data.projectid,qe)
  894.         CASE MUIV_PlaneFunc_Abort_Abort
  895.             message(data.projectid,cat.msgm_Abort.getstr())
  896.             IF data.type = MUIV_PlaneFunc_Type_Graph AND data.imagedata -> the rendering was aborted. we'll have to tidy up
  897.                 IF data.picture THEN DeletePicture(data.picture)
  898.                 data.picture:=MakePictureA(data.imagedata,data.width,data.height,[GGFX_PixelFormat,PIXFMT_0RGB_32,TAG_DONE])
  899.                 data.calculated:=0
  900.             ENDIF
  901.         CASE MUIV_PlaneFunc_Abort_NoLoad
  902.             message(data.projectid,cat.msgm_NoLoad.getstr())
  903.         ENDSELECT
  904.  
  905.         data.drawn:=0
  906.         data.calculated:=0
  907.         data.paused:=FALSE
  908.         data.loading:=FALSE
  909.  
  910.         Mui_Redraw(obj,MADF_DRAWUPDATE)
  911.  
  912.         doMethodA(saveP,[MUIM_Projecthold_StepAnimate]) -> If an animation is going then this jumps to next step. Otherwise, this does nothing.
  913.     ENDIF
  914. ENDPROC
  915.  
  916. PROC planeFunc_loadfunc(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  917. DEF u,filereq:PTR TO filerequester,s[200]:STRING,handler,data:PTR TO planeFunc_data,
  918.     eq,var[10]:STRING,value:PTR TO CHAR
  919.  
  920.     data:=INST_DATA(cl,obj)
  921.     get(settings_win,MUIA_Window_Window,{u})
  922.     filereq:=AllocAslRequest(ASL_FILEREQUEST,
  923.                             [ASL_HAIL,      cat.msgr_Loadf_T.getstr(),
  924.                              ASL_OKTEXT,    cat.msgr_Loadf_Ok.getstr(),
  925.                              ASL_DIR,       funcdir,
  926.                              ASL_WINDOW,    u,
  927.                              NIL])
  928.     IF filereq=NIL
  929.         Mui_RequestA(app,settings_win,0,cat.msgr_Loadf_T.getstr(),NIL,cat.msgr_NoAslReq.getstr(),NIL)
  930.     ELSE
  931.         IF AslRequest(filereq,NIL)
  932.             StrCopy(s,filereq.drawer)
  933.             DisposeLink(funcdir);funcdir:=String(StrLen(s));StrCopy(funcdir,s)
  934.             AddPart(s,filereq.file,StrMax(s))
  935.             SetStr(s,StrLen(s))
  936.             evaluatePath(s)
  937.         ENDIF
  938.         FreeAslRequest(filereq)
  939.     ENDIF
  940.     IF s[] = NIL THEN RETURN
  941.     handler:=Open(s,OLDFILE)
  942.     Fgets(handler,s,StrMax(s)-1)
  943.     IF s[]=NIL
  944.         Close(handler)
  945.         message(data.projectid,cat.msgm_EmptyFile.getstr())
  946.         RETURN
  947.     ENDIF
  948.     SetStr(s,StrLen(s)-1)
  949.     IF Not(StrCmp(s,'picFX function-file; type1'))
  950.         Close(handler)
  951.         message(data.projectid,cat.msgm_BadFile.getstr())
  952.         RETURN
  953.     ENDIF
  954.     set(obj,MUIA_PlaneFunc_Quiet,MUI_TRUE)
  955.     WHILE Fgets(handler,s,StrMax(s)-1)/* semaphore will be obtained in the SET method */
  956.         SetStr(s,StrLen(s)-1)
  957.         eq:=InStr(s,'=')
  958.         StrCopy(var,s,eq)
  959.         value:=s+eq+1
  960.         IF StrCmp(var,'bstr')
  961.             set(obj,MUIA_PlaneFunc_Bstr,value)
  962.         ELSEIF StrCmp(var,'gstr')
  963.             set(obj,MUIA_PlaneFunc_Gstr,value)
  964.         ELSEIF StrCmp(var,'height')
  965.             set(obj,MUIA_PlaneFunc_Height,Val(value))
  966.         ELSEIF StrCmp(var,'rstr')
  967.             set(obj,MUIA_PlaneFunc_Rstr,value)
  968.         ELSEIF StrCmp(var,'width')
  969.             set(obj,MUIA_PlaneFunc_Width,Val(value))
  970.         ELSEIF StrCmp(var,'precision') -> Obsolete tag!
  971.             set(obj,MUIA_PlaneFunc_OutputR,Val(value))
  972.             set(obj,MUIA_PlaneFunc_OutputG,Val(value))
  973.             set(obj,MUIA_PlaneFunc_OutputB,Val(value))
  974.             message(data.projectid,cat.msgm_Obsolete.getstr())
  975.         ELSEIF StrCmp(var,'outputr')
  976.             set(obj,MUIA_PlaneFunc_OutputR,Val(value))
  977.         ELSEIF StrCmp(var,'outputg')
  978.             set(obj,MUIA_PlaneFunc_OutputG,Val(value))
  979.         ELSEIF StrCmp(var,'outputb')
  980.             set(obj,MUIA_PlaneFunc_OutputB,Val(value))
  981.         ELSE
  982.             StringF(s,cat.msgm_UnknownVar.getstr(),var)
  983.             message(data.projectid,s)
  984.         ENDIF
  985.     ENDWHILE
  986.     Close(handler)
  987.     set(obj,MUIA_PlaneFunc_Quiet,FALSE)
  988.     doMethodA(opened_lst,[MUIM_ProjectList_Refresh,0])
  989. ENDPROC
  990.  
  991. /*evaluatePath will take an estring of a filename and replace all "[len:]expr" by their values*/
  992. PROC evaluatePath(string)
  993. DEF result,temp,c=0,l=-1,r=-1 -> cursor, left, right
  994.     result:=String(StrMax(string))
  995.     WHILE (l:=InStr(string,'"',c)) <> -1
  996.         r:=InStr(string,'"',l+1)
  997.         IF r = -1
  998.             StrAdd(string,'"') -> Just hope there's enough room :-)
  999.             r:= EstrLen(string)-1
  1000.         ENDIF
  1001.         StrAdd(result,string+c,l-c)
  1002.         string[r]:=0 -> To make evalstr() think the string is finishing there :-)
  1003.         temp:=evalstr(string+l+1) -> now temp points to the evaluated string
  1004.         string[r]:='"' -> restore the quote :-)
  1005.         StrAdd(result,temp)
  1006.         DisposeLink(temp)
  1007.         c:=r+1
  1008.     ENDWHILE
  1009.     StrAdd(result,string+r+1)
  1010.     StrCopy(string,result) -> Replace...
  1011.     DisposeLink(result)
  1012. ENDPROC
  1013.  
  1014. PROC planeFunc_render(cl:PTR TO iclass,obj:PTR TO object/*,msg*/)
  1015. DEF data:PTR TO planeFunc_data,state,r,msg
  1016.     data:=INST_DATA(cl,obj)
  1017.     get(obj,MUIA_PlaneFunc_State,{state})
  1018.     IF state = MUIV_PlaneFunc_State_Idle
  1019.         get(recompile_chk,MUIA_Selected,{r}) ; IF r -> do recompile
  1020.  
  1021. /*Here comes a little problem: If the user changes the string of a function without pressing enter and then
  1022. changes the current project, then the string will be lost. However if he doesn't, then the string will be taken into
  1023. account next time the function is needed. This is not very coherent :-)
  1024. */
  1025.             IF data.projectid=currid -> If the strings are for the current project, then we read them (as they might not have been saved yet)
  1026.                 get(red_str,MUIA_String_Contents,{r})
  1027.                 doMethodA(opened_lst,[MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Red,r])
  1028.                 get(green_str,MUIA_String_Contents,{r})
  1029.                 doMethodA(opened_lst,[MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Green,r])
  1030.                 get(blue_str,MUIA_String_Contents,{r})
  1031.                 doMethodA(opened_lst,[MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Blue,r])
  1032.             ELSE -> otherwise we directely look the strings in the project... (The following don't do any lamp stuff, just end and recompile the function)
  1033.                 idecode(data.rfunc,data.rstr,$000,data)
  1034.                 idecode(data.gfunc,data.gstr,$000,data)
  1035.                 idecode(data.bfunc,data.bstr,$000,data)
  1036.             ENDIF
  1037.  
  1038.         ENDIF
  1039.  
  1040.         set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_Write)
  1041.  
  1042.         data.subtask:=AllocVec(SIZEOF subtask,MEMF_PUBLIC OR MEMF_CLEAR)
  1043.  
  1044.         IF data.type = MUIV_PlaneFunc_Type_DTPic
  1045.             set(obj,MUIA_PlaneFunc_Loading,TRUE)
  1046.         ELSE
  1047.             IF freeze(data.rfunc) = 0 -> This will freeze used projects; if zero, it failed.
  1048.                 message(data.projectid,cat.msgm_NoAlloc.getstr())
  1049.                 FreeVec(data.subtask);data.subtask:=NIL
  1050.                 set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  1051.                 RETURN
  1052.             ENDIF
  1053.             IF freeze(data.gfunc) = 0
  1054.                 message(data.projectid,cat.msgm_NoAlloc.getstr())
  1055.                 FreeVec(data.subtask);data.subtask:=NIL
  1056.                 set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  1057.                 RETURN
  1058.             ENDIF
  1059.             IF freeze(data.bfunc) = 0
  1060.                 message(data.projectid,cat.msgm_NoAlloc.getstr())
  1061.                 FreeVec(data.subtask);data.subtask:=NIL
  1062.                 set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  1063.                 RETURN
  1064.             ENDIF
  1065.             /*will we have to save previous pixel information?*/
  1066.             data.savepixel:=(data.outputr>=OUT_OldR) AND (data.outputr<=OUT_OldB)
  1067.             data.savepixel:=data.savepixel OR ((data.outputg>=OUT_OldR) AND (data.outputg<=OUT_OldB))
  1068.             data.savepixel:=data.savepixel OR ((data.outputb>=OUT_OldR) AND (data.outputb<=OUT_OldB))
  1069.  
  1070.             data.rupd:=rupd
  1071.             data.subtask.st_Reply:=CreateMsgPort()
  1072.         ENDIF
  1073.  
  1074.         IF data.type = MUIV_PlaneFunc_Type_DTPic
  1075.             StrCopy(data.imagefilename,data.imagefile)
  1076.             evaluatePath(data.imagefilename) -> We have to do this separately as we can't
  1077.                             -> compile a function from the subtask (eg, access to varlist)
  1078.         ENDIF
  1079.  
  1080.         r,msg:=fork()
  1081.  
  1082.         SELECT r
  1083.         CASE 0 -> if we are here then we are the subtask
  1084.             IF data.type = MUIV_PlaneFunc_Type_DTPic
  1085.                 loadpicture(data)
  1086.             ELSE
  1087.                 data.subtask.st_Port:=CreateMsgPort()
  1088.                 renderfunc(data)                
  1089.             ENDIF
  1090.         CASE -1
  1091.             SELECT msg -> if we're here then forking the process failed
  1092.             CASE FORKERROR_SIGNAL
  1093.                 message(data.projectid,cat.msgm_FEsignal.getstr())
  1094.             CASE FORKERROR_MEMORY
  1095.                 message(data.projectid,cat.msgm_FEmemory.getstr())
  1096.             CASE FORKERROR_CHILD
  1097.                 message(data.projectid,cat.msgm_FEchild.getstr())
  1098.             DEFAULT
  1099.                 messagefmt(data.projectid,'Unexpected error $\h',msg) -> ditto
  1100.             ENDSELECT
  1101.         DEFAULT -> if we're here then we're still the main task
  1102.             data.subtask.st_Task:=r
  1103.             SetTaskPri(data.subtask.st_Task,cp)
  1104.         ENDSELECT
  1105.     ELSEIF data.type = MUIV_PlaneFunc_Type_Graph
  1106.         SELECT state
  1107.         CASE MUIV_PlaneFunc_State_Drawing
  1108.             sendsubtaskmsg(data.subtask,STC_PAUSE,NIL)
  1109.             data.paused:=TRUE
  1110.             doMethodA(opened_lst,[MUIM_ProjectList_Refresh,data.projectid+2])
  1111.         CASE MUIV_PlaneFunc_State_Paused
  1112.             data.paused:=FALSE
  1113.             sendsubtaskmsg(data.subtask,STC_RESTART,NIL)
  1114.             doMethodA(opened_lst,[MUIM_ProjectList_Refresh,data.projectid+2])
  1115.         CASE MUIV_PlaneFunc_State_Frozen
  1116.             message(data.projectid,cat.msgm_WriteVsFreeze.getstr())
  1117.         ENDSELECT
  1118.     ENDIF
  1119. ENDPROC
  1120.  
  1121. PROC planeFunc_savefunc(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1122. DEF u,filereq:PTR TO filerequester,s[200]:STRING,newhandler,oldhandler,data:PTR TO planeFunc_data
  1123.     data:=INST_DATA(cl,obj)
  1124.     get(settings_win,MUIA_Window_Window,{u})
  1125.     filereq:=AllocAslRequest(ASL_FILEREQUEST,
  1126.                             [ASL_HAIL,      cat.msgr_Savef_T.getstr(),
  1127.                              ASL_OKTEXT,    cat.msgr_Savef_Ok.getstr(),
  1128.                              ASL_DIR,       funcdir,
  1129.                              ASL_WINDOW,    u,
  1130.                              ASL_FUNCFLAGS, FILF_SAVE,
  1131.                              NIL])
  1132.     IF filereq=NIL
  1133.         Mui_RequestA(app,settings_win,0,cat.msgr_Savef_T.getstr(),NIL,cat.msgr_NoAslReq.getstr(),NIL)
  1134.     ELSE
  1135.         IF AslRequest(filereq,NIL)
  1136.             StrCopy(s,filereq.drawer)
  1137.             DisposeLink(funcdir);funcdir:=String(StrLen(s));StrCopy(funcdir,s)
  1138.             AddPart(s,filereq.file,StrMax(s))
  1139.             SetStr(s,StrLen(s))
  1140.             evaluatePath(s)
  1141.         ENDIF
  1142.         FreeAslRequest(filereq)
  1143.     ENDIF
  1144.     IF s[] = NIL THEN RETURN
  1145.     newhandler:=Open(s,NEWFILE)
  1146.     oldhandler:=SetStdOut(newhandler)
  1147.     WriteF('picFX function-file; type1\n')
  1148.     ObtainSemaphore(data.sema)
  1149.     WriteF('bstr=\s\n',data.bstr)
  1150.     WriteF('gstr=\s\n',data.gstr)
  1151.     WriteF('height=\d\n',data.height)
  1152.     WriteF('rstr=\s\n',data.rstr)
  1153.     WriteF('outputr=\d\n',data.outputr)
  1154.     WriteF('outputg=\d\n',data.outputg)
  1155.     WriteF('outputb=\d\n',data.outputb)
  1156.     WriteF('width=\d\n',data.width)
  1157.     ReleaseSemaphore(data.sema)
  1158.     Close(newhandler)
  1159.     SetStdOut(oldhandler)
  1160.     data.modified:=data.modified AND 2 -> we did not save the picture
  1161. ENDPROC
  1162.  
  1163. PROC planeFunc_savepic(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_savepic) -> Warning, this method is synchrone and the animation assumes it!!
  1164. DEF iff:PTR TO iffhandle,bmhd:PTR TO bmhd,x,y,w,bp,bit=0,b:PTR TO CHAR,c,k
  1165. DEF filereq:PTR TO filerequester,s[200]:STRING,data:PTR TO planeFunc_data
  1166.     data:=INST_DATA(cl,obj)
  1167.     IF msg.filegiven=FALSE -> Then we ask the user
  1168.         get(settings_win,MUIA_Window_Window,{w})
  1169.         filereq:=AllocAslRequest(ASL_FILEREQUEST,
  1170.                                 [ASL_HAIL,      cat.msgr_SavePicture.getstr(),
  1171.                                  ASL_OKTEXT,    cat.msgr_Savef_Ok.getstr(),
  1172.                                  ASL_DIR,       picdir,
  1173.                                  ASL_WINDOW,    w,
  1174.                                  ASL_FUNCFLAGS, FILF_SAVE,
  1175.                                  NIL])
  1176.         IF filereq=NIL
  1177.             Mui_RequestA(app,settings_win,0,cat.msgr_SavePicture.getstr(),NIL,cat.msgr_NoAslReq.getstr(),NIL)
  1178.         ELSE
  1179.             IF AslRequest(filereq,NIL)
  1180.                 StrCopy(s,filereq.drawer)
  1181.                 DisposeLink(picdir);picdir:=String(StrLen(s));StrCopy(picdir,s)
  1182.                 AddPart(s,filereq.file,StrMax(s))
  1183.                 SetStr(s,StrLen(s))
  1184.                 evaluatePath(s)
  1185.             ENDIF
  1186.             FreeAslRequest(filereq)
  1187.         ENDIF
  1188.     ELSE
  1189.         s:=msg.filename
  1190.     ENDIF
  1191.  
  1192.     IF s[] = NIL THEN RETURN
  1193.  
  1194.     IF currid=data.projectid
  1195.         set(state_txt,MUIA_Text_Contents,cat.msgs_Saving.getstr())
  1196.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_SavingData)
  1197.         set(state_gau,MUIA_Gauge_Current,0)
  1198.     ENDIF
  1199.  
  1200.     iff:=AllocIFF()
  1201.     iff.stream:=Open(s,NEWFILE)
  1202.     IF iff.stream = NIL THEN RETURN
  1203.     InitIFFasDOS(iff)
  1204.     OpenIFF(iff,IFFF_WRITE)
  1205.  
  1206.     PushChunk(iff,ID_ILBM,ID_FORM,IFFSIZE_UNKNOWN)
  1207.  
  1208.     NEW bmhd
  1209.     bmhd.w:=data.width;bmhd.h:=data.height
  1210.     bmhd.planes:=24
  1211.     bmhd.compression:=0 -> currently (?) saving uncompressed iffs.
  1212.     bmhd.xaspect:=1;bmhd.yaspect:=bmhd.xaspect -> what should be correct values?
  1213.     bmhd.pagew:=bmhd.w;bmhd.pageh:=bmhd.h
  1214.  
  1215.     PushChunk(iff,ID_ILBM,ID_BMHD,SIZEOF bmhd)
  1216.     WriteChunkBytes(iff,bmhd,SIZEOF bmhd)
  1217.     PopChunk(iff)
  1218.     END bmhd
  1219.  
  1220.     PushChunk(iff,ID_ILBM,ID_BODY,IFFSIZE_UNKNOWN)
  1221.     w:=data.width
  1222.     w:=(w-1) AND Not(%1111)+15 -> Rounded to the nearest multiple of 16, and substract 1 because we start from zero...
  1223.     NEW b[(w+1)*3+1]
  1224.     c:=b
  1225.     bit:=0
  1226.     FOR y:=0 TO data.height
  1227.         set(state_gau,MUIA_Gauge_Current,y*100/data.height)
  1228.         FOR k:=0 TO 2
  1229.             FOR bp:=16-(k*8) TO (23-(k*8))
  1230.                 FOR x:=0 TO w
  1231.                     b[]:=Shl(b[],1)+(Shr(pixel(data.imagedata,data.width,x,y),bp) AND $1) -> Yurk, that's awfully sloow!!!
  1232.                     bit++
  1233.                     IF bit=8
  1234.                         b++;bit:=0
  1235.                         b[]:=0
  1236.                     ENDIF
  1237.                 ENDFOR
  1238.             ENDFOR
  1239.         ENDFOR
  1240.         b:=c
  1241.         WriteChunkBytes(iff,b,(w+1)*3)
  1242.     ENDFOR
  1243.     PopChunk(iff)
  1244.     END b[(w+1)*3+1]
  1245.     PopChunk(iff)
  1246.  
  1247.     CloseIFF(iff)
  1248.     Close(iff.stream)
  1249.     FreeIFF(iff)
  1250.     data.modified:=data.modified AND 1 -> we did not save the definition
  1251.     setlamp(obj)
  1252. ENDPROC
  1253.  
  1254. PROC planeFunc_setsize(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1255. DEF data:PTR TO planeFunc_data,k,nr
  1256.     data:=INST_DATA(cl,obj)
  1257. /*We want the sum of the apparent dimensions of the picture to be the same as the one for the drawing area.*/
  1258.  
  1259.     nr:=Div(Mul(100000,_mwidth(obj)+_mheight(obj)+1),data.width+data.height+1)
  1260.     IF data.ratio=nr
  1261.         data.ratio:=100000 -> Press twice space bar to set ratio to 1:1
  1262.     ELSE
  1263.         data.ratio:=nr
  1264.     ENDIF
  1265.  
  1266.     set(data.hscroll,MUIA_Prop_Visible,Div(Mul(_mwidth(obj),100000),data.ratio))
  1267.     set(data.vscroll,MUIA_Prop_Visible,Div(Mul(_mheight(obj),100000),data.ratio))
  1268.     get(data.vscroll,MUIA_Prop_First,{k})
  1269.     data.newtop:=k
  1270.     get(data.hscroll,MUIA_Prop_First,{k})
  1271.     data.newleft:=k
  1272.  
  1273.     Mui_Redraw(obj,MADF_DRAWOBJECT)
  1274. ENDPROC
  1275.  
  1276. PROC planeFunc_settaskpri(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_stp)
  1277. DEF data:PTR TO planeFunc_data
  1278.     data:=INST_DATA(cl,obj)
  1279.     ObtainSemaphore(data.sema)
  1280.     IF data.subtask THEN
  1281.         SetTaskPri(data.subtask.st_Task,msg.value)
  1282.     ReleaseSemaphore(data.sema)
  1283. ENDPROC
  1284. PROC planeFunc_update(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1285. DEF data:PTR TO planeFunc_data
  1286.     data:=INST_DATA(cl,obj)
  1287.     ObtainSemaphore(data.sema)
  1288.     data.app:=FALSE
  1289.     ReleaseSemaphore(data.sema)
  1290.     IF data.calculated=0 THEN Mui_Redraw(obj,MADF_DRAWUPDATE)
  1291.     IF data.projectid = currid
  1292. ->        ObtainSemaphore(data.sema)
  1293.         set(state_gau,MUIA_Gauge_Current,data.calculated*100/data.height)
  1294. ->        ReleaseSemaphore(data.sema)
  1295.     ENDIF
  1296.     ObtainSemaphore(data.sema)
  1297.     data.app:=TRUE
  1298.     ReleaseSemaphore(data.sema)
  1299. ENDPROC
  1300.  
  1301. /***************************************************************
  1302. ** custom ProjectList private subclass of List class          **
  1303. ****************************************************************
  1304. **                                                            **
  1305. ** Interaction between the application and the opened projects**
  1306. ***************************************************************/
  1307.  
  1308. CONST PROJECTNODE_ID=100
  1309.  
  1310. PROC projectList_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1311. DEF methodid
  1312.     methodid:=msg.methodid
  1313.     SELECT methodid
  1314.     CASE OM_NEW                   ; RETURN projectList_new(cl,obj,msg)
  1315.     CASE OM_DISPOSE               ; RETURN projectList_dispose(cl,obj,msg)
  1316.     CASE MUIM_Setup               ; RETURN projectList_setup(cl,obj,msg)
  1317.     CASE MUIM_Cleanup             ; RETURN projectList_cleanup(cl,obj,msg)
  1318.     CASE MUIM_ProjectList_DelItem ; RETURN projectList_delitem(cl,obj/*,msg*/)
  1319.     CASE MUIM_ProjectList_DisableProgram ; RETURN projectList_disableProgram(cl,obj,msg)
  1320.     CASE MUIM_ProjectList_EnableProgram  ; RETURN projectList_enableProgram(cl,obj,msg)
  1321.     CASE MUIM_ProjectList_Exit    ; RETURN projectList_exit(cl,obj/*,msg*/)
  1322.     CASE MUIM_ProjectList_Forward ; RETURN projectList_forward(cl,obj,msg)
  1323.     CASE MUIM_ProjectList_Memory  ; RETURN projectList_memory(cl,obj/*,msg*/)
  1324.     CASE MUIM_ProjectList_NewItem ; RETURN projectList_newitem(cl,obj/*,msg*/)
  1325.     CASE MUIM_ProjectList_Notify  ; RETURN projectList_notify(cl,obj,msg)
  1326.     CASE MUIM_ProjectList_Prefs   ; RETURN projectList_prefs(cl,obj,msg)
  1327.     CASE MUIM_ProjectList_Refresh ; RETURN projectList_refresh(cl,obj,msg)
  1328.     CASE MUIM_ProjectList_SavePrefs;RETURN projectList_saveprefs(/*cl,obj,msg*/)
  1329.     CASE MUIM_ProjectList_SetPri  ; RETURN projectList_setpri(cl,obj,msg)
  1330.     CASE MUIM_ProjectList_ShowMe  ; RETURN projectList_showme(cl,obj,msg)
  1331.     CASE MUIM_ProjectList_InsertInList; RETURN projectList_insertInList(cl,obj,msg)
  1332.     ENDSELECT
  1333. ENDPROC doSuperMethodA(cl,obj,msg)
  1334.  
  1335. PROC getcurrent(data:PTR TO projectList_data,obj:PTR TO object)
  1336. DEF k:PTR TO planeFunc_data,win=NIL
  1337.     doMethodA(obj,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{k}])
  1338. ->WriteF('[Got $\h for active entry]\n',k)
  1339.     IF k
  1340.         k:=k.self
  1341.         get(k,MUIA_P_WindowObject,{win})
  1342.     ENDIF
  1343. ENDPROC k,win
  1344.  
  1345. /*Care! getp() asks the ProjectID and not line number!!!*/
  1346.  
  1347. PROC getp(data:PTR TO projectList_data,pid)
  1348. DEF count,i,dt:PTR TO planeFunc_data
  1349.  
  1350.     get(opened_lst,MUIA_List_Entries,{count})
  1351.     FOR i:=0 TO (count-1)
  1352.         doMethodA(opened_lst,[MUIM_List_GetEntry,i,{dt}])
  1353.         IF dt.projectid=pid
  1354.             get(dt.self,MUIA_P_WindowObject,{i})
  1355.             RETURN dt.self,i  -> PlaneFuncObject,WindowObject
  1356.         ENDIF
  1357.     ENDFOR
  1358. ENDPROC NIL,NIL
  1359.  
  1360. PROC getdata(data:PTR TO projectList_data,pid) -> This code is a bit redundant with getp()! :-)
  1361. DEF count,i,dt:PTR TO planeFunc_data
  1362.  
  1363.     get(opened_lst,MUIA_List_Entries,{count})
  1364.     FOR i:=0 TO (count-1)
  1365.         doMethodA(opened_lst,[MUIM_List_GetEntry,i,{dt}])
  1366.         IF dt.projectid=pid
  1367.             RETURN dt
  1368.         ENDIF
  1369.     ENDFOR
  1370.  
  1371. /*If we did not find the requested id..*/
  1372.     messagefmt(-1,cat.msgm_NoID.getstr(),pid)
  1373.  
  1374. ENDPROC NIL
  1375.  
  1376. PROC projectList_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1377. DEF data:PTR TO projectList_data
  1378. DEF port,req
  1379.  
  1380.     IF (obj:=doSuperMethodA(cl,obj,msg)) = FALSE THEN RETURN FALSE
  1381.     data:=INST_DATA(cl,obj)
  1382.  
  1383.     screentitle:=String(60)
  1384.  
  1385.     port := CreateMsgPort()
  1386.     IF port=NIL
  1387.         coerceMethodA(cl,obj,OM_DISPOSE)
  1388.         RETURN NIL
  1389.     ENDIF
  1390.     data.port:=port
  1391.     req := CreateIORequest(data.port,SIZEOF timerequest)
  1392.     IF req=NIL
  1393.         coerceMethodA(cl,obj,OM_DISPOSE)
  1394.         RETURN NIL
  1395.     ENDIF
  1396.     data.req:=req
  1397.     IF OpenDevice(TIMERNAME,UNIT_VBLANK,data.req,0) -> NIL if it went all right...
  1398.         coerceMethodA(cl,obj,OM_DISPOSE)
  1399.         RETURN NIL
  1400.     ENDIF
  1401.     data.ihnode.ihn_millis  := 5000 -> Update memory display every five seconds
  1402.     data.ihnode.ihn_object  := obj
  1403.     data.ihnode.ihn_method  := MUIM_ProjectList_Memory
  1404.     data.ihnode.ihn_flags   := MUIIHNF_TIMER
  1405. ENDPROC obj
  1406.  
  1407. PROC projectList_setup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_setup)
  1408. DEF id,data:PTR TO projectList_data
  1409.     IF doSuperMethodA(cl,obj,msg) = FALSE THEN RETURN FALSE
  1410.     data:=INST_DATA(cl,obj)
  1411.  
  1412.     data.req.io.command := TR_ADDREQUEST
  1413.     data.req.time.secs    := 5 -> Update every five seconds
  1414.     data.req.time.micro   := 0
  1415.     SendIO(data.req)
  1416.     doMethodA(_app(obj),[MUIM_Application_AddInputHandler,data.ihnode])
  1417.  
  1418.     initfuncs({getdata},data,varlist_lst) -> initialization of parser.m (Warn: done every time the window is opened!!)
  1419. ENDPROC MUI_TRUE
  1420.  
  1421. PROC projectList_cleanup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1422. DEF data:PTR TO projectList_data
  1423.     data := INST_DATA(cl,obj)
  1424.     doMethodA(_app(obj),[MUIM_Application_RemInputHandler,data.ihnode])
  1425.     IF (CheckIO(data.req)=NIL) THEN AbortIO(data.req)
  1426.     WaitIO(data.req)
  1427.     cleanfuncs()
  1428. ENDPROC (doSuperMethodA(cl,obj,msg))
  1429.  
  1430. PROC projectList_dispose(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1431. DEF data:PTR TO projectList_data
  1432.     data:=INST_DATA(cl,obj)
  1433.  
  1434.     DisposeLink(screentitle)
  1435.  
  1436.     IF (data.req)
  1437.         IF (data.req.io.device) THEN CloseDevice(data.req)
  1438.         DeleteIORequest(data.req)
  1439.     ENDIF
  1440.     IF (data.port) THEN DeleteMsgPort(data.port)
  1441. ENDPROC doSuperMethodA(cl,obj,msg)
  1442.  
  1443. PROC projectList_delitem(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1444. DEF data:PTR TO projectList_data,gad,window,modified,state,pid,name,btns
  1445.  
  1446. quiet:=TRUE /*prevents the opened projects - list from refreshing the display*/
  1447.     data:=INST_DATA(cl,obj)
  1448.     gad,window:=getcurrent(data,obj)
  1449.     IF gad=NIL THEN RETURN -> This should never happen
  1450.     get(gad,MUIA_PlaneFunc_ProjectID,{pid})
  1451.     get(gad,MUIA_PlaneFunc_Name,{name})
  1452.     get(gad,MUIA_PlaneFunc_Modified,{modified})
  1453.  
  1454.     IF modified <> 0
  1455.         IF window=0 THEN window:=settings_win
  1456.         btns:=String(StrLen(cat.msgr_Remove.getstr())+StrLen(cat.msgr_Cancel.getstr())+1)
  1457.         StringF(btns,'\s|\s',cat.msgr_Remove.getstr(),cat.msgr_Cancel.getstr())
  1458.         IF Mui_RequestA(app,window,0,cat.msgr_RemProject.getstr(),btns,cat.msgr_RemoveLong.getstr(),[pid,name])<>1
  1459.             DisposeLink(btns)
  1460.             quiet:=FALSE
  1461.             RETURN
  1462.         ENDIF
  1463.         DisposeLink(btns)
  1464.     ENDIF
  1465.  
  1466.     doMethodA(gad,[MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])/*aborts the task, if necessary*/
  1467.     get(gad,MUIA_PlaneFunc_State,{state})
  1468.     IF state = MUIV_PlaneFunc_State_Frozen
  1469.         message(pid,cat.msgm_RemVsFreeze.getstr())
  1470.         quiet:=FALSE
  1471.         RETURN
  1472.     ENDIF
  1473.     doMethodA(obj,[MUIM_List_Remove,MUIV_List_Remove_Active])/*removes the name from the list*/
  1474.     set(window,MUIA_Window_Open,FALSE)/*Closes the window*/
  1475.     doMethodA(app,[OM_REMMEMBER,window])
  1476.     Mui_DisposeObject(window) /*Removes the window and the PlaneFuncObject*/
  1477.     currid:=-1 -> This is to prevent projectList to change that unexistant project's priority
  1478. quiet:=FALSE
  1479.     doMethodA(obj,[MUIM_ProjectList_Refresh,0])
  1480. ENDPROC
  1481.  
  1482. PROC projectList_disableProgram(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1483. DEF root
  1484.     IF egroup<>NIL THEN RETURN -> (The program was already disabled)
  1485.     get(sgroup,MUIA_Parent,{root})
  1486.     egroup:=TextObject,
  1487.         TextFrame,MUIA_Background,MUII_TextBack,
  1488.         MUIA_Text_SetMax,FALSE,MUIA_Text_SetVMax,FALSE,
  1489.         MUIA_Text_Contents,cat.msgm_PleaseWait.getstr(),
  1490.     End
  1491.     doMethodA(root,[MUIM_Group_InitChange])
  1492.       doMethodA(root,[OM_REMMEMBER,sgroup])
  1493.       doMethodA(root,[OM_ADDMEMBER,egroup])
  1494.       doMethodA(root,[MUIM_Group_Sort,egroup,stat_grp,NIL])
  1495.     doMethodA(root,[MUIM_Group_ExitChange])
  1496. ENDPROC
  1497.  
  1498. PROC projectList_enableProgram(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1499. DEF root
  1500.     IF egroup=NIL THEN RETURN -> (The program was already enabled)
  1501.     get(egroup,MUIA_Parent,{root})
  1502.     doMethodA(root,[MUIM_Group_InitChange])
  1503.       doMethodA(root,[OM_REMMEMBER,egroup])
  1504.       doMethodA(root,[OM_ADDMEMBER,sgroup])
  1505.       doMethodA(root,[MUIM_Group_Sort,sgroup,stat_grp,NIL])
  1506.     doMethodA(root,[MUIM_Group_ExitChange])
  1507.     Mui_DisposeObject(egroup)
  1508.     egroup:=NIL
  1509. ENDPROC
  1510.  
  1511. PROC projectList_exit(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1512. DEF count,gad,data:PTR TO projectList_data,pid
  1513. DEF z,cs:PTR TO object,d:PTR TO planeFunc_data,i
  1514.     data:=INST_DATA(cl,obj)
  1515.     get(obj,MUIA_List_Entries,{count})
  1516.     FOR i:=0 TO (count-1)
  1517.         doMethodA(opened_lst,[MUIM_List_GetEntry,i,{d}])
  1518.         get(d.self,MUIA_PlaneFunc_ProjectID,{pid})
  1519.         messagefmt(-1,cat.msgm_Removing.getstr(),pid)
  1520.         doMethodA(d.self,[MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])
  1521.     ENDFOR
  1522.  
  1523. ENDPROC
  1524.  
  1525. PROC projectList_forward(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_forward)
  1526. DEF gad,data:PTR TO projectList_data
  1527.     data:=INST_DATA(cl,obj)
  1528.     gad:=getcurrent(data,obj)
  1529.     IF gad = NIL THEN RETURN -> This should never happen
  1530.     IF msg.cnt=2
  1531.         doMethodA(gad,[msg.method,msg.args[]]) -> (Not sure it works)
  1532.     ELSEIF msg.cnt=1
  1533.         doMethodA(gad,[msg.method])
  1534.     ELSE
  1535.         message(-1,'IE:Wrong argcount given to Forward') -> Not very nice but I don't need more currently ;-)
  1536.     ENDIF
  1537. ENDPROC
  1538.  
  1539. PROC projectList_memory(cl:PTR TO iclass,obj:PTR TO object)
  1540. DEF win:PTR TO object,data:PTR TO projectList_data
  1541.     data:=INST_DATA(cl,obj)
  1542.  
  1543.     StringF(screentitle,'\s - \d Chip - \d Fast - \d Total',PICVERSION,AvailMem(MEMF_CHIP),AvailMem(MEMF_FAST),AvailMem(MEMF_ANY))
  1544.     get(obj,MUIA_WindowObject,{win})
  1545.     set(win,MUIA_Window_ScreenTitle,screentitle)
  1546.     set(messages_win,MUIA_Window_ScreenTitle,screentitle)
  1547. ENDPROC
  1548.  
  1549. PROC projectList_newitem(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1550. DEF window, pfunc,vscroll,hscroll,pid,
  1551.     name:PTR TO CHAR,
  1552.     data:PTR TO projectList_data,
  1553.     pdata:PTR TO planeFunc_data
  1554.  
  1555.     data:=INST_DATA(cl,obj)
  1556.     window:=WindowObject,
  1557.         MUIA_Window_ScreenTitle, PICVERSION,
  1558.         ->MUIA_Window_UseRightBorderScroller,MUI_TRUE,
  1559.         MUIA_Window_UseBottomBorderScroller,MUI_TRUE,
  1560.         WindowContents,
  1561.             HGroup,
  1562.                 MUIA_Group_Spacing,0,
  1563.                 Child, pfunc:=PlaneFuncObject,End,
  1564.                 Child, vscroll:=ScrollbarObject,
  1565.                     MUIA_FixWidth,20,
  1566. /*This is an MUI bug, the refreshing is not done correctely when having a scroller in the right border..*/
  1567.                     ->MUIA_Prop_UseWinBorder,MUIV_Prop_UseWinBorder_Right,
  1568.  
  1569.                     MUIA_Prop_Entries,255,MUIA_Prop_Visible,255,
  1570.                 End,
  1571.                 Child, hscroll:=PropObject,
  1572.                     MUIA_Prop_UseWinBorder,MUIV_Prop_UseWinBorder_Bottom,
  1573.                     MUIA_Prop_Entries,255,MUIA_Prop_Visible,255,
  1574.                 End,
  1575.             End,
  1576.         End
  1577.  
  1578.     set(vscroll,MUIA_Prop_Entries,255) -> entries not set correctely..
  1579.     set(pfunc,MUIA_P_WindowObject,window)
  1580.  
  1581.     doMethodA(app,[OM_ADDMEMBER,window])  /* Now the project window is ready;*/
  1582.     get(pfunc,MUIA_PlaneFunc_Name,{name}) /*  the PlaneFunc class has also initialised.*/
  1583.     set(window,MUIA_Window_Title,name) -> Read the default PlaneFunc name
  1584.     pdata:=INST_DATA(cl_planefunc.mcc_class,pfunc)
  1585.     pdata.hscroll:=hscroll
  1586.     pdata.vscroll:=vscroll
  1587.     doMethodA(hscroll,[MUIM_Notify,MUIA_Prop_First,MUIV_EveryTime,pfunc,3,MUIM_Set,MUIA_PlaneFunc_Left,MUIV_TriggerValue])
  1588.     doMethodA(vscroll,[MUIM_Notify,MUIA_Prop_First,MUIV_EveryTime,pfunc,3,MUIM_Set,MUIA_PlaneFunc_Top,MUIV_TriggerValue])
  1589.     doMethodA(window,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,pfunc,1,MUIM_PlaneFunc_Close])
  1590.     doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'space',pfunc,1,MUIM_PlaneFunc_SetSize])
  1591.     get(pfunc,MUIA_PlaneFunc_ProjectID,{pid})
  1592.  
  1593.     set(window,MUIA_Window_ID,$12345678+pid) -> stupid but unique id for a project :-)
  1594.  
  1595.     doMethodA(obj,[MUIM_List_InsertSingle,pdata,MUIV_List_Insert_Bottom])
  1596.     set(window,MUIA_Window_Open,MUI_TRUE) -> Open the window when everything is finished
  1597.     set(obj,MUIA_List_Active,MUIV_List_Active_Bottom)
  1598.     doMethodA(obj,[MUIM_ProjectList_Memory]) -> Update memory display when opening a project
  1599.  
  1600. ENDPROC
  1601.  
  1602. PROC projectList_notify(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_notify)
  1603. DEF data:PTR TO projectList_data,gadid,z,gad,value,pid
  1604.     data:=INST_DATA(cl,obj)
  1605.     gad:=getcurrent(data,obj)
  1606.     IF gad = NIL THEN RETURN -> This should never happen (maybe put some error message?)
  1607.     value:=msg.value
  1608.     gadid:=msg.gadget
  1609.     SELECT gadid
  1610.     CASE MUIV_ProjectList_Notify_Name
  1611.         set(gad,MUIA_PlaneFunc_Name,value)
  1612.         doMethodA(obj,[MUIM_List_Redraw,MUIV_List_Redraw_Active])
  1613.     CASE MUIV_ProjectList_Notify_Type
  1614.         SELECT value
  1615.         CASE 0
  1616.             set(gad,MUIA_PlaneFunc_Type,MUIV_PlaneFunc_Type_DTPic)
  1617.         CASE 1
  1618.             set(gad,MUIA_PlaneFunc_Type,MUIV_PlaneFunc_Type_Graph)
  1619.         ENDSELECT
  1620.     CASE MUIV_ProjectList_Notify_ImageFile
  1621.         set(gad,MUIA_PlaneFunc_ImageFile,value)
  1622.     CASE MUIV_ProjectList_Notify_LoadM
  1623.         SELECT value
  1624.         CASE 0
  1625.             set(gad,MUIA_PlaneFunc_LoadM,MUIV_PlaneFunc_LoadM_Scale)
  1626.         CASE 1
  1627.             set(gad,MUIA_PlaneFunc_LoadM,MUIV_PlaneFunc_LoadM_CutTile)
  1628.         CASE 2
  1629.             set(gad,MUIA_PlaneFunc_LoadM,MUIV_PlaneFunc_LoadM_ChangeSize)
  1630.         ENDSELECT
  1631.     CASE MUIV_ProjectList_Notify_Red
  1632.         set(gad,MUIA_PlaneFunc_Rstr,value)
  1633.     CASE MUIV_ProjectList_Notify_Green
  1634.         set(gad,MUIA_PlaneFunc_Gstr,value)
  1635.     CASE MUIV_ProjectList_Notify_Blue
  1636.         set(gad,MUIA_PlaneFunc_Bstr,value)
  1637. /*    CASE MUIV_ProjectList_Notify_CompileR
  1638.         set(gad,MUIA_PlaneFunc_CompileR,value)
  1639.     CASE MUIV_ProjectList_Notify_CompileG
  1640.         set(gad,MUIA_PlaneFunc_CompileG,value)
  1641.     CASE MUIV_ProjectList_Notify_CompileB
  1642.         set(gad,MUIA_PlaneFunc_CompileB,value)
  1643. */    CASE MUIV_ProjectList_Notify_OutputR
  1644.         set(gad,MUIA_PlaneFunc_OutputR,value)
  1645.     CASE MUIV_ProjectList_Notify_OutputG
  1646.         set(gad,MUIA_PlaneFunc_OutputG,value)
  1647.     CASE MUIV_ProjectList_Notify_OutputB
  1648.         set(gad,MUIA_PlaneFunc_OutputB,value)
  1649.     CASE MUIV_ProjectList_Notify_Width
  1650.         set(gad,MUIA_PlaneFunc_Width,Val(value))
  1651.     CASE MUIV_ProjectList_Notify_Height
  1652.         set(gad,MUIA_PlaneFunc_Height,Val(value))
  1653.     ENDSELECT
  1654. ENDPROC
  1655.  
  1656. PROC projectList_prefs(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_prefs) -> a future version may require semaphore, but not for now.
  1657. DEF data:PTR TO projectList_data,d:PTR TO planeFunc_data,count,i
  1658.     msg.var[]:=msg.value
  1659.  
  1660.     IF (msg.var={dithm}) -> In these cases we've got to update the drawhandle for all windows
  1661.  
  1662.         data:=INST_DATA(cl,obj)
  1663.         IF currid > -1
  1664.             set(state_txt,MUIA_Text_Contents,cat.msgs_DrawHandle.getstr())
  1665.             set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_Processing)
  1666.             set(state_gau,MUIA_Gauge_Current,0)
  1667.         ENDIF
  1668.         get(obj,MUIA_List_Entries,{count})
  1669.         FOR i:=0 TO (count-1)
  1670.             doMethodA(opened_lst,[MUIM_List_GetEntry,i,{d}])
  1671.             doMethodA(d.self,[MUIM_PlaneFunc_DrawHandle])
  1672.         ENDFOR
  1673.         obj:=getcurrent(data,obj); IF obj THEN setlamp(obj)
  1674.     ENDIF
  1675. ENDPROC
  1676.  
  1677. /*This method reads all attributes of the current class and writes the state of the gadgets
  1678. in the settings window*/
  1679. PROC projectList_refresh(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_refresh)
  1680. DEF data:PTR TO projectList_data,nm:PTR TO CHAR,gad,value,q[11]:STRING,pid,win
  1681. DEF i,count,ogad,d:PTR TO planeFunc_data
  1682.  
  1683.     IF quiet=TRUE THEN RETURN
  1684.     data:=INST_DATA(cl,obj)
  1685.     gad,win:=getcurrent(data,obj)
  1686.     IF gad=NIL
  1687.         set(sgroup,MUIA_Disabled,MUI_TRUE)
  1688.         doMethodA(menus,[MUIM_SetUDataOnce,MENU_Project,MUIA_Menu_Enabled,FALSE])
  1689.         currid:=-1
  1690.         RETURN
  1691.     ENDIF
  1692.     set(sgroup,MUIA_Disabled,FALSE)
  1693.     doMethodA(menus,[MUIM_SetUDataOnce,MENU_Project,MUIA_Menu_Enabled,MUI_TRUE])
  1694. /*Unimplemented features:*/
  1695.     set(size_rad,MUIA_Disabled,MUI_TRUE)
  1696.     get(gad,MUIA_PlaneFunc_ProjectID,{pid})
  1697.     IF pid <> currid /*was currid and will be pid*/
  1698.        ogad:=getp(data,currid)
  1699.         IF ogad <> NIL
  1700.             doMethodA(ogad,[MUIM_PlaneFunc_SetTaskPri,rp])
  1701.         ENDIF
  1702.         doMethodA(gad,[MUIM_PlaneFunc_SetTaskPri,cp])
  1703.     ENDIF
  1704.  
  1705.     currid:=pid
  1706.     IF msg.ostate=FALSE
  1707.         doMethodA(gad,[MUIM_PlaneFunc_Lamps])
  1708.         StringF(q,'r(\d,x,y)=',pid)
  1709.         set(r_lbl,MUIA_Text_Contents,q)
  1710.         StringF(q,'g(\d,x,y)=',pid)
  1711.         set(g_lbl,MUIA_Text_Contents,q)
  1712.         StringF(q,'b(\d,x,y)=',pid)
  1713.         set(b_lbl,MUIA_Text_Contents,q)
  1714.         get(gad,MUIA_PlaneFunc_Name,{value})
  1715.         nnset(name_str,MUIA_String_Contents,value)   /*nnset to avoid triggering useless notification*/
  1716.         get(gad,MUIA_PlaneFunc_Type,{value})
  1717.         SELECT value
  1718.         CASE MUIV_PlaneFunc_Type_DTPic
  1719.             nnset(type_reg,MUIA_Group_ActivePage,0)
  1720.         CASE MUIV_PlaneFunc_Type_Graph
  1721.             nnset(type_reg,MUIA_Group_ActivePage,1)
  1722.         ENDSELECT
  1723.  
  1724.         get(gad,MUIA_PlaneFunc_LoadM,{value})  /* these are for image-projects*/
  1725.         SELECT value                           
  1726.         CASE MUIV_PlaneFunc_LoadM_Scale        /* but all settings are updated, so that */   
  1727.             nnset(size_rad,MUIA_Radio_Active,0)/* the user may change the selected page and*/
  1728.         CASE MUIV_PlaneFunc_LoadM_CutTile      /*see the current settings..*/                
  1729.             nnset(size_rad,MUIA_Radio_Active,1)
  1730.         CASE MUIV_PlaneFunc_LoadM_ChangeSize
  1731.             nnset(size_rad,MUIA_Radio_Active,2)
  1732.         ENDSELECT
  1733.         get(gad,MUIA_PlaneFunc_ImageFile,{value})
  1734.         nnset(path_str,MUIA_String_Contents,value)
  1735.  
  1736.         get(gad,MUIA_PlaneFunc_Rstr,{value})   /*these are for function-projects*/
  1737.         nnset(red_str,MUIA_String_Contents,value)
  1738.         get(gad,MUIA_PlaneFunc_Gstr,{value})
  1739.         nnset(green_str,MUIA_String_Contents,value)
  1740.         get(gad,MUIA_PlaneFunc_Bstr,{value})
  1741.         nnset(blue_str,MUIA_String_Contents,value)
  1742.         get(gad,MUIA_PlaneFunc_OutputR,{value})
  1743.         nnset(outr_cyc,MUIA_Cycle_Active,value)
  1744.         get(gad,MUIA_PlaneFunc_OutputG,{value})
  1745.         nnset(outg_cyc,MUIA_Cycle_Active,value)
  1746.         get(gad,MUIA_PlaneFunc_OutputB,{value})
  1747.         nnset(outb_cyc,MUIA_Cycle_Active,value)
  1748.         get(gad,MUIA_PlaneFunc_Width,{value})
  1749.         nnset(width_str,MUIA_String_Integer,value)
  1750.         get(gad,MUIA_PlaneFunc_Height,{value})
  1751.         nnset(height_str,MUIA_String_Integer,value)
  1752.         get(win,MUIA_Window_Open,{value})
  1753.         nnset(showme_cyc,MUIA_Cycle_Active,value)
  1754.         nm:=doMethodA(menus,[MUIM_FindUData,MENU_P_Visible])
  1755.         nnset(nm,MUIA_Menuitem_Checked,value)
  1756.     ENDIF
  1757.     IF (msg.ostate = FALSE) OR (msg.ostate-2=pid)
  1758.         setlamp(gad)
  1759.     ENDIF
  1760.     IF msg.ostate > 0
  1761.         pid:=msg.ostate-2
  1762.  
  1763.         get(obj,MUIA_List_Entries,{count})
  1764.         FOR i:=0 TO (count-1)
  1765.             doMethodA(obj,[MUIM_List_GetEntry,i,{d}])
  1766.             EXIT d.projectid=pid
  1767.         ENDFOR
  1768.         doMethodA(obj,[MUIM_List_Redraw,i]) -> Maybe should I call here similar method for the other project-list object?
  1769.     ENDIF
  1770. ENDPROC
  1771.  
  1772. PROC setlamp(gad:PTR TO object)
  1773. DEF value
  1774.     get(gad,MUIA_PlaneFunc_State,{value})
  1775.     SELECT value
  1776.     CASE MUIV_PlaneFunc_State_Idle
  1777.         set(state_txt,MUIA_Text_Contents,cat.msgs_Idle.getstr())
  1778.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_Off)
  1779.         set(state_gau,MUIA_Gauge_Current,0)
  1780.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Render.getstr())
  1781.         doMethodA(menus,[MUIM_SetUDataOnce,MENU_P_Render,MUIA_Menuitem_Title,cat.msgl_Render.getstr()])
  1782.     CASE MUIV_PlaneFunc_State_Drawing
  1783.         set(state_txt,MUIA_Text_Contents,cat.msgs_Drawing.getstr())
  1784.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_Processing)
  1785.         get(gad,MUIA_PlaneFunc_Percent,{value})
  1786.         set(state_gau,MUIA_Gauge_Current,value)
  1787.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Pause.getstr())
  1788.         doMethodA(menus,[MUIM_SetUDataOnce,MENU_P_Render,MUIA_Menuitem_Title,cat.msgl_Pause.getstr()])
  1789.     CASE MUIV_PlaneFunc_State_Loading
  1790.         set(state_txt,MUIA_Text_Contents,cat.msgs_Loading.getstr())
  1791.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_LoadingData)
  1792.         get(gad,MUIA_PlaneFunc_Percent,{value})
  1793.         set(state_gau,MUIA_Gauge_Current,value)
  1794.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Pause.getstr())
  1795.         doMethodA(menus,[MUIM_SetUDataOnce,MENU_P_Render,MUIA_Menuitem_Title,cat.msgl_Pause.getstr()])
  1796.     CASE MUIV_PlaneFunc_State_Paused
  1797.         set(state_txt,MUIA_Text_Contents,cat.msgs_Paused.getstr())
  1798.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_Ok)
  1799.         get(gad,MUIA_PlaneFunc_Percent,{value})
  1800.         set(state_gau,MUIA_Gauge_Current,value)
  1801.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Restart.getstr())
  1802.         doMethodA(menus,[MUIM_SetUDataOnce,MENU_P_Render,MUIA_Menuitem_Title,cat.msgl_Restart.getstr()])
  1803.     CASE MUIV_PlaneFunc_State_Frozen
  1804.         set(state_txt,MUIA_Text_Contents,cat.msgs_Frozen.getstr())
  1805.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_SendingData) -> That project is sending some data to others ;-)
  1806.         set(state_gau,MUIA_Gauge_Current,0)
  1807.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Render.getstr()) -> maybe pointless? [user can't use this button!]
  1808.         doMethodA(menus,[MUIM_SetUDataOnce,MENU_P_Render,MUIA_Menuitem_Title,cat.msgl_Render.getstr()])
  1809.     ENDSELECT
  1810. ENDPROC
  1811.  
  1812. PROC useprefs()
  1813. /*Don't forget to update this once adding prefs :-)*/
  1814. #define prCount 8
  1815.  
  1816. DEF iff:PTR TO iffhandle,sp:storedproperty,prefs:PTR TO chunkSeeker,dt:PTR TO CHAR
  1817.  
  1818.     iff:=AllocIFF()
  1819.     iff.stream:=Open('ENV:picFX.prefs',NEWFILE)
  1820.     IF iff.stream = NIL THEN RETURN
  1821.     InitIFFasDOS(iff)
  1822.     OpenIFF(iff,IFFF_WRITE)
  1823.  
  1824.     PushChunk(iff,"PPRF",ID_FORM,prCount*4+12)
  1825.  
  1826.     PushChunk(iff,"PPRF","BODY",prCount*4)
  1827.  
  1828.     NEW dt[prCount*4]
  1829.     sp.data:=dt
  1830.     sp.size:=prCount*4
  1831.     NEW prefs.create(sp)
  1832.  
  1833.     prefs.write(mainpri_sld,MUIA_Slider_Level)
  1834.     prefs.write(renderpri_sld,MUIA_Slider_Level)
  1835.     prefs.write(currpri_sld,MUIA_Slider_Level)
  1836.     prefs.write(renderupdate_sld,MUIA_Slider_Level)
  1837.     prefs.write(close_cyc,MUIA_Cycle_Active)
  1838.     prefs.write(showmess_chk,MUIA_Selected)
  1839.     prefs.write(dither_cyc,MUIA_Cycle_Active)
  1840.     prefs.write(recompile_chk,MUIA_Selected)
  1841.  
  1842.     WriteChunkBytes(iff,prefs.data,prCount*4)
  1843.     PopChunk(iff)
  1844.     PopChunk(iff)
  1845.  
  1846.     CloseIFF(iff)
  1847.     Close(iff.stream)
  1848.     FreeIFF(iff)
  1849.  
  1850.     END dt
  1851. ENDPROC
  1852.  
  1853. PROC loadprefs() HANDLE
  1854. DEF iff:PTR TO iffhandle,sp:storedproperty,b:PTR TO LONG,prefs:PTR TO chunkSeeker,out
  1855. DEF context:PTR TO contextnode,k[5]:STRING
  1856. DEF p:PTR TO LONG
  1857.  
  1858.     iff:=AllocIFF()
  1859.     iff.stream:=Open('env:picFX.prefs',OLDFILE)
  1860.     IF iff.stream = NIL THEN Raise("OPEN")
  1861.     InitIFFasDOS(iff)
  1862.     OpenIFF(iff,IFFF_READ)
  1863.  
  1864.     LOOP
  1865.         out:=ParseIFF(iff,IFFPARSE_RAWSTEP)
  1866.         IF out * (out - IFFERR_EOC) THEN Raise("PARS") -> An eof is an error, too
  1867.         context:=CurrentChunk(iff)
  1868.         IF context
  1869.             IF (context.id="BODY") AND (context.type="PPRF") THEN
  1870.                 JUMP offloop
  1871.         ENDIF
  1872.     ENDLOOP
  1873. offloop:
  1874.     sp.size:=context.size
  1875.     sp.data:=NewR(context.size)
  1876.     p:=sp.data
  1877.     IF (out:=ReadChunkBytes(iff,sp.data,sp.size)) <> sp.size THEN Raise("PARS")
  1878.  
  1879.     /*IF sp = NIL THEN Raise("PARS")*/
  1880.  
  1881.     NEW prefs.create(sp)
  1882.  
  1883.     prefs.read(mainpri_sld,MUIA_Slider_Level)
  1884.     prefs.read(renderpri_sld,MUIA_Slider_Level)
  1885.     prefs.read(currpri_sld,MUIA_Slider_Level)
  1886.     prefs.read(renderupdate_sld,MUIA_Slider_Level)
  1887.     prefs.read(close_cyc,MUIA_Cycle_Active)
  1888.     prefs.read(showmess_chk,MUIA_Selected)
  1889.     prefs.read(dither_cyc,MUIA_Cycle_Active)
  1890.     prefs.read(recompile_chk,MUIA_Selected)
  1891. EXCEPT DO
  1892.     IF exception THEN WriteF('exception \s (Sorry for being unfriendly ;-)\n',IdtoStr(exception,k))
  1893.     IF iff
  1894.         IF iff.stream
  1895.             CloseIFF(iff)
  1896.             Close(iff.stream)
  1897.         ENDIF
  1898.         FreeIFF(iff)
  1899.     ENDIF
  1900.     Dispose(sp.data) -> I know it is not required, but it is maybe cleaner so? :-)
  1901. ENDPROC
  1902.  
  1903. PROC projectList_saveprefs(/*cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg*/)
  1904.     useprefs()
  1905.     Execute('Copy env:picFX.prefs TO envarc:',NIL,NIL)
  1906. ENDPROC
  1907.  
  1908. PROC projectList_setpri(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_setpri)
  1909. DEF data:PTR TO projectList_data,task,d:PTR TO planeFunc_data
  1910. DEF cs:PTR TO object,i,count
  1911.     data:=INST_DATA(cl,obj)
  1912.     task:=msg.task
  1913.     SELECT task
  1914.     CASE MUIV_ProjectList_SetPri_Main
  1915.         SetTaskPri(FindTask(0),msg.value)
  1916.     CASE MUIV_ProjectList_SetPri_Render
  1917.         rp:=msg.value
  1918.         get(obj,MUIA_List_Entries,{count})
  1919.         FOR i:=0 TO (count-1)
  1920.             doMethodA(obj,[MUIM_List_GetEntry,i,{d}])
  1921.             IF d.projectid<>currid
  1922.                 doMethodA(d.self,[MUIM_PlaneFunc_SetTaskPri,rp])
  1923.             ENDIF
  1924.         ENDFOR
  1925.     CASE MUIV_ProjectList_SetPri_Curr
  1926.         cp:=msg.value
  1927.         i:=getcurrent(data,obj)
  1928.         IF i
  1929.             doMethodA(i,[MUIM_PlaneFunc_SetTaskPri,cp])
  1930.         ENDIF
  1931.     ENDSELECT
  1932. ENDPROC
  1933.  
  1934. PROC projectList_showme(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_showme)
  1935. DEF d:PTR TO planeFunc_data,win
  1936.  
  1937.     doMethodA(obj,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{d}])
  1938.     IF d=NIL THEN RETURN
  1939.     get(d.self,MUIA_P_WindowObject,{win})
  1940.     set(win,MUIA_Window_Open,msg.value)
  1941. ENDPROC
  1942.  
  1943. PROC projectList_insertInList(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_iil)
  1944. DEF data:PTR TO planeFunc_data
  1945.     data:=INST_DATA(cl,obj)
  1946.  
  1947.     doMethodA(obj,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{data}])
  1948.     IF data = NIL THEN RETURN -> Either no project is active or there is no project at all
  1949.     doMethodA(msg.list,[MUIM_List_InsertSingle,data,MUIV_List_Insert_Bottom])
  1950. ENDPROC
  1951.  
  1952. /*Should I check here that the project actually exists?*/
  1953. PROC projectList_displayer(dest:PTR TO LONG,entry:PTR TO planeFunc_data)
  1954.     dest[0]:=dataFormat(entry)
  1955. ENDPROC NIL
  1956.  
  1957. PROC dataFormat(data:PTR TO planeFunc_data)
  1958. DEF r:PTR TO CHAR
  1959. DEF z=32,pid
  1960.  
  1961.     r:=String(StrLen(data.name)+4)
  1962.     get(data.self,MUIA_PlaneFunc_State,{z})
  1963.     IF (z=MUIV_PlaneFunc_State_Drawing) OR (z=MUIV_PlaneFunc_State_Loading)
  1964.         z:=33
  1965.     ELSE
  1966.         z:=32
  1967.     ENDIF
  1968.     get(data.self,MUIA_PlaneFunc_ProjectID,{pid})
  1969.     StringF(r,'\d\c:\s',pid,z,data.name)
  1970. ENDPROC r
  1971.  
  1972. /***************************************************************
  1973. ** custom uSlider private subclass of Slider class            **
  1974. ****************************************************************
  1975. *                                                              *
  1976. *Simple sub-class of Slider, overriding MUIM_Numeric_Stringify *
  1977. *                                                              *
  1978. ***************************************************************/
  1979. PROC uslider_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_numeric_stringify)
  1980. DEF data:PTR TO uslider_data,methodid
  1981.     methodid:=msg.methodid
  1982.     SELECT methodid
  1983.     CASE OM_NEW;RETURN uslider_new(cl,obj,msg)
  1984.     CASE MUIM_Numeric_Stringify
  1985.         data:=INST_DATA(cl,obj)
  1986.         IF data.stringify=MUI_TRUE
  1987.             data.buffer:=String(10) -> Mysterious bug fixed like that :-( => leaving unused allocated memory on *each* call to this method (freed at program quit)
  1988.             IF msg.value = 0
  1989.                 StrCopy(data.buffer,cat.msgp_guNone.getstr())
  1990.             ELSEIF msg.value=1
  1991.                 StringF(data.buffer,'\d \s',msg.value,cat.msgp_Pixel.getstr())
  1992.             ELSE
  1993.                 StringF(data.buffer,'\d \s',msg.value,cat.msgp_Pixels.getstr())
  1994.             ENDIF
  1995.             RETURN data.buffer
  1996.         ENDIF
  1997.     CASE MUIM_uSlider_Bigger;RETURN uslider_bigger(obj,msg)
  1998.     CASE MUIM_uSlider_Smaller;RETURN uslider_smaller(obj,msg)
  1999.     CASE MUIM_Cleanup
  2000.         data:=INST_DATA(cl,obj)
  2001.         IF data.stringify THEN
  2002.             DisposeLink(data.buffer)
  2003.     ENDSELECT
  2004. ENDPROC doSuperMethodA(cl,obj,msg)
  2005.  
  2006. PROC uslider_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opset)
  2007. DEF data:PTR TO uslider_data,
  2008.     tags:PTR TO tagitem,
  2009.     tag:PTR TO tagitem
  2010.  
  2011.     IF (obj:=doSuperMethodA(cl,obj,msg))=NIL THEN RETURN 0
  2012.  
  2013.     data:=INST_DATA(cl,obj)
  2014.     tags:=msg.attrlist
  2015.     WHILE tag:=NextTagItem({tags})
  2016.         IF (tag.tag=MUIA_uSlider_Stringify) AND (tag.data=MUI_TRUE)
  2017.             data.stringify:=tag.data
  2018.             data.buffer:=String(10)
  2019.         ENDIF
  2020.     ENDWHILE
  2021. ENDPROC obj
  2022.  
  2023. PROC uslider_bigger(obj:PTR TO object,msg:PTR TO args_compare)
  2024. DEF level
  2025.     get(obj,MUIA_Slider_Level,{level})
  2026.     IF level < msg.than THEN
  2027.         nnset(obj,MUIA_Slider_Level,msg.than)
  2028. ENDPROC
  2029.  
  2030. PROC uslider_smaller(obj:PTR TO object,msg:PTR TO args_compare)
  2031. DEF level
  2032.     get(obj,MUIA_Slider_Level,{level})
  2033.     IF level > msg.than THEN
  2034.         nnset(obj,MUIA_Slider_Level,msg.than)
  2035. ENDPROC
  2036.  
  2037. /***************************************************************
  2038. ** sizetxt class                                              **
  2039. ****************************************************************
  2040. *  textobject containing the size of the last loaded picture.  *
  2041. ***************************************************************/
  2042.  
  2043. OBJECT sizetxt_data
  2044.     buffer:PTR TO CHAR
  2045. ENDOBJECT
  2046.  
  2047. CONST MUIM_SizeTxt_Update=$FCB93800
  2048.  
  2049. OBJECT muip_stupd
  2050.     methodid
  2051.     width,height,depth
  2052.     projectid
  2053. ENDOBJECT
  2054.  
  2055. PROC sizetxt_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  2056. DEF methodid
  2057.     methodid:=msg.methodid
  2058.     SELECT methodid
  2059.     CASE OM_NEW;RETURN sizetxt_new(cl,obj,msg)
  2060.     CASE OM_DISPOSE;RETURN sizetxt_dispose(cl,obj,msg)
  2061.     CASE MUIM_SizeTxt_Update;RETURN sizetxt_update(cl,obj,msg)
  2062.     ENDSELECT
  2063. ENDPROC doSuperMethodA(cl,obj,msg)
  2064.  
  2065. PROC sizetxt_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  2066. DEF data:PTR TO sizetxt_data
  2067.     obj:=doSuperMethodA(cl,obj,msg)
  2068.     data:=INST_DATA(cl,obj)
  2069.     data.buffer:=String(50)
  2070. ENDPROC obj
  2071.  
  2072. PROC sizetxt_dispose(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  2073. DEF data:PTR TO sizetxt_data
  2074.     data:=INST_DATA(cl,obj)
  2075.     DisposeLink(data.buffer)
  2076. ENDPROC doSuperMethodA(cl,obj,msg)
  2077.  
  2078. PROC sizetxt_update(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_stupd)
  2079. DEF data:PTR TO sizetxt_data
  2080.     data:=INST_DATA(cl,obj)
  2081.     IF msg.projectid = currid
  2082.         StringF(data.buffer,'\s\d×\d×\d',cat.msgl_PicSize.getstr(),msg.width,msg.height,msg.depth)
  2083.         set(obj,MUIA_Text_Contents,data.buffer)
  2084.     ENDIF
  2085. ENDPROC
  2086.  
  2087. /********************...            ...*********...           ...***...
  2088. projecthold class 'contains' a project. Current can be changed using drag'n'drop
  2089. .                                                   ****/
  2090.  
  2091.  
  2092. PROC projecthold_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  2093. DEF methodid
  2094.     methodid:=msg.methodid
  2095.     SELECT methodid
  2096.     CASE OM_NEW       ; RETURN projecthold_new(cl,obj,msg)
  2097.     CASE OM_GET       ; RETURN projecthold_get(cl,obj,msg)
  2098.     CASE MUIM_DragQuery ; RETURN projecthold_dragquery(cl,obj,msg)
  2099.     CASE MUIM_DragDrop ; RETURN projecthold_dragdrop(cl,obj,msg)
  2100.     CASE MUIM_Projecthold_Animate ; RETURN projecthold_animate(cl,obj) -> This has not much to do with projecthold but I did not feel like putting a hook... hehe...
  2101.     CASE MUIM_Projecthold_StepAnimate ; RETURN projecthold_stepAnimate(cl,obj)
  2102.     ENDSELECT
  2103. ENDPROC doSuperMethodA(cl,obj,msg)
  2104.  
  2105. PROC projecthold_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  2106. DEF data:PTR TO projecthold_data
  2107.     obj:=doSuperMethodA(cl,obj,msg)
  2108.     IF obj=NIL THEN RETURN NIL
  2109.     data:=INST_DATA(cl,obj)
  2110.  
  2111.     data.animating:=FALSE;data.current:=NIL
  2112. ENDPROC obj
  2113.  
  2114. PROC projecthold_get(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opget)
  2115. DEF data:PTR TO projecthold_data,storage,attrid
  2116.     data:=INST_DATA(cl,obj)
  2117.     attrid:=msg.attrid
  2118.     storage:=msg.storage
  2119.     SELECT attrid
  2120.     CASE MUIA_Projecthold_Current
  2121.         ^storage:=data.current
  2122.     DEFAULT
  2123.         RETURN doSuperMethodA(cl,obj,msg)
  2124.     ENDSELECT
  2125. ENDPROC MUI_TRUE
  2126.  
  2127. PROC projecthold_dragquery(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_dragquery)
  2128.     IF (msg.obj=opened_lst) OR (msg.obj=render_lst) THEN RETURN MUIV_DragQuery_Accept
  2129. ENDPROC MUIV_DragQuery_Refuse
  2130.  
  2131. PROC projecthold_dragdrop(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_dragdrop)
  2132. DEF data:PTR TO projecthold_data,d
  2133.  
  2134.     data:=INST_DATA(cl,obj)
  2135.     doMethodA(msg.obj,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{d}])
  2136.     IF d = NIL THEN RETURN -> Either no project is active or there is no project at all
  2137.  
  2138.     set(obj,MUIA_Text_Contents,dataFormat(d))
  2139.  
  2140.     data.current:=d
  2141. ENDPROC 0
  2142.  
  2143. PROC projecthold_animate(cl:PTR TO iclass,obj:PTR TO object)
  2144. DEF data:PTR TO projecthold_data,infotext[60]:STRING
  2145. DEF k
  2146.     data:=INST_DATA(cl,obj)
  2147.  
  2148.     IF data.animating -> Then we abort the animation
  2149.         data.animating:=FALSE
  2150.         doMethodA(opened_lst,[MUIM_ProjectList_EnableProgram])
  2151.         set(animstatus_txt,MUIA_Text_Contents,cat.msgs_IdleAborted.getstr())
  2152.         set(doAnim_btn,MUIA_Text_Contents,cat.msga_StartAnimation.getstr())
  2153.         RETURN
  2154.     ENDIF
  2155.  
  2156.     IF data.current=NIL THEN RETURN -> there still may be a problem if the user deletes the selected project before running the animation..
  2157.  
  2158.     data.animating:=TRUE
  2159.     doMethodA(opened_lst,[MUIM_ProjectList_DisableProgram])
  2160.  
  2161.     /*Now we read the values found in the three fields*/
  2162.     get(savename_str,MUIA_String_Contents,{k})
  2163.     data.filenamebase:=k
  2164.     get(frames_str,MUIA_String_Integer,{k})
  2165.     data.frameCnt:=k! -> we save the count in float mode (like the variables)!!!
  2166.  
  2167.     set(doAnim_btn,MUIA_Text_Contents,cat.msga_AbortAnimation.getstr())
  2168.     StringF(infotext,cat.msgs_AnimatingFirst.getstr(),k)
  2169.     set(animstatus_txt,MUIA_Text_Contents,infotext)
  2170.  
  2171.     get(parameter_str,MUIA_String_Contents,{k})
  2172.     data.varname:=k
  2173.     setvariable(k,StrLen(k),0.,varlist_lst) -> Initialize the time to zero
  2174.  
  2175. /* The state of List_Active reflects the project that was last rendered.
  2176. Before starting, I put it to off (to avoid a project to be saved for nothing)*/
  2177.     set(render_lst,MUIA_List_Active,MUIV_List_Active_Off)
  2178.  
  2179.     doMethodA(obj,[MUIM_Projecthold_StepAnimate]) -> Launch the thing :-)
  2180.  
  2181. -> Remember that this method returns once the rendering of the first project of first frame has *started*
  2182. -> (and not once the animation is finished)
  2183. ENDPROC
  2184.  
  2185. PROC projecthold_stepAnimate(cl:PTR TO iclass,obj:PTR TO object)
  2186. DEF data:PTR TO projecthold_data,line,count,filename:PTR TO CHAR,time,
  2187.     pdata:PTR TO planeFunc_data,infotext[30]:STRING
  2188.  
  2189.     data:=INST_DATA(cl,obj)
  2190.  
  2191.     IF Not(data.animating) THEN RETURN
  2192.  
  2193.     get(render_lst,MUIA_List_Active,{line})
  2194.     get(render_lst,MUIA_List_Entries,{count})
  2195.     IF line = MUIV_List_Active_Off THEN line:=-1
  2196.  
  2197.     line++ -> ie we go to the next project (but not yet move the cursor)
  2198.  
  2199.     IF line = count -> ie we are now over with rendering (line # line does not exist)
  2200.         time:=getvariable(data.varname,StrLen(data.varname),varlist_lst)
  2201.         /*Now save the picture*/
  2202.         filename:=String(StrLen(data.filenamebase)+4)
  2203.         StringF(filename,'\s.\z\d[3]',data.filenamebase,!time!) -> Quotes are not yet handled => risk of... "ram disk:anim".001 ... :-)
  2204.         StringF(infotext,cat.msgs_SavingFrame.getstr(),!time!,!data.frameCnt!)
  2205.         set(animstatus_txt,MUIA_Text_Contents,infotext)
  2206.         doMethodA(data.current::planeFunc_data.self,[MUIM_PlaneFunc_SavePic,MUI_TRUE,filename]) -> This method is synchrone...
  2207. -> Maybe display a message here
  2208.         DisposeLink(filename)
  2209.         line:=0 -> set back to line zero
  2210.  
  2211.         time:=!time+1. -> Let the time fly :-)
  2212.  
  2213.         IF !time >= data.frameCnt -> The work is over
  2214.             data.animating:=FALSE
  2215.             doMethodA(opened_lst,[MUIM_ProjectList_EnableProgram])
  2216.             set(animstatus_txt,MUIA_Text_Contents,cat.msgs_Idle.getstr())
  2217.             set(doAnim_btn,MUIA_Text_Contents,cat.msga_StartAnimation.getstr())
  2218.             RETURN
  2219.         ENDIF
  2220.         setvariable(data.varname,StrLen(data.varname),time,varlist_lst)
  2221.         StringF(infotext,cat.msgs_AnimatingFrame.getstr(),!time!,!data.frameCnt!)
  2222.         set(animstatus_txt,MUIA_Text_Contents,infotext)
  2223.     ENDIF
  2224.  
  2225.     set(render_lst,MUIA_List_Active,line) -> This is actually just to show the user what is going on
  2226.  
  2227.     doMethodA(render_lst,[MUIM_List_GetEntry,line,{pdata}])
  2228.     -> Now find out which project this is, start its rendering and exit that method.
  2229.     doMethodA(pdata.self,[MUIM_PlaneFunc_Render])
  2230.  
  2231. ENDPROC -> This method will be called again once the rendering is over
  2232.  
  2233. PROC myapp_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_application_returnid)
  2234. DEF btns
  2235.     IF msg.methodid=MUIM_Application_ReturnID
  2236.         IF msg.retid=MUIV_Application_ReturnID_Quit  /*separate IFs to avoid illegal memory access, if the message hasn't any argument*/
  2237.             btns:=String(StrLen(cat.msgr_Quit.getstr())+StrLen(cat.msgr_Cancel.getstr())+1)
  2238.             StringF(btns,'\s|\s',cat.msgr_Quit.getstr(),cat.msgr_Cancel.getstr())
  2239.             IF Mui_RequestA(app,settings_win,0,cat.msgr_QuitProgram.getstr(),btns,
  2240.                     cat.msgr_QuitProgramLong.getstr(),[]) <> 1
  2241.                 DisposeLink(btns)
  2242.                 RETURN 0
  2243.             ENDIF
  2244.             DisposeLink(btns)
  2245.             doMethodA(opened_lst,[MUIM_ProjectList_Exit]) -> This will cause the Exit method to be executed right before
  2246.         ENDIF
  2247.     ENDIF                                           -> ReturnId (when called with Exit returnid)
  2248. ENDPROC doSuperMethodA(cl,obj,msg)
  2249.  
  2250. PROC sendsubtaskmsg(st:PTR TO subtask,command,params)
  2251.     IF st.st_Port=NIL THEN RETURN
  2252.     st.st_Message.stm_Message.replyport:= st.st_Reply
  2253.     st.st_Message.stm_Message.length   := SIZEOF subtaskmsg
  2254.     st.st_Message.stm_Command          := command
  2255.     st.st_Message.stm_Parameter        := params
  2256.     st.st_Message.stm_Result           := 0
  2257.     PutMsg(IF command=STC_STARTUP THEN st.st_Task::process.msgport ELSE st.st_Port,st.st_Message)
  2258.     WaitPort(st.st_Reply)          /*gets the reply*/
  2259.     GetMsg(st.st_Reply)
  2260. ENDPROC (st.st_Message.stm_Result)
  2261.  
  2262. PROC killsubtask(data:PTR TO planeFunc_data)
  2263.     IF data.type = MUIV_PlaneFunc_Type_Graph THEN
  2264.         sendsubtaskmsg(data.subtask,STC_SHUTDOWN,data.subtask)
  2265.     wait_one_fork()
  2266.     IF data.type = MUIV_PlaneFunc_Type_Graph
  2267.         free(data.rfunc)
  2268.         free(data.gfunc)
  2269.         free(data.bfunc)                    
  2270.         IF data.subtask.st_Reply THEN
  2271.             DeleteMsgPort(data.subtask.st_Reply)
  2272.     ENDIF
  2273.     FreeVec(data.subtask);data.subtask:=NIL
  2274. ENDPROC
  2275.  
  2276. /***************************************************************
  2277. **    Subtask which does all the time-consuming rendering     **
  2278. ***************************************************************/
  2279.  
  2280. PROC renderfunc(data:PTR TO planeFunc_data)
  2281. DEF st=NIL:PTR TO subtask,
  2282.     worktodo=TRUE,x,y,
  2283.     stm=NIL:PTR TO subtaskmsg,
  2284.     command,i,
  2285.     red,green,blue,lr:PTR TO longreal,cnt,oldpixel,oldid:PTR TO LONG,
  2286.     rf,gf,bf,rc,gc,bc
  2287.  
  2288.     st:=data.subtask
  2289.  
  2290.     ObtainSemaphore(data.sema)
  2291. /*                    data.drawn:=-1
  2292.                     data.calculated:=-1
  2293. */
  2294.     DateStamp(data.ds)
  2295.     oldid:=data.imagedata
  2296.     data.imagedata:=AllocMem(data.width*data.height*4,MEMF_PUBLIC OR MEMF_CLEAR);data.vec:=TRUE
  2297.  
  2298.     ReleaseSemaphore(data.sema)
  2299.  
  2300.     y:=0->;cnt:=data.rupd
  2301.     i:=0
  2302.     NEW lr
  2303.     rf:=data.rfunc.calculate
  2304.     gf:=data.gfunc.calculate
  2305.     bf:=data.bfunc.calculate
  2306.     rc:=data.rfunc.precalc
  2307.     gc:=data.gfunc.precalc
  2308.     bc:=data.bfunc.precalc
  2309.  
  2310.     LOOP
  2311.         WHILE (stm:= GetMsg(st.st_Port))
  2312.             command:=stm.stm_Command
  2313.             SELECT command
  2314.             CASE STC_SHUTDOWN
  2315.                 JUMP exit
  2316.             CASE STC_PAUSE
  2317.                 worktodo:= FALSE
  2318.             CASE STC_RESTART -> Deactivate pause
  2319.                 worktodo:=TRUE
  2320.             ENDSELECT
  2321.             ReplyMsg(stm.stm_Message)
  2322.         ENDWHILE
  2323.  
  2324.         IF (worktodo)
  2325.             /* if there is work to do, i.e. if the rendering is not
  2326.                finished yet, we calculate the next line and draw
  2327.                it to the offscreen rastport.*/
  2328.  
  2329.             IF data.outputr=OUT_Integer      /*red*/
  2330.                 rc(x,y)
  2331.             ELSEIF data.outputr=OUT_Float32
  2332.                 rc(x!,y!)
  2333.             ENDIF
  2334.             IF data.outputg=OUT_Integer      /*green*/
  2335.                 gc(x,y)
  2336.             ELSEIF data.outputg=OUT_Float32
  2337.                 gc(x!,y!)
  2338.             ENDIF
  2339.             IF data.outputb=OUT_Integer      /*blue*/
  2340.                 bc(x,y)
  2341.             ELSEIF data.outputb=OUT_Float32
  2342.                 bc(x!,y!)
  2343.             ENDIF
  2344.  
  2345.             ObtainSemaphore(data.sema)
  2346.  
  2347.             IF data.savepixel THEN
  2348.                 oldpixel:=oldid[i] ->pixel(oldid,data.width,0,y)
  2349.  
  2350.             FOR x:=0 TO data.width-1
  2351.                 IF data.outputr=OUT_Integer      /*red*/
  2352.  
  2353.                     red:=rf(x,y)
  2354.                     red:=modt(red)
  2355.                     red:=Shl(red,16)
  2356.                 ELSEIF data.outputr=OUT_Float32
  2357.                     red:=!rf(x!,y!)!
  2358.                     red:=modt(red)
  2359.                     red:=Shl(red,16)
  2360.                 /*ELSEIF data.outputr=OUT_Float64
  2361.                     rproc(x,y,lr,data.rfunc)
  2362.                     red:=dFix(lr)
  2363.                     red:=modt(red)
  2364.                     red:=Shl(red,16)*/
  2365.                 ELSEIF data.outputr=OUT_OldR
  2366.                     red:=oldpixel AND $FF0000
  2367.                 ELSEIF data.outputr=OUT_OldG
  2368.                     red:=Shl(oldpixel AND $FF00,8)
  2369.                 ELSE /*IF data.outputr=OUT_OldB*/
  2370.                     red:=Shl(oldpixel AND $FF,16)
  2371.                 ENDIF
  2372.                 IF data.outputg=OUT_Integer      /*green*/
  2373.                     green:=gf(x,y)
  2374.                     green:=modt(green)
  2375.                     green:=Shl(green,8)
  2376.                 ELSEIF data.outputg=OUT_Float32
  2377.                     green:=!gf(x!,y!)!
  2378.                     green:=modt(green)
  2379.                     green:=Shl(green,8)
  2380.                 /*ELSEIF data.outputg=OUT_Float64
  2381.                     gproc(x,y,lr,data.gfunc)
  2382.                     green:=dFix(lr)
  2383.                     green:=modt(green)
  2384.                     green:=Shl(green,8)*/
  2385.                 ELSEIF data.outputg=OUT_OldR
  2386.                     green:=oldpixel AND $FF0000
  2387.                     green:=Shr(green,8)
  2388.                 ELSEIF data.outputg=OUT_OldG
  2389.                     green:=oldpixel AND $FF00
  2390.                 ELSEIF data.outputg=OUT_OldB
  2391.                     green:=oldpixel AND $FF
  2392.                     green:=Shl(green,8)
  2393.                 ELSE /*IF data.outputr=OUT_CopyR*/
  2394.                     green:=Shr(red,8)
  2395.                 ENDIF
  2396.                 IF data.outputb=OUT_Integer      /*blue*/
  2397.                     blue:=bf(x,y)
  2398.                     blue:=modt(blue)
  2399.                 ELSEIF data.outputb=OUT_Float32
  2400.                     blue:=!bf(x!,y!)!
  2401.                     blue:=modt(blue)
  2402.                 /*ELSEIF data.outputb=OUT_Float64
  2403.                     bproc(x,y,lr,data.bfunc)
  2404.                     blue:=dFix(lr)
  2405.                     blue:=modt(blue)*/
  2406.                 ELSEIF data.outputb=OUT_OldR
  2407.                     blue:=Shr(oldpixel,16)
  2408.                 ELSEIF data.outputb=OUT_OldG
  2409.                     blue:=Shr(oldpixel,8) AND $FF
  2410.                     blue:=blue AND $FF
  2411.                 ELSEIF data.outputb=OUT_OldB
  2412.                     blue:=oldpixel AND $FF
  2413.                 ELSEIF data.outputb=OUT_CopyR
  2414.                     blue:=Shr(red,16)
  2415.                 ELSE /*IF data.outputb=OUT_CopyG*/
  2416.                     blue:=Shr(green,8)
  2417.                 ENDIF
  2418.                 data.imagedata[i]:=red+green+blue
  2419.                 i++
  2420.                 IF data.savepixel THEN
  2421.                     oldpixel:=oldid[i] ->pixel(data.imagedata,data.width,x+1,y)
  2422.             ENDFOR
  2423.             ReleaseSemaphore(data.sema)
  2424.             y++
  2425.  
  2426.             IF (y AND $F=0)
  2427.                 IF data.app
  2428.                     data.calculated:=y
  2429.                     doMethodA(app,[MUIM_Application_PushMethod,data.self,1,MUIM_PlaneFunc_Update])
  2430.                 ENDIF
  2431.             ENDIF
  2432.  
  2433.             IF (y=data.height)
  2434.                 /* check if we are finished to draw our picture */
  2435.                  worktodo:= FALSE
  2436.                 /*if we're finished, we ask the main task to exit ourselves..*/
  2437.                 IF data.picture THEN DeletePicture(data.picture)
  2438.                 data.picture:=MakePictureA(data.imagedata,data.width,data.height,[GGFX_PixelFormat,PIXFMT_0RGB_32,TAG_DONE])
  2439.                 doMethodA(app,[MUIM_Application_PushMethod,data.self,2,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Finish])
  2440.             ENDIF
  2441.             /* Since we are very busy working, we do not Wait() for signals. */
  2442.         ELSE
  2443.             /* We have nothing to do, just sit quietly and wait for something to happen */
  2444.             WaitPort(st.st_Port)
  2445.         ENDIF
  2446.     ENDLOOP
  2447. exit:
  2448.     END lr
  2449.     IF data.subtask.st_Port
  2450.         DeleteMsgPort(data.subtask.st_Port);data.subtask.st_Port:=NIL
  2451.         data.subtask.st_Port:=NIL
  2452.     ENDIF
  2453.     ReplyMsg(stm.stm_Message)
  2454.  
  2455. ENDPROC
  2456.  
  2457. PROC loadpicture(data:PTR TO planeFunc_data)
  2458. DEF w,h
  2459. DEF st=NIL:PTR TO subtask,
  2460.     x,y,
  2461.     stm=NIL:PTR TO subtaskmsg,
  2462.     command,i,
  2463.     cnt=0,init=2
  2464.  
  2465.     /*IF AttemptSemaphore(data.sema)
  2466.         WriteF('Went all right..\n')
  2467.     ELSE
  2468.         WriteF('The semaphore is locked!!!\n')
  2469.     ENDIF
  2470.     */
  2471.     ObtainSemaphore(data.sema)
  2472.     DateStamp(data.ds)
  2473.     IF data.picture
  2474.         DeletePicture(data.picture)
  2475.     ENDIF
  2476.     data.picture:=LoadPictureA(data.imagefilename,[TAG_DONE])
  2477.     IF data.picture = NIL  ->And if data.app=NIL ? :-)
  2478.         data.imagedata:=AllocMem(data.width*data.height*4,MEMF_CLEAR OR MEMF_PUBLIC);data.vec:=TRUE
  2479.         data.picture:=MakePictureA(data.imagedata,data.width,data.height,[GGFX_PixelFormat,PIXFMT_0RGB_32,TAG_DONE])
  2480.         ReleaseSemaphore(data.sema)
  2481.         doMethodA(app,[MUIM_Application_PushMethod,data.self,2,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_NoLoad])
  2482.     ELSE
  2483.         GetPictureAttrsA(data.picture,[PICATTR_PixelFormat,{x},TAG_DONE])
  2484.         IF x <> PIXFMT_0RGB_32 THEN
  2485.             DoPictureMethodA(data.picture,PICMTHD_RENDER,[PIXFMT_0RGB_32,TAG_DONE])
  2486.  
  2487.         IF TRUE ->data.loadm=MUIV_PlaneFunc_LoadM_ChangeSize
  2488.             GetPictureAttrsA(data.picture,[PICATTR_Width,{w},PICATTR_Height,{h},PICATTR_RawData,{x},TAG_DONE])
  2489.             data.imagedata:=x;data.vec:=FALSE
  2490.             doMethodA(app,[MUIM_Application_PushMethod,data.self,3,
  2491.                 MUIM_Set,MUIA_PlaneFunc_Quiet,-2])
  2492.             doMethodA(app,[MUIM_Application_PushMethod,data.self,3,
  2493.                 MUIM_Set,MUIA_PlaneFunc_Width,w])
  2494.             doMethodA(app,[MUIM_Application_PushMethod,data.self,3,
  2495.                 MUIM_Set,MUIA_PlaneFunc_Height,h])
  2496.             doMethodA(app,[MUIM_Application_PushMethod,data.self,3,
  2497.                 MUIM_Set,MUIA_PlaneFunc_Quiet,FALSE])
  2498.         ELSE -> MUIV_PlaneFunc_LoadM_Scale
  2499.             DoPictureMethodA(data.picture,PICMTHD_SCALE,[data.width,data.height,TAG_DONE])
  2500.         ENDIF
  2501.         ReleaseSemaphore(data.sema)
  2502.     -> No need to send an update message, as the quiet attribute-change did it for us.
  2503.         doMethodA(app,[MUIM_Application_PushMethod,data.self,2,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Finish])
  2504.     ENDIF
  2505.     Delay(10)
  2506. ENDPROC
  2507. /********************************
  2508. *   Inter-referencing...        *
  2509. ********************************/
  2510.  
  2511. PROC dataExists(data) -> returns TRUE if a project owning the given data exists.
  2512. DEF i,count,d:PTR TO planeFunc_data
  2513.  
  2514.     get(opened_lst,MUIA_List_Entries,{count})
  2515.  
  2516.     FOR i:=0 TO (count-1)
  2517.         doMethodA(opened_lst,[MUIM_List_GetEntry,i,{d}])
  2518.         IF d=data THEN RETURN TRUE
  2519.     ENDFOR
  2520.  
  2521. ENDPROC FALSE
  2522.  
  2523. /*freeze(expression): this will read-lock all used functions.
  2524. returns true if success, or false if failure*/
  2525.  
  2526. PROC freeze(f:PTR TO expression)
  2527. DEF a:PTR TO planeFunc_data,b,c,data:PTR TO projectList_data,obj,lock
  2528.     IF f.precision > OUT_Float64 THEN RETURN TRUE
  2529.     data:=INST_DATA(cl_projectlist.mcc_class,opened_lst)
  2530.  
  2531.     a,b,c:=f.reference()
  2532.     IF a > 3 -> direct reference to project "a" (a is the data of the object)
  2533.             /* + sub-functions "b" and "c"*/
  2534.         /*checks that a exists*/
  2535.         IF dataExists(a) = FALSE THEN RETURN FALSE
  2536.         obj:=a.self
  2537.         get(obj,MUIA_PlaneFunc_Lock,{lock})
  2538.         IF lock = MUIV_PlaneFunc_Lock_Write THEN RETURN FALSE
  2539.         set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_Read)
  2540.         IF freeze(b) = 0
  2541.             set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoRead)
  2542.             RETURN FALSE
  2543.         ENDIF
  2544.         IF freeze(c) = 0
  2545.             free(b) -> IF "c" can't be frozen, let's free "b" before returning
  2546.             set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoRead)
  2547.             RETURN FALSE
  2548.         ENDIF
  2549.         RETURN TRUE
  2550.     ENDIF
  2551.  
  2552.     SELECT a
  2553.     CASE 2 -> One sub-function : "b"
  2554.         IF freeze(b) = 0 THEN RETURN FALSE
  2555.     CASE 3 -> Two sub functions : "b" and "c"
  2556.         IF freeze(b) = 0 THEN RETURN FALSE
  2557.         IF freeze(c) = 0
  2558.             free(b) -> IF "c" can't be frozen, let's free "b" before returning
  2559.             RETURN FALSE
  2560.         ENDIF
  2561.     ENDSELECT
  2562. ENDPROC TRUE
  2563.  
  2564. /*free(expression): This un read-locks all used functions.
  2565. It assumes that freeze(function) has been executed before and that
  2566. function did not change since*/
  2567.  
  2568. PROC free(f:PTR TO expression)
  2569. DEF a:PTR TO planeFunc_data,b,c,data:PTR TO projectList_data,obj
  2570.  
  2571.     data:=INST_DATA(cl_projectlist.mcc_class,opened_lst)
  2572.  
  2573.     IF f.precision > OUT_Float64 THEN RETURN TRUE
  2574.  
  2575.     a,b,c:=f.reference()
  2576.     IF a > 3
  2577.         obj:=a.self
  2578.         set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoRead)
  2579.         a:=3 -> This will cause a problem if a function f(c,x), where c is a project, ever comes.
  2580.     ENDIF
  2581.     SELECT a
  2582.     CASE 2 -> One sub-expression : "b"
  2583.         free(b)
  2584.     CASE 3 -> Two sub-expressions : "b" and "c"
  2585.         free(b)
  2586.         free(c)
  2587.     ENDSELECT
  2588. ENDPROC
  2589.  
  2590. /***************************************************************
  2591. **                       main program                         **
  2592. ****************************************************************
  2593.  Opens the libraries, creates the user interface structure and
  2594. notifications. The input loop just waits for MUI to say to quit.
  2595. ***************************************************************/
  2596.  
  2597. PROC main() HANDLE
  2598. DEF l
  2599.     IF (localebase:=OpenLibrary('locale.library',0)) = NIL THEN
  2600.         Raise('locale.library')
  2601.     NEW cat.create()
  2602.     cat.open()
  2603.  
  2604.     IF (aslbase:=OpenLibrary('asl.library',37))=NIL THEN
  2605.         Raise('asl.library')
  2606.     IF (datatypesbase:=OpenLibrary('datatypes.library',0))=NIL THEN
  2607.         Raise('datatypes.library')
  2608.     IF (guigfxbase:=OpenLibrary('guigfx.library',10))=NIL THEN
  2609.         Raise('guiGFX.library')
  2610.     IF (iffparsebase:=OpenLibrary('iffparse.library',0))=NIL THEN
  2611.         Raise('iffparse.library')
  2612.     IF (muimasterbase:=OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN)) = NIL THEN
  2613.         Raise('muimaster.library')
  2614.     IF (utilitybase:=OpenLibrary('utility.library',36))=NIL THEN
  2615.         Raise('utility.library') /*for tag-list parsing*/
  2616.  
  2617.     funcdir:=String(19)
  2618.     StrCopy(funcdir,'progdir:')
  2619.     picdir:=String(18)
  2620.     StrCopy(picdir,'progdir:')
  2621.  
  2622.     init_fork([FORK_NAME,'picFX-Render Task',TAG_DONE])
  2623.  
  2624.     dInit(TRUE)
  2625.  
  2626.     NEW pl_displayer
  2627.     installhook(pl_displayer,{projectList_displayer})
  2628.  
  2629.     cl_planefunc:=eMui_CreateCustomClass(NIL,MUIC_Area ,NIL,SIZEOF planeFunc_data,{planeFunc_dispatcher})
  2630.     cl_projectlist:=eMui_CreateCustomClass(NIL,MUIC_List,NIL,SIZEOF projectList_data,{projectList_dispatcher})
  2631.     cl_uslider:=eMui_CreateCustomClass(NIL,MUIC_Slider,NIL,SIZEOF uslider_data,{uslider_dispatcher})
  2632.     cl_sizetxt:=eMui_CreateCustomClass(NIL,MUIC_Text,NIL,SIZEOF sizetxt_data,{sizetxt_dispatcher})
  2633.     cl_projecthold:=eMui_CreateCustomClass(NIL,MUIC_Text,NIL,SIZEOF projecthold_data,{projecthold_dispatcher})
  2634.     cl_myapp:=eMui_CreateCustomClass(NIL,MUIC_Application,NIL,SIZEOF empty_data,{myapp_dispatcher})
  2635.  
  2636.     ftype_registertitles:=[cat.msgl_type_Image.getstr(),cat.msgl_type_Function.getstr(),NIL]
  2637.     size_radiolabels:=[cat.msgl_lm_Scale.getstr(),cat.msgl_lm_CutTile.getstr(),cat.msgl_lm_Change.getstr(),NIL]
  2638.     showme_cyclelabels:=[cat.msgl_Hidden.getstr(),cat.msgl_Shown.getstr(),NIL]
  2639.     ccc() -> VarList
  2640.  
  2641.     FOR l:=0 TO 14
  2642.         messages[l]:=String(100)
  2643.     ENDFOR
  2644.  
  2645.     abouttext:=String(StrLen(cat.msg_AboutText.getstr())+StrLen(PICVERSION)+6)
  2646.     StringF(abouttext,'\ec\s\n\n\s',PICVERSION,cat.msg_AboutText.getstr())
  2647.  
  2648.     ->  NM_ITEM, Ø,'Text',               'shortcut',opt,(xcl),id
  2649.     menus:= [
  2650.     NM_TITLE,0,'picFX',0,0,0,0,
  2651.         NM_ITEM, 0,cat.msgn_AboutPicFX.getstr(),'?', 0,     0, MENU_G_About,
  2652.         NM_ITEM, 0, cat.msgn_AboutMui.getstr(), '_', 0,     0, MENU_G_AboutMui,
  2653.         NM_ITEM, 0, cat.msgl_Prefs.getstr(),    'F', 0,     0, MENU_G_Prefs,
  2654.         NM_ITEM, 0, cat.msgp_MuiPrefs.getstr(), 'D', 0,     0, MENU_G_PrefsMui,
  2655.         NM_ITEM, 0, NM_BARLABEL,                 0,  0,     0, 0,
  2656.         NM_ITEM, 0, cat.msgn_Animation.getstr(),'A', 0,     0, MENU_G_Animation,
  2657.         NM_ITEM, 0, cat.msgl_VarListWin.getstr(),'V',0,     0, MENU_G_Varlist,
  2658.         NM_ITEM, 0, cat.msgn_NewProject.getstr(),'N',0,     0, MENU_G_New,
  2659.         NM_ITEM, 0, NM_BARLABEL,                 0,  0,     0, 0,
  2660.         NM_ITEM, 0, cat.msgn_Hide.getstr(),     'H', 0,     0, MENU_G_Hide,
  2661.         NM_ITEM, 0, cat.msgn_Quit.getstr(),     'Q', 0,     0, MUIV_Application_ReturnID_Quit,
  2662.     NM_TITLE,0,'project',0,NM_MENUDISABLED,0,MENU_Project, -> I put an Id here to alow dis/enabling it.
  2663.         NM_ITEM, 0, cat.msgl_Render.getstr(),   'R', 0,     0, MENU_P_Render,
  2664.         NM_ITEM, 0, cat.msgl_Abort.getstr(),    'Z', 0,     0, MENU_P_Abort,
  2665.         NM_ITEM, 0, NM_BARLABEL,                 0,  0,     0, 0,
  2666.         NM_ITEM, 0, cat.msgn_Visible.getstr(),   0,CHECKIT, 0, MENU_P_Visible, -> Does not seem to accept shortcut for a checkit...
  2667.         NM_ITEM, 0, cat.msgl_Close.getstr(),    'K', 0,     0, MENU_P_Close,
  2668.         NM_ITEM, 0, cat.msgl_SavePic.getstr(),  'P', 0,     0, MENU_P_SaveP,
  2669.         NM_ITEM, 0, cat.msgn_ClearPic.getstr(),  0,  0,     0, MENU_P_Clear,
  2670.         NM_ITEM, 0, NM_BARLABEL,                 0,  0,     0, 0,
  2671.         NM_ITEM, 0, cat.msgl_LoadFunc.getstr(), 'L', 0,     0, MENU_P_LoadF,
  2672.         NM_ITEM, 0, cat.msgl_SaveFunc.getstr(), 'S', 0,     0, MENU_P_SaveF,
  2673.     NM_END,0,NIL,0,0,0,0]:newmenu
  2674.  
  2675.     /*Application structure. It might be nicer to create the window upon need instead of everything at start!*/
  2676.  
  2677.     app:=MyApplicationObject,
  2678.         MUIA_Application_Title, 'picFX',
  2679.         MUIA_Application_Version,FULLVERSION,
  2680.         MUIA_Application_Author, 'Maxime Gamboni',
  2681.         MUIA_Application_Description, cat.msg_Description.getstr(),
  2682.         MUIA_Application_Base,'picFX',
  2683.         MUIA_Application_Menustrip,menus:=Mui_MakeObjectA(MUIO_MenustripNM,[menus,0]),
  2684.  
  2685.         SubWindow,varlist_win:=WindowObject, -> This window must come before the project_list creation for initfuncs()
  2686.             MUIA_Window_Title,cat.msgl_VarListWin.getstr(),
  2687.             MUIA_Window_ID,"VARS",
  2688.             WindowContents,VGroup,
  2689.                 Child, varlist_lsv:=ListviewObject,
  2690.                     InputListFrame,
  2691.                     MUIA_Listview_List,varlist_lst:=VarListObject,End,
  2692.                 End,
  2693.                 Child, HGroup,
  2694.                     Child, varname_str:=StringObject,
  2695.                         StringFrame,
  2696.                         MUIA_Disabled,MUI_TRUE,
  2697.                         MUIA_String_AttachedList,varlist_lsv,
  2698.                         MUIA_CycleChain,MUI_TRUE,
  2699.                     End,
  2700.                     Child, TextObject,
  2701.                         MUIA_Text_Contents,'\ec=',
  2702.                     End,
  2703.                     Child, varval_str:=StringObject,
  2704.                         StringFrame,
  2705.                         MUIA_Disabled,MUI_TRUE,
  2706.                         MUIA_String_AttachedList,varlist_lsv,
  2707.                         MUIA_CycleChain,MUI_TRUE,
  2708.                     End,
  2709.                 End,
  2710.                 Child, HGroup,
  2711.                     Child, varadd_btn:=SimpleButton(cat.msgl_Add.getstr()),
  2712.                     Child, vardel_btn:=SimpleButton(cat.msgl_Del.getstr()),
  2713.                 End,
  2714.             End,
  2715.         End,
  2716.         SubWindow, settings_win:=WindowObject,
  2717.             MUIA_Window_Title, cat.msgl_Title.getstr(),
  2718.             MUIA_Window_ScreenTitle, PICVERSION,
  2719.             MUIA_Window_ID,"SETT",
  2720.             WindowContents,HGroup,
  2721.                 Child, VGroup,
  2722.                     MUIA_Weight,30,
  2723.                     Child, TextObject,
  2724.                         NoFrame,
  2725.                         MUIA_Text_PreParse,'\ec',
  2726.                         MUIA_Text_Contents,cat.msgl_OpenedProjects.getstr(),
  2727.                     End,
  2728.                     Child, opened_lsv:=ListviewObject,
  2729.                         InputListFrame,
  2730.                         MUIA_Listview_DragType,MUIV_Listview_DragType_Immediate,
  2731.                         MUIA_Listview_List,opened_lst:=ProjectListObject,MUIA_List_DisplayHook,pl_displayer,End,
  2732.                     End,
  2733.                     Child, new_btn:=SimpleButton(cat.msgl_New.getstr()),
  2734.                     Child, var_btn:=TextObject,
  2735.                         ButtonFrame,
  2736.                         MUIA_Background,MUII_ButtonBack,
  2737.                         MUIA_Text_PreParse,'\ec',
  2738.                         MUIA_Text_Contents,cat.msgl_VarList.getstr(),
  2739.                         MUIA_InputMode,MUIV_InputMode_Toggle,
  2740.                     End,
  2741.                     Child, RectangleObject,MUIA_Rectangle_HBar,MUI_TRUE,MUIA_Weight,0,End,
  2742.                     Child, prefs_btn:=TextObject,
  2743.                         ButtonFrame,
  2744.                         MUIA_Background,MUII_ButtonBack,
  2745.                         MUIA_Text_PreParse,'\ec',
  2746.                         MUIA_Text_Contents,cat.msgl_Prefs.getstr(),
  2747.                         MUIA_InputMode,MUIV_InputMode_RelVerify,
  2748.                     End,
  2749.                 End,
  2750.                 Child, RectangleObject,MUIA_Rectangle_VBar,MUI_TRUE,MUIA_Weight,0,End,
  2751.                 Child, VGroup,
  2752.                     Child, sgroup:=VGroup,
  2753.                         MUIA_Disabled,MUI_TRUE, -> No projects are opened at beginning
  2754.                         Child,name_str:= StringObject,MUIA_CycleChain,1,MUIA_String_Contents,cat.msg_Unnamed.getstr(),StringFrame,End,
  2755.                         Child, type_reg:=RegisterGroup(ftype_registertitles),
  2756.                             Child, VGroup,
  2757.                                 Child, HGroup,
  2758.                                     Child, FreeLabel(cat.msgl_Path.getstr()),
  2759.                                     Child, PopaslObject,
  2760.                                         MUIA_Popstring_Button,PopButton(MUII_PopFile),
  2761.                                         MUIA_Popasl_Type,ASL_FILEREQUEST,
  2762.                                         MUIA_Popstring_String,path_str:=StringObject,
  2763.                                             StringFrame,
  2764.                                             MUIA_String_Contents,cat.msg_Unnamed.getstr(),
  2765.                                         End,
  2766.                                     End,
  2767.                                 End,
  2768.                                 Child, HGroup,
  2769.                                     Child, size_rad:=RadioObject,
  2770.                                         GroupFrameT(cat.msgl_Size.getstr()),
  2771.                                         MUIA_Radio_Entries,size_radiolabels,
  2772.                                         MUIA_Radio_Active,1,
  2773.                                     End,
  2774.                                     Child, VGroup,
  2775.                                         Child, RectangleObject,End,
  2776.                                         Child, size_txt:=SizeTextObject,
  2777.                                             TextFrame,
  2778.                                             MUIA_Text_PreParse,'\ec',
  2779.                                             MUIA_Text_Contents,cat.msgl_PicSize.getstr(),
  2780.                                         End,
  2781.                                         Child, RectangleObject,End,
  2782.                                     End,
  2783.                                 End,
  2784.                             End,
  2785.                             Child, VGroup,
  2786.                                 Child, HGroup,
  2787.                                     Child,red_fail:=LampObject,
  2788.                                         MUIA_Lamp_Type,MUIV_Lamp_Type_Big,
  2789.                                         MUIA_Lamp_ColorType,MUIV_Lamp_ColorType_UserDefined,
  2790.                                         MUIA_Lamp_Color,MUIV_Lamp_Color_Ok,
  2791.                                     End,
  2792.                                     Child, r_lbl:=label('r(#,x,y)='),
  2793.                                     Child, red_str:=StringObject,
  2794.                                         StringFrame,
  2795.                                         MUIA_CycleChain,1,
  2796.                                     End,
  2797.                                 End,
  2798.                                 Child, HGroup,
  2799.                                     Child, Label(cat.msgl_Output.getstr()),
  2800.                                     Child, outr_cyc:=CycleObject,
  2801.                                         MUIA_Cycle_Entries,[cat.msgl_Int32.getstr(),cat.msgl_Float32.getstr(),cat.msgl_Float64.getstr(),
  2802.                                                             cat.msgl_OldR.getstr(),cat.msgl_OldG.getstr(),cat.msgl_OldB.getstr(),NIL],
  2803.                                         MUIA_Cycle_Active,3,
  2804.                                         MUIA_CycleChain,1,
  2805.                                     End,
  2806.                                     Child, RectangleObject,End,
  2807.                                 End,
  2808.  
  2809.                                 Child, HGroup,
  2810.                                     Child,green_fail:=LampObject,
  2811.                                         MUIA_Lamp_Type,MUIV_Lamp_Type_Big,
  2812.                                         MUIA_Lamp_ColorType,MUIV_Lamp_ColorType_UserDefined,
  2813.                                         MUIA_Lamp_Color,MUIV_Lamp_Color_Ok,
  2814.                                     End,
  2815.                                     Child, g_lbl:=label('g(#,x,y)='),
  2816.                                     Child, green_str:=StringObject,
  2817.                                         StringFrame,
  2818.                                         MUIA_CycleChain,1,
  2819.                                     End,
  2820.                                 End,
  2821.                                 Child, HGroup,
  2822.                                     Child, Label(cat.msgl_Output.getstr()),
  2823.                                     Child, outg_cyc:=CycleObject,
  2824.                                         MUIA_Cycle_Entries,[cat.msgl_Int32.getstr(),cat.msgl_Float32.getstr(),cat.msgl_Float64.getstr(),
  2825.                                                             cat.msgl_OldR.getstr(),cat.msgl_OldG.getstr(),cat.msgl_OldB.getstr(),
  2826.                                                             cat.msgl_CopyR.getstr(),NIL],
  2827.                                         MUIA_Cycle_Active,3,
  2828.                                         MUIA_CycleChain,1,
  2829.                                     End,
  2830.                                     Child, RectangleObject,End,
  2831.                                 End,
  2832.  
  2833.                                 Child, HGroup,
  2834.                                     Child,blue_fail:=LampObject,
  2835.                                         MUIA_Lamp_Type,MUIV_Lamp_Type_Big,
  2836.                                         MUIA_Lamp_ColorType,MUIV_Lamp_ColorType_UserDefined,
  2837.                                         MUIA_Lamp_Color,MUIV_Lamp_Color_Ok,
  2838.                                     End,
  2839.                                     Child, b_lbl:=label('b(#,x,y)='),
  2840.                                     Child, blue_str:=StringObject,
  2841.                                         StringFrame,
  2842.                                         MUIA_CycleChain,1,
  2843.                                     End,
  2844.                                 End,
  2845.                                 Child, HGroup,
  2846.                                     Child, Label(cat.msgl_Output.getstr()),
  2847.                                     Child, outb_cyc:=CycleObject,
  2848.                                         MUIA_Cycle_Entries,[cat.msgl_Int32.getstr(),cat.msgl_Float32.getstr(),cat.msgl_Float64.getstr(),
  2849.                                                             cat.msgl_OldR.getstr(),cat.msgl_OldG.getstr(),cat.msgl_OldB.getstr(),
  2850.                                                             cat.msgl_CopyR.getstr(),cat.msgl_CopyG.getstr(),NIL],
  2851.                                         MUIA_Cycle_Active,3,
  2852.                                         MUIA_CycleChain,1,
  2853.                                     End,
  2854.                                     Child, RectangleObject,End,
  2855.                                 End,
  2856.                             End,
  2857.                         End,
  2858.                         Child, HGroup,
  2859.                             Child, TextObject,
  2860.                                 MUIA_Text_PreParse,'\ec',
  2861.                                 MUIA_Text_Contents,cat.msgl_Width.getstr(),
  2862.                             End,
  2863.                             Child, TextObject,
  2864.                                 MUIA_Text_PreParse,'\ec',
  2865.                                 MUIA_Text_Contents,cat.msgl_Height.getstr(),
  2866.                             End,
  2867.                         End,
  2868.                         Child, HGroup,
  2869.                             Child, width_str:=StringObject,
  2870.                                 StringFrame,
  2871.                                 MUIA_String_Accept,'0123456789',
  2872.                             End,
  2873.                             Child, height_str:=StringObject,
  2874.                                 StringFrame,
  2875.                                 MUIA_String_Accept,'0123456789',
  2876.                             End,
  2877.                         End,
  2878.                         Child, GroupObject,MUIA_Group_Rows,2,
  2879.                             Child, draw_btn:=TextObject,
  2880.                                 ButtonFrame,
  2881.                                 MUIA_Background,MUII_ButtonBack,
  2882.                                 MUIA_Text_PreParse,'\ec',
  2883.                                 MUIA_Text_Contents,cat.msgl_Render.getstr(),
  2884.                                 MUIA_InputMode,MUIV_InputMode_RelVerify,
  2885.                             End,
  2886.                             Child, savepic_btn:=SimpleButton(cat.msgl_SavePic.getstr()),
  2887.                             Child, savefunc_btn:=SimpleButton(cat.msgl_SaveFunc.getstr()),
  2888.                             Child, abort_btn:=SimpleButton(cat.msgl_Abort.getstr()),
  2889.                             Child, showme_cyc:=CycleObject,
  2890.                                 ButtonFrame,
  2891.                                 MUIA_Cycle_Entries,showme_cyclelabels,
  2892.                                 MUIA_Cycle_Active,1,
  2893.                             End,
  2894.                             Child, close_btn:=SimpleButton(cat.msgl_Close.getstr()),
  2895.                             Child, loadfunc_btn:=SimpleButton(cat.msgl_LoadFunc.getstr()),
  2896.                             Child, clear_btn:=SimpleButton(cat.msgl_Clear.getstr()),
  2897.                         End,
  2898.                     End,
  2899.                     Child, stat_grp:=HGroup,
  2900.                         Child,lamp_lmp:=LampObject,
  2901.                             MUIA_Lamp_Type,MUIV_Lamp_Type_Big,
  2902.                             MUIA_Lamp_ColorType,MUIV_Lamp_ColorType_UserDefined,
  2903.                             MUIA_Lamp_Color,MUIV_Lamp_Color_Off,
  2904.                         End,
  2905.                         Child,state_txt:=TextObject,
  2906.                             MUIA_Text_Contents,cat.msgs_Idle.getstr(),
  2907.                             MUIA_Weight,50,
  2908.                         End,
  2909.                         Child,state_gau:=GaugeObject,
  2910.                             TextFrame,
  2911.                             MUIA_Gauge_Horiz , MUI_TRUE,
  2912.                         End,
  2913.                     End,
  2914.                 End,
  2915.             End,
  2916.         End,
  2917.         SubWindow,prefs_win:=WindowObject,
  2918.             MUIA_Window_Title,cat.msgl_Prefs.getstr(),
  2919.             MUIA_Window_ID,"PREF",
  2920.             WindowContents,VGroup,
  2921.                 Child, HGroup,
  2922.                     Child, VGroup,
  2923.                         GroupFrameT(cat.msgp_Priority.getstr()),
  2924.                         Child, mainpri_sld:=uSliderObject,
  2925.                             GroupFrameT(cat.msgp_MainTask.getstr()),
  2926.                             MUIA_Slider_Min,-10,
  2927.                             MUIA_Slider_Max,10,
  2928.                             MUIA_Slider_Level,0,
  2929.                         End,
  2930.                         Child, currpri_sld:=uSliderObject,
  2931.                             GroupFrameT(cat.msgp_CurrentTask.getstr()),
  2932.                             MUIA_Slider_Min,-10,
  2933.                             MUIA_Slider_Max,10,
  2934.                             MUIA_Slider_Level,-1,
  2935.                         End,
  2936.                         Child, renderpri_sld:=uSliderObject,
  2937.                             GroupFrameT(cat.msgp_RenderTask.getstr()),
  2938.                             MUIA_Slider_Min,-10,
  2939.                             MUIA_Slider_Max,10,
  2940.                             MUIA_Slider_Level,-2,
  2941.                         End,
  2942.                     End,
  2943.                     Child, VGroup,
  2944.                         Child, HGroup,
  2945.                             Child,recompile_chk:=CheckMark(MUI_TRUE),
  2946.                             Child,FreeLabel(cat.msgp_Recompile.getstr()),
  2947.                         End,
  2948.                         Child, renderupdate_sld:=uSliderObject,
  2949.                             MUIA_Disabled,MUI_TRUE,
  2950.                             GroupFrameT(cat.msgp_RenderUpd.getstr()),
  2951.                             MUIA_uSlider_Stringify,MUI_TRUE,
  2952.                             MUIA_Slider_Min,0,
  2953.                             MUIA_Slider_Max,40,
  2954.                             MUIA_Slider_Level,10,
  2955.                         End,
  2956.                         Child, HGroup,
  2957.                             Child, FreeLabel(cat.msgp_Close.getstr()),
  2958.                             Child, close_cyc:=CycleObject,
  2959.                                 MUIA_Cycle_Entries,[cat.msgl_Iconify.getstr(),cat.msgl_Close.getstr(),NIL],
  2960.                                 MUIA_Cycle_Active,0,
  2961.                             End,
  2962.                         End,
  2963.                         Child, HGroup,
  2964.                             Child, showmess_chk:=CheckMark(MUI_TRUE),
  2965.                             Child, FreeLabel(cat.msgp_ShowMw.getstr()),
  2966.                         End,
  2967.                     End,
  2968.                     Child, VGroup,
  2969.                         Child, HGroup,
  2970.                             Child, FreeLabel(cat.msgp_DithM.getstr()),
  2971.                             Child, dither_cyc:=CycleObject,
  2972.                                 MUIA_Cycle_Entries,[cat.msgp_diNone.getstr(),'EDD','Floyd Steinberg',cat.msgp_diRand.getstr(),NIL],
  2973.                                 MUIA_Cycle_Active,2,
  2974.                             End,
  2975.                         End,
  2976.                         Child, dither_sld:=SliderObject,
  2977.                             GroupFrameT(cat.msgp_DithA.getstr()),
  2978.                             MUIA_Slider_Min,0,
  2979.                             MUIA_Slider_Max,255,
  2980.                             MUIA_Slider_Level,40,
  2981.                         End,
  2982.                     End,
  2983.                 End,
  2984.                 Child, HGroup,
  2985.                     Child, RectangleObject,End,
  2986.                     Child, savep_btn:=SimpleButton(cat.msgp_SavePrefs.getstr()),
  2987.                     Child, mui_btn:=TextObject,
  2988.                         ButtonFrame,
  2989.                         MUIA_Background,MUII_ButtonBack,
  2990.                         MUIA_Text_SetMax,MUI_TRUE,
  2991.                         MUIA_Text_PreParse,'\ec',
  2992.                         MUIA_Text_Contents,cat.msgp_MuiPrefs.getstr(),
  2993.                         MUIA_InputMode,MUIV_InputMode_RelVerify,
  2994.                     End,
  2995.                     Child, RectangleObject,End,
  2996.                 End,
  2997.             End,
  2998.         End,
  2999.         SubWindow,messages_win:=WindowObject,
  3000.             MUIA_Window_Title,cat.msgm_NoMsg.getstr(),
  3001.             MUIA_Window_ID,"MESS",
  3002.             MUIA_Window_CloseGadget,FALSE,
  3003.             WindowContents,VGroup,
  3004.                 Child,ListviewObject,
  3005.                     -> MUIA_VertDisappear,50, -> This does not work :-(
  3006.                     MUIA_Listview_Input,FALSE,
  3007.                     ReadListFrame,
  3008.                     MUIA_Listview_List,messages_lst:=ListObject,
  3009.                         MUIA_List_SourceArray,messages,
  3010.                     End,
  3011.                 End,
  3012.                 Child, colour_txt:=TextObject,
  3013.                     TextFrame,
  3014.                     MUIA_Background,MUII_TextBack,
  3015.                     MUIA_Text_Contents,'c(p,x,y)=[r,g,b]',
  3016.                 End,
  3017.             End,
  3018.         End,
  3019.         SubWindow,about_win:=WindowObject,
  3020.             MUIA_Window_Title,cat.msgn_AboutPicFX.getstr(),
  3021.             MUIA_Window_ID,"ABT",
  3022.             WindowContents,VGroup,
  3023.                 Child, HGroup,
  3024.                     Child,RectangleObject,End,
  3025.                     Child, ImageObject,
  3026.                         TextFrame,
  3027.                         MUIA_Image_FreeHoriz,MUI_TRUE,
  3028.                         MUIA_FixWidth,300,MUIA_FixHeight,150,
  3029.                         MUIA_Image_FreeVert,MUI_TRUE,
  3030.                         MUIA_Image_Spec,'5:progdir:picFXlogo',
  3031.                     End,
  3032.                     Child, RectangleObject,End,
  3033.                 End,
  3034.                 Child, FloattextObject,
  3035.                     TextFrame,MUIA_Background,MUII_TextBack,
  3036.                     MUIA_Floattext_Text,abouttext,
  3037.                 End,
  3038.             End,
  3039.         End,
  3040.         SubWindow, animate_win:=WindowObject,
  3041.             MUIA_Window_Title,cat.msgn_Animation.getstr(),
  3042.             MUIA_Window_ID,"ANIM",
  3043.             WindowContents,VGroup,
  3044.                 Child, HGroup,
  3045.                     Child, label(cat.msga_Parameter.getstr()),
  3046.                     Child, parameter_str:=StringObject,
  3047.                         StringFrame,
  3048.                         MUIA_String_Contents,'t',
  3049.                     End,
  3050.                     Child, label(cat.msga_FrameCount.getstr()),
  3051.                     Child, frames_str:=StringObject,
  3052.                         StringFrame,
  3053.                         MUIA_String_Accept,'0123456789',
  3054.                         MUIA_String_Contents,'50',
  3055.                     End,
  3056.                 End,
  3057.                 Child, HGroup,
  3058.                     Child, VGroup,
  3059.                         Child, TextObject,
  3060.                             NoFrame,
  3061.                             MUIA_Text_Contents,cat.msga_RenderThese.getstr(),
  3062.                         End,
  3063.                         Child,render_lsv:=ListviewObject,
  3064.                             InputListFrame,
  3065.                             MUIA_Listview_DragType,MUIV_Listview_DragType_Immediate,
  3066.                             MUIA_Listview_List,render_lst:=ListObject,
  3067.                                 MUIA_List_DragSortable,MUI_TRUE,
  3068.                                 MUIA_List_DisplayHook,pl_displayer,
  3069.                             End,
  3070.                         End,
  3071.                         Child, HGroup,
  3072.                             Child, insertP_btn:=SimpleButton(cat.msga_Insert.getstr()),
  3073.                             Child, delP_btn:=SimpleButton(cat.msgl_Del.getstr()),
  3074.                         End,
  3075.                     End,
  3076.                     Child, VGroup,
  3077.                         Child, RectangleObject,End,
  3078.                         Child, HGroup,
  3079.                             Child, label(cat.msga_SaveThis.getstr()),
  3080.                             Child, saveP:=ProjectholdObject,
  3081.                                 TextFrame,
  3082.                                 MUIA_Background,MUII_TextBack,
  3083.                                 MUIA_Text_Contents,cat.msgl_DropHere.getstr(),
  3084.                             End,
  3085.                         End,
  3086.                         Child, HGroup,
  3087.                             Child, label(cat.msga_FileBase.getstr()),
  3088.                             Child, savename_str:=StringObject,
  3089.                                 StringFrame,
  3090.                                 MUIA_String_Contents,'Ram:anim',
  3091.                             End,
  3092.                         End,    
  3093.                         Child, RectangleObject,End,
  3094.                     End,
  3095.                 End,
  3096.                 Child, HGroup,
  3097.                     Child, RectangleObject,End,
  3098.                     Child, doAnim_btn:=SimpleButton(cat.msga_StartAnimation.getstr()),
  3099.                     Child, RectangleObject,End,
  3100.                 End,
  3101.                 Child, animstatus_txt:=TextObject,
  3102.                     TextFrame,
  3103.                     MUIA_Background,MUII_TextBack,
  3104.                     MUIA_Text_Contents,cat.msgs_Idle.getstr(),
  3105.                 End,
  3106.             End,
  3107.         End,
  3108.     End
  3109.  
  3110.     IF app <> NIL
  3111. /*Let's do all notifications now*/
  3112.  
  3113.         doMethodA(settings_win,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit])
  3114.         doMethodA(messages_win,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,showmess_chk,3,MUIM_Set,MUIA_Selected,FALSE])
  3115.         doMethodA(about_win,   [MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,about_win,3,MUIM_Set,MUIA_Window_Open,FALSE])
  3116.         doMethodA(animate_win, [MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,animate_win,3,MUIM_Set,MUIA_Window_Open,FALSE])
  3117.  
  3118.         doMethodA(new_btn,     [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,1,MUIM_ProjectList_NewItem])
  3119. /*Variable List handling*/
  3120.         doMethodA(varlist_lst,[MUIM_VariableList_Fields,varname_str,varval_str])
  3121.         doMethodA(var_btn,     [MUIM_Notify,MUIA_Selected,MUIV_EveryTime,varlist_win,3,MUIM_Set,MUIA_Window_Open,MUIV_TriggerValue])
  3122.         doMethodA(varlist_win, [MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,var_btn,3,MUIM_Set,MUIA_Selected,FALSE])
  3123.         doMethodA(varlist_lst, [MUIM_Notify,MUIA_List_Active,MUIV_EveryTime,varlist_lst,3,MUIM_VariableList_UpdateStr,varname_str,varval_str])
  3124.         doMethodA(varname_str, [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,varlist_lst,3,MUIM_VariableList_SetVar,MUIV_VariableList_SetVar_Name,MUIV_TriggerValue])
  3125.         doMethodA(varval_str,  [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,varlist_lst,3,MUIM_VariableList_SetVar,MUIV_VariableList_SetVar_Value,MUIV_TriggerValue])
  3126.         doMethodA(varname_str, [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,varlist_win,3,MUIM_Set,MUIA_Window_ActiveObject,varname_str])
  3127.         doMethodA(varval_str,  [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,varlist_win,3,MUIM_Set,MUIA_Window_ActiveObject,varval_str])
  3128.  
  3129.         doMethodA(varadd_btn,  [MUIM_Notify,MUIA_Pressed,FALSE,varlist_lst,1,MUIM_VariableList_AddVar])
  3130.         doMethodA(vardel_btn,  [MUIM_Notify,MUIA_Pressed,FALSE,varlist_lst,2,MUIM_List_Remove,MUIV_List_Remove_Active])
  3131. /*preferences*/
  3132.         doMethodA(prefs_win,       [MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,prefs_win,3,MUIM_Set,MUIA_Window_Open,FALSE])
  3133.         doMethodA(prefs_btn,       [MUIM_Notify,MUIA_Pressed,     FALSE,         prefs_win,3,MUIM_Set,MUIA_Window_Open,MUI_TRUE])
  3134.  
  3135.         doMethodA(mui_btn,         [MUIM_Notify,MUIA_Pressed,     FALSE,         app,1,MUIM_Application_OpenConfigWindow])
  3136.         doMethodA(savep_btn,       [MUIM_Notify,MUIA_Pressed,     FALSE,         opened_lst,1,MUIM_ProjectList_SavePrefs])
  3137.         doMethodA(mainpri_sld,     [MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_SetPri,MUIV_ProjectList_SetPri_Main,MUIV_TriggerValue])
  3138.         doMethodA(currpri_sld,     [MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_SetPri,MUIV_ProjectList_SetPri_Curr,MUIV_TriggerValue])
  3139.         doMethodA(renderpri_sld,   [MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_SetPri,MUIV_ProjectList_SetPri_Render,MUIV_TriggerValue])
  3140.         doMethodA(renderupdate_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Prefs,{rupd},MUIV_TriggerValue])
  3141.         doMethodA(close_cyc,       [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,app,3,MUIM_WriteLong,MUIV_TriggerValue,{wclose}])
  3142.         doMethodA(showmess_chk,    [MUIM_Notify,MUIA_Selected    ,MUIV_EveryTime,messages_win,3,MUIM_Set,MUIA_Window_Open,MUIV_TriggerValue])
  3143.         doMethodA(dither_cyc,      [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Prefs,{dithm},MUIV_TriggerValue])
  3144.         doMethodA(dither_sld,      [MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Prefs,{ditha},MUIV_TriggerValue])
  3145. /*mainpri >= currpri >= renderpri*/
  3146.         doMethodA(mainpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,currpri_sld,2,MUIM_uSlider_Smaller,MUIV_TriggerValue])
  3147.         doMethodA(mainpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,renderpri_sld,2,MUIM_uSlider_Smaller,MUIV_TriggerValue])
  3148.         doMethodA(currpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,renderpri_sld,2,MUIM_uSlider_Smaller,MUIV_TriggerValue])
  3149.         doMethodA(currpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,mainpri_sld,2,MUIM_uSlider_Bigger,MUIV_TriggerValue])
  3150.         doMethodA(renderpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,mainpri_sld,2,MUIM_uSlider_Bigger,MUIV_TriggerValue])
  3151.         doMethodA(renderpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,currpri_sld,2,MUIM_uSlider_Bigger,MUIV_TriggerValue])
  3152. /*Every change to a gadget is sent to the ProjectList class*/
  3153.         doMethodA(name_str,    [MUIM_Notify,MUIA_String_Contents,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Name,MUIV_TriggerValue])
  3154.         doMethodA(type_reg,    [MUIM_Notify,MUIA_Group_ActivePage,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Type,MUIV_TriggerValue])
  3155.         doMethodA(path_str,    [MUIM_Notify,MUIA_String_Contents,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_ImageFile,MUIV_TriggerValue])
  3156.         doMethodA(size_rad,    [MUIM_Notify,MUIA_Radio_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_LoadM,MUIV_TriggerValue])
  3157.         doMethodA(red_str,     [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Red,MUIV_TriggerValue])
  3158.         doMethodA(green_str,   [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Green,MUIV_TriggerValue])
  3159.         doMethodA(blue_str,    [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Blue,MUIV_TriggerValue])
  3160.         doMethodA(outr_cyc,    [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_OutputR,MUIV_TriggerValue])
  3161.         doMethodA(outg_cyc,    [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_OutputG,MUIV_TriggerValue])
  3162.         doMethodA(outb_cyc,    [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_OutputB,MUIV_TriggerValue])
  3163.         doMethodA(width_str,   [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Width,MUIV_TriggerValue])
  3164.         doMethodA(height_str,  [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Height,MUIV_TriggerValue])
  3165. /*If the active element of the Opened Projects List has changed, the gadgets must be refreshed*/
  3166.         doMethodA(opened_lst,  [MUIM_Notify,MUIA_List_Active,MUIV_EveryTime,opened_lst,1,MUIM_ProjectList_Refresh,0])
  3167. /*Action buttons:ProjectList class will forward those messages to the selected project*/
  3168.         doMethodA(draw_btn,    [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,3,MUIM_ProjectList_Forward,1,MUIM_PlaneFunc_Render])
  3169.         doMethodA(savepic_btn, [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,4,MUIM_ProjectList_Forward,2,MUIM_PlaneFunc_SavePic,FALSE])
  3170.         doMethodA(savefunc_btn,[MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,3,MUIM_ProjectList_Forward,1,MUIM_PlaneFunc_SaveFunc])
  3171.         doMethodA(loadfunc_btn,[MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,3,MUIM_ProjectList_Forward,1,MUIM_PlaneFunc_LoadFunc])
  3172.         doMethodA(abort_btn,   [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,4,MUIM_ProjectList_Forward,1,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])
  3173.         doMethodA(clear_btn,   [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,3,MUIM_ProjectList_Forward,1,MUIM_PlaneFunc_Clear])
  3174. ->Since the address of the current project is variable I can't do direct notification. Instead, there are two methods for ProjectList.
  3175.         doMethodA(opened_lsv,  [MUIM_Notify,MUIA_Listview_DoubleClick,MUI_TRUE,showme_cyc,3,MUIM_Set,MUIA_Cycle_Active,1])
  3176.         doMethodA(showme_cyc,  [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,2,MUIM_ProjectList_ShowMe,MUIV_TriggerValue])
  3177.         doMethodA(close_btn,   [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,1,MUIM_ProjectList_DelItem])
  3178. ->Handy shortcuts
  3179.         doMethodA(settings_win,[MUIM_Notify,MUIA_Window_InputEvent,'r',settings_win,3,MUIM_Set,MUIA_Window_ActiveObject,red_str])
  3180.         doMethodA(settings_win,[MUIM_Notify,MUIA_Window_InputEvent,'g',settings_win,3,MUIM_Set,MUIA_Window_ActiveObject,green_str])
  3181.         doMethodA(settings_win,[MUIM_Notify,MUIA_Window_InputEvent,'b',settings_win,3,MUIM_Set,MUIA_Window_ActiveObject,blue_str])
  3182. ->Menu handing
  3183.         doMethodA(app,         [MUIM_Notify,MUIA_Application_MenuAction,MENU_G_About,about_win,3,MUIM_Set,MUIA_Window_Open,MUI_TRUE])
  3184.         doMethodA(app,         [MUIM_Notify,MUIA_Application_MenuAction,MENU_G_Prefs,prefs_win,3,MUIM_Set,MUIA_Window_Open,MUI_TRUE])
  3185.         doMethodA(app,         [MUIM_Notify,MUIA_Application_MenuAction,MENU_G_AboutMui,app,1,MUIM_Application_AboutMUI])
  3186.         doMethodA(app,         [MUIM_Notify,MUIA_Application_MenuAction,MENU_G_PrefsMui,app,1,MUIM_Application_OpenConfigWindow])
  3187.         doMethodA(app,         [MUIM_Notify,MUIA_Application_MenuAction,MENU_G_Hide,app,3,MUIM_Set,MUIA_Application_Iconified,MUI_TRUE])
  3188.         doMethodA(app,         [MUIM_Notify,MUIA_Application_MenuAction,MENU_G_Animation,animate_win,3,MUIM_Set,MUIA_Window_Open,MUI_TRUE])
  3189.         doMethodA(app,         [MUIM_Notify,MUIA_Application_MenuAction,MENU_G_Varlist,var_btn,3,MUIM_Set,MUIA_Selected,MUI_TRUE])
  3190.         doMethodA(app,         [MUIM_Notify,MUIA_Application_MenuAction,MENU_G_New,opened_lst,1,MUIM_ProjectList_NewItem])
  3191.         doMethodA(app,         [MUIM_Notify,MUIA_Application_MenuAction,MENU_P_Render,opened_lst,3,MUIM_ProjectList_Forward,1,MUIM_PlaneFunc_Render])
  3192.         doMethodA(app,         [MUIM_Notify,MUIA_Application_MenuAction,MENU_P_Abort, opened_lst,4,MUIM_ProjectList_Forward,2,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])
  3193.         l:=doMethodA(menus,[MUIM_FindUData,MENU_P_Visible]) -> get the address of the 'visible' menuitem
  3194.         doMethodA(l,           [MUIM_Notify,MUIA_Menuitem_Checked,MUIV_EveryTime,showme_cyc,3,MUIM_Set,MUIA_Cycle_Active,MUIV_TriggerValue])
  3195.         doMethodA(showme_cyc,  [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,l,3,MUIM_NoNotifySet,MUIA_Menuitem_Checked,MUIV_TriggerValue]) -> There's a bit of circularity here (useless sometimes :-)
  3196.         doMethodA(app,         [MUIM_Notify,MUIA_Application_MenuAction,MENU_P_Close, opened_lst,1,MUIM_ProjectList_DelItem])
  3197.         doMethodA(app,         [MUIM_Notify,MUIA_Application_MenuAction,MENU_P_SaveP, opened_lst,3,MUIM_ProjectList_Forward,2,MUIM_PlaneFunc_SavePic,FALSE])
  3198.         doMethodA(app,         [MUIM_Notify,MUIA_Application_MenuAction,MENU_P_Clear, opened_lst,3,MUIM_ProjectList_Forward,1,MUIM_PlaneFunc_Clear])
  3199.         doMethodA(app,         [MUIM_Notify,MUIA_Application_MenuAction,MENU_P_LoadF, opened_lst,3,MUIM_ProjectList_Forward,1,MUIM_PlaneFunc_LoadFunc])
  3200.         doMethodA(app,         [MUIM_Notify,MUIA_Application_MenuAction,MENU_P_SaveF, opened_lst,3,MUIM_ProjectList_Forward,1,MUIM_PlaneFunc_SaveFunc])
  3201.  
  3202. /*Animation handling*/
  3203.         doMethodA(insertP_btn, [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_InsertInList,render_lst])
  3204.         doMethodA(delP_btn,    [MUIM_Notify,MUIA_Pressed,FALSE,render_lst,2,MUIM_List_Remove,MUIV_List_Remove_Active])
  3205.         doMethodA(doAnim_btn,  [MUIM_Notify,MUIA_Pressed,FALSE,saveP,1,MUIM_Projecthold_Animate])
  3206.  
  3207.         loadprefs()
  3208.  
  3209.         set(settings_win,MUIA_Window_Open,MUI_TRUE)
  3210.         get(showmess_chk,MUIA_Selected,{l}) ;
  3211.         IF l THEN
  3212.            set(messages_win,MUIA_Window_Open,MUI_TRUE)
  3213.         doMethodA(opened_lst,[MUIM_ProjectList_Memory])
  3214.         message(-1,cat.msgm_Welcome.getstr())
  3215.  
  3216.         WHILE Not(doMethodA(app,[MUIM_Application_NewInput,{sigs}]) = MUIV_Application_ReturnID_Quit)
  3217.             IF sigs THEN sigs := Wait(sigs)
  3218.         ENDWHILE
  3219.  
  3220.     ELSE
  3221.         WriteF(cat.msg_NoApp.getstr())
  3222.     ENDIF
  3223. EXCEPT DO
  3224.     useprefs()
  3225.  
  3226.     IF opened_lst THEN
  3227.         doMethodA(opened_lst,[MUIM_ProjectList_EnableProgram])
  3228.     IF app THEN Mui_DisposeObject(app)
  3229.     IF cl_planefunc THEN Mui_DeleteCustomClass(cl_planefunc)
  3230.     IF cl_projectlist THEN Mui_DeleteCustomClass(cl_projectlist)
  3231.     IF cl_uslider THEN Mui_DeleteCustomClass(cl_uslider)
  3232.     IF cl_sizetxt THEN Mui_DeleteCustomClass(cl_sizetxt)
  3233.     IF cl_myapp THEN Mui_DeleteCustomClass(cl_myapp)
  3234.     IF cl_projecthold THEN Mui_DeleteCustomClass(cl_projecthold)
  3235.     dcc() -> VarList
  3236.     dCleanup()
  3237.     IF exception
  3238.         IF localebase
  3239.             WriteF(cat.msg_Nolib.getstr(),exception)
  3240.         ELSE
  3241.             WriteF('Failed to open \s.\n',exception)
  3242.         ENDIF
  3243.     ENDIF
  3244.     IF aslbase       THEN CloseLibrary(aslbase)
  3245.     IF datatypesbase THEN CloseLibrary(datatypesbase)
  3246.     IF guigfxbase    THEN CloseLibrary(guigfxbase)
  3247.     IF iffparsebase  THEN CloseLibrary(iffparsebase)
  3248.     IF muimasterbase THEN CloseLibrary(muimasterbase)
  3249.     IF utilitybase   THEN CloseLibrary(utilitybase)
  3250.     cat.close()
  3251.     IF localebase THEN CloseLibrary(localebase)
  3252. ENDPROC                     
  3253.  
  3254. PROC message(id,info:PTR TO CHAR) -> Writes a message in the message-list
  3255. DEF t
  3256.     FOR t:=0 TO 13
  3257.         StrCopy(messages[t],messages[t+1]) -> Warning, the addresses mustn't change!
  3258.     ENDFOR
  3259.     StringF(messages[14],'[\d] \s',id,info)
  3260.     doMethodA(messages_lst,[MUIM_List_Redraw,MUIV_List_Redraw_All])
  3261.     IF counter <> 1
  3262.         StringF(title,'\d \s',counter++,cat.msgm_Messages.getstr())
  3263.     ELSE
  3264.         StringF(title,'\d \s',counter++,cat.msgm_Message.getstr())
  3265.     ENDIF
  3266.     set(messages_win,MUIA_Window_Title,title)
  3267. ENDPROC
  3268.  
  3269. PROC messagefmt(id,info:PTR TO CHAR,arg1=0,arg2=0,arg3=0)
  3270. DEF s[100]:STRING
  3271.     StringF(s,info,arg1,arg2,arg3)
  3272.     message(id,s)
  3273. ENDPROC
  3274.