home *** CD-ROM | disk | FTP | other *** search
/ PSION CD 2 / PsionCDVol2.iso / Programs / 874 / Plotter.sis / plotter.opp < prev    next >
Encoding:
Text File  |  2000-09-27  |  9.3 KB  |  413 lines

  1. // Plotter main module
  2. // ⌐ 1999-2000 Glenn Strong <Glenn.Strong@cs.tcd.ie>
  3. // Issued under the GNU General Public license, version 2
  4.  
  5. DECLARE EXTERNAL
  6.     
  7. // Define exactly one of these:
  8. //#define CLIPBOARD_NONE
  9. #define CLIPBOARD_CLIPBIT
  10.  
  11. #ifdef CLIPBOARD_CLIPBIT
  12. include "clipbit.oxh"
  13. #endif
  14.  
  15. INCLUDE "const.oph"
  16. INCLUDE "System.oxh"
  17. INCLUDE "Toolbar.oph"
  18.  
  19. PROC Main:
  20.     LOADM "Z:\System\Opl\Toolbar.opo"
  21.     TBarLink:("MainLoop")
  22. ENDP
  23.  
  24. EXTERNAL buf$:(b&)
  25. EXTERNAL mainDialog%:
  26. EXTERNAL SetupMenu:
  27. EXTERNAL GetFunction$:(f$)
  28. EXTERNAL GetRange:
  29. EXTERNAL GetMesh:
  30. EXTERNAL GetZoom:
  31. EXTERNAL GetCenter:
  32. EXTERNAL LoadModule:
  33. EXTERNAL UnloadModule:
  34.  
  35. CONST BW%=10       REM Border width in pixels
  36. CONST KMax=1.0
  37. CONST MaxZoom%=10
  38.  
  39. #include "Shortcuts.oph"
  40. #include "DrawPlot.oph"
  41.  
  42. PROC MainLoop:
  43.     EXTERNAL TbWidth%, TVisible%, TbMenuSym%
  44.     // Plot parameters
  45.     GLOBAL WinH%, WinW%, Zoom, Mesh&, Offscreen%, Overprint%
  46.     GLOBAL XCent%, YCent%, DrawAxes%, QuitFlag%, UseLines%, overPrintCount%
  47.     GLOBAL LoadedModules$(8,255)
  48.     // Function parameters
  49.     GLOBAL RMin, RMax, f$(255), drawWindow%
  50.     LOCAL k%, mod%, ev&(16), blank%, file$(KDFileNameLen%)
  51.  
  52.     k%=1
  53.     DO
  54.         LoadedModules$(k%)=""
  55.         k%++
  56.     UNTIL k%>8
  57.     
  58.     drawWindow%=gIDENTITY    
  59.     blank%=gCREATEBIT(1,1)
  60.     gUSE drawWindow%
  61.     overPrintCount%=0
  62.     
  63.     TBarInit:("Plotter",gWIDTH,gHEIGHT)
  64.     TBarButt:("p",1,"Plot",0,blank%,0,0)
  65.     TBarButt:("f",2,"Func",0,blank%,0,0)
  66.     TBarButt:("r",3,"Range",0,blank%,0,0)
  67.     TBarButt:("e",4,"Exit",0,blank%,0,0)
  68.     TBarShow:
  69.  
  70.     gUPDATE ON
  71.  
  72.     WinH% = gHEIGHT - BW%
  73.     WinW% = gWIDTH - BW% - TBWidth%
  74.     XCent% = WinW%/2
  75.     YCent% = WinH%/2
  76.     // Set default values
  77.     Offscreen%=KFalse% :    Zoom=1.0 : Mesh&=WinW%/10
  78.     f$="SIN(x)" :    RMin=-6.0 : RMax=6.0
  79.     DrawAxes%=KTrue% : OverPrint%=KFalse% : UseLines%=KTrue%
  80.  
  81.     QuitFlag%=KFalse%
  82.  
  83.     DO
  84.         GETEVENT32 ev&()
  85.  
  86.         IF ev&(KEvAType%)=KEvPtr&
  87.             IF TBarOffer%:(ev&(KEvAPtrOplWindowId%),ev&(KEvAPtrType%),ev&(KEvAPtrPositionX%),ev&(KEvAPtrPositionY%))
  88.                 CONTINUE
  89.             ENDIF
  90.         ELSEIF ((ev&(KEvAType%) AND &400)=0) OR (ev&(KEvAType%)=KKeySidebarMenu32%)
  91.             k%=ev&(KEvAType%)
  92.             mod%=ev&(KEvAKMod%)
  93.             IF (k%=KKeyMenu32%) OR (k%=KKeySidebarMenu32%)
  94.                 SetupMenu:
  95.                 k%=MENU
  96.                 mod%=0
  97.             ELSEIF mod% AND KKmodControl%
  98.                 k%=k%+$60
  99.                 IF mod% AND KKmodShift%
  100.                     k%=k%-32 // Do uppercase translation
  101.                 ENDIF
  102.             ELSE
  103.                 CONTINUE
  104.             ENDIF
  105.  
  106.             IF k%=KEYCOPY
  107. #ifdef CLIPBOARD_NONE
  108.                 gIPRINT "Not implemented (sorry)"
  109. #endif
  110. #ifdef CLIPBOARD_CLIPBIT
  111.                 BitmapToClipBrd%:(gIDENTITY)
  112.                 gIPRINT "Copied"
  113. #endif
  114.             ELSEIF k%=KEYCLS
  115.                 gCLS
  116.                 overPrintCount%=0
  117.             ELSEIF k%=KEYFUNCTION
  118.                 f$=GetFunction$:(f$)
  119.             ELSEIF k%=KEYRANGE
  120.                 GetRange:
  121.             ELSEIF k%=KEYLOADM
  122.                 LoadModule:
  123.             ELSEIF k%=KEYUNLOADM
  124.                 UnloadModule:
  125.             ELSEIF k%=KEYPLOT
  126.                 IF NOT OverPrint%
  127.                     gCLS
  128.                     overPrintCount%=0
  129.                 ELSE
  130.                     overPrintCount%++
  131.                 ENDIF
  132.                 IF DrawAxes%
  133.                     Axis:
  134.                 ENDIF
  135.                 Caption:
  136.                 PlotFunction:(f$)
  137.             ELSEIF k%=KEYMESH
  138.                 GetMesh:
  139.             ELSEIF k%=KEYZOOM
  140.                 GetZoom:
  141.             ELSEIF k%=KEYCENTER
  142.                 GetCenter:
  143.             ELSEIF k%=KEYRESETCENTER
  144.                 XCent% = WinW%/2
  145.                 YCent% = WinH%/2
  146.                 gIPRINT "Origin reset"
  147.             ELSEIF k%=KEYOFFSCREEN
  148.                 Offscreen% = NOT Offscreen%
  149.                 IF Offscreen%
  150.                     gIPRINT "Offscreen set"
  151.                 ELSE
  152.                     gIPRINT "Offscreen unset"
  153.                 ENDIF
  154.             ELSEIF k%=KEYOVERPRINT
  155.                 Overprint% = NOT Overprint%
  156.             ELSEIF k%=KEYAXES
  157.                 DrawAxes% = NOT DrawAxes%
  158.                 IF DrawAxes%
  159.                     gIPRINT "Axes On"
  160.                 ELSE
  161.                     gIPRINT "Axes off"
  162.                 ENDIF
  163.             ELSEIF k%=KEYUSELINES
  164.                 Uselines% = NOT UseLines%
  165.                 IF Uselines%
  166.                     gIPRINT "Lines on"
  167.                 ELSE
  168.                     gIPRINT "Lines off"
  169.                 ENDIF
  170.             ELSEIF k%=KEYTOOLBAR
  171.                 IF TbMenuSym%<>KMenuCheckBox%
  172.                     TbarHide:
  173.                     WinW% = gWIDTH - BW%
  174.                     XCent% = WinW%/2
  175.                 ELSE
  176.                     TbarShow:
  177.                     WinW% = gWIDTH - BW% - TBWidth%
  178.                     XCent% = WinW%/2
  179.                 ENDIF
  180.             ELSEIF k%=KEYEXPORT
  181.                 dINIT "Export MBM file"
  182.                 dFILE file$, "File,Folder,Disk", KDFileEditBox%+KDFileEditorQueryExisting%
  183.                 dBUTTONS "Cancel", -KDButtonEsc%, "OK", KDButtonEnter%
  184.                 IF DIALOG<>0
  185.                   gIPRINT "Saving..."
  186.                   gSAVEBIT file$
  187.                 ELSE
  188.                     gIPRINT "Cancelled..."
  189.                 ENDIF
  190.             ELSEIF k%=KEYQUIT
  191.                 QuitFlag%=KTrue%
  192.             ELSEIF k%=KEYABOUT
  193.                 dINIT "About this program"
  194.                 dTEXT "Plotter ","version 1.0", KDTextRight%
  195.                 dTEXT "", "⌐ 1999-2000 Glenn Strong", KDTextCentre%
  196.                 dTEXT "", "Free software under the GPL", KDTextCentre%
  197.                 dTEXT "","", KDTextSeparator%
  198.                 dTEXT "", "Glenn.Strong@cs.tcd.ie", KDTextCentre%
  199.                 dTEXT "","http://www.cs.tcd.ie/Glenn.Strong/epoc/", KDTextCentre%
  200.                 dBUTTONS "OK", KDButtonEnter% OR KDButtonNoLabel%
  201.                 DIALOG
  202.             ENDIF
  203.         ENDIF
  204.     UNTIL QuitFlag%
  205. ENDP
  206.  
  207.  
  208. // Convert up to 255 bytes of a buffer into a string.
  209. PROC buf$:(b&)
  210.     LOCAL l%, w&, s$(255)
  211.     w& = PEEKL(b&)
  212.     l% = MIN(255,w&)
  213.     POKEB (b&+3),l%
  214.     s$=PEEK$(b&+3)
  215.     POKEL b&, w&
  216.     RETURN s$
  217. ENDP
  218.  
  219.  
  220. // Set up menu and process selection
  221. PROC SetupMenu:
  222.     EXTERNAL Offscreen%, DrawAxes%, OverPrint%, TbMenuSym%
  223.     EXTERNAL Uselines%
  224.     LOCAL OSOption%, AXOption%, OPOption%, LIOption%
  225.  
  226.     OSOption% = KMenuCheckBox%
  227.     IF Offscreen% : OSOption% = OSOption% OR KMenuSymbolOn% :    ENDIF
  228.  
  229.     AXOption% = KMenuCheckBox%
  230.     IF DrawAxes% : AXOption% = AXOption% OR KMenuSymbolOn% : ENDIF
  231.  
  232.     OPOption% = KMenuCheckBox%
  233.     IF OverPrint% : OPOption% = OPOption% OR KMenuSymbolOn% : ENDIF
  234.  
  235.     LIOption% = KMenuCheckBox%
  236.     IF UseLines%
  237.         LIOption% = LIOption% OR KMenuSymbolOn%
  238.     ENDIF
  239.  
  240.     mINIT
  241.     mCARD "File","Export plot...",KEYEXPORT,"Close",KEYQUIT
  242.     mCARD "Edit","Copy",KEYCOPY,"Erase",KEYCLS
  243.     mCARD "Function","Set...",KEYFUNCTION,"Range...",KEYRANGE,\
  244.           "Load module...", KEYLOADM, "Unload module...", KEYUNLOADM
  245.     mCARD "Graph", "Plot",KEYPLOT, "Mesh...",KEYMESH, "Zoom",KEYZOOM,\
  246.            "Set origin",KEYCENTER, "Reset origin", KEYRESETCENTER
  247.     mCARD "Options", "Offscreen",(KEYOFFSCREEN OR OSOption%),\
  248.           "Draw Axes",(KEYAXES OR AXOption%), \
  249.                 "Overprint",(KEYOVERPRINT OR OPOption%),\
  250.                  "Show toolbar",(KEYTOOLBAR or TbMenuSym%),\
  251.                  "Use lines", (KEYUSELINES or LIOption%)
  252.     mCARD "Help", "About...", KEYABOUT
  253. ENDP
  254.  
  255. // Get and return a new function from the user.
  256. // The old function to offer is in f$
  257. PROC GetFunction$:(f$)
  258.     LOCAL b&(64), t$(255), k%, i%, p@
  259.     
  260.     POKE$ ADDR(b&())+3,f$
  261.     POKEL ADDR(b&()), LEN(f$)
  262.     dINIT "Function"
  263.     dEDITMULTI ADDR(b&()), "f(x)=",15,3,255
  264.     dBUTTONS "OK",%o,"Cancel",KKeyEsc%
  265.     k%=DIALOG
  266.     IF k%=%o
  267.         t$=buf$:(ADDR(b&()))
  268.         // Remove embedded control characters
  269.         i%=1
  270.         p@=ADDR(t$)
  271.         WHILE i%<=LEN(t$)
  272.             IF PEEKB(p@+i%) < 32 // Control code
  273.                 POKEB p@+i%,32    // Space
  274.             ENDIF
  275.             i%++
  276.         ENDWH
  277.         RETURN t$
  278.     ELSE
  279.         RETURN f$
  280.     ENDIF
  281. ENDP
  282.  
  283. // Prompt the user to change the range
  284. PROC GetRange:
  285.     EXTERNAL RMin, RMax
  286.     dINIT "Select Range of x"
  287.     dFLOAT RMin, " From ", -100, 100
  288.     dFLOAT RMax, " To ", -100, 100
  289.     dButtons "OK",KKeyEnter%,"Cancel",KKeyEsc%
  290.     DIALOG
  291. ENDP
  292.  
  293. // Prompt the user to change the mesh
  294. PROC GetMesh:
  295.     EXTERNAL Mesh&, WinW%
  296.     dINIT "Mesh granularity"
  297.     dLONG Mesh&,"Mesh:",1,WinW%
  298.     dButtons "OK",KKeyEnter%,"Cancel",KKeyEsc%
  299.     DIALOG
  300. ENDP
  301.  
  302. // Prompt the user to change the zoomevel
  303. PROC GetZoom:
  304.     EXTERNAL Zoom, WinW%
  305.     LOCAL z&
  306.     z&=Zoom
  307.     dINIT "Zoomlevel"
  308.     dLONG z&, "Zoom:", -MaxZoom%, MaxZoom%
  309.     dButtons "OK",KKeyEnter%,"Cancel",KKeyEsc%
  310.     IF DIALOG
  311.         IF z&=0
  312.             z&=1
  313.         ENDIF
  314.         Zoom=z&
  315.     ENDIF
  316. ENDP
  317.  
  318. // Prompt the user to change the origin
  319. PROC GetCenter:
  320.     EXTERNAL XCent%, YCent%
  321.     LOCAL ev&(16), done%
  322.     BUSY "Tap new origin"
  323.     done%=KFalse%
  324.     DO
  325.         GETEVENT32 ev&()
  326.         IF ev&(KEvAType%)=KEvPtr&
  327.             XCent%=ev&(KEvAPtrPositionX%)
  328.             YCent%=ev&(KEvAPtrPositionY%)
  329.             Done%=KTrue%
  330.         ELSEIF ev&(KEvAType%)=KEvKeyDown&
  331.             Done% = ev&(3)=4  // Scancode for ESC
  332.         ENDIF
  333.     UNTIL Done%
  334.     BUSY OFF
  335. ENDP
  336.  
  337. PROC LoadModule:
  338.     EXTERNAL LoadedModules$()
  339.     LOCAL file$(255), free%
  340.     free%=1
  341.     WHILE (free%<9) AND (LoadedModules$(free%)<>"")
  342.         free%++
  343.     ENDWH
  344.     IF free%=9
  345.         ALERT("Can't load any more modules!")
  346.         RETURN
  347.     ENDIF
  348.     dINIT "Load a module"
  349.     dFILE file$, "File,Folder,Disk", 0, 0, KUidOPO&, 0
  350.     dBUTTONS "Cancel", -KDButtonEsc%, "OK", KDButtonEnter%
  351.     IF DIALOG<>0
  352.       LOADM(file$)
  353.       gIPRINT "Loaded "+file$
  354.       LoadedModules$(free%)=file$
  355.     ENDIF
  356. ENDP
  357.  
  358. PROC UnloadModule:
  359.     EXTERNAL LoadedModules$()
  360.     LOCAL release%
  361.     release% = mPOPUP(0,0,0,LoadedModules$(1),1,\
  362.                LoadedModules$(2),2,\
  363.                LoadedModules$(3),3,\
  364.                LoadedModules$(4),4,\
  365.                LoadedModules$(5),5,\
  366.                LoadedModules$(6),6,\
  367.                LoadedModules$(7),7,\
  368.                LoadedModules$(8),8)
  369.     IF (release%<>0) AND (LoadedModules$(release%)<>"")
  370.         UNLOADM(LoadedModules$(release%))
  371.         gIPRINT "Unloaded "+LoadedModules$(release%)
  372.         LoadedModules$(release%)=""
  373.     ENDIF
  374. ENDP
  375.  
  376. // Toolbar shortcut procedures
  377.  
  378. // Toolbar shortcut "p": Plot
  379. PROC CmdP%:
  380.     EXTERNAL OverPrint%, DrawAxes%, f$, overprintcount%
  381.     IF NOT OverPrint%
  382.         gCLS
  383.         overPrintCount%=0
  384.     ENDIF
  385.     IF DrawAxes%
  386.         Axis:
  387.     ENDIF
  388.     Caption:
  389.     PlotFunction:(f$)
  390.     RETURN 0
  391. ENDP
  392.  
  393. // Toolbar shortcut "f": Set function
  394. PROC CmdF%:
  395.     EXTERNAL f$
  396.     f$=GetFunction$:(f$)
  397.     RETURN 0
  398. ENDP
  399.  
  400. // Toolbar shortcut "r": Set range
  401. PROC CmdR%:
  402.     GetRange:
  403.     RETURN 0
  404. ENDP
  405.  
  406. // Toolbar shortcut "e": Exit
  407. PROC CmdE%:
  408.     EXTERNAL QuitFlag%
  409.     QuitFlag%=KTrue%
  410.     Return 0
  411. ENDP
  412.  
  413. #include "DrawPlot.opp"