home *** CD-ROM | disk | FTP | other *** search
- // Plotter main module
- // ⌐ 1999-2000 Glenn Strong <Glenn.Strong@cs.tcd.ie>
- // Issued under the GNU General Public license, version 2
-
- DECLARE EXTERNAL
-
- // Define exactly one of these:
- //#define CLIPBOARD_NONE
- #define CLIPBOARD_CLIPBIT
-
- #ifdef CLIPBOARD_CLIPBIT
- include "clipbit.oxh"
- #endif
-
- INCLUDE "const.oph"
- INCLUDE "System.oxh"
- INCLUDE "Toolbar.oph"
-
- PROC Main:
- LOADM "Z:\System\Opl\Toolbar.opo"
- TBarLink:("MainLoop")
- ENDP
-
- EXTERNAL buf$:(b&)
- EXTERNAL mainDialog%:
- EXTERNAL SetupMenu:
- EXTERNAL GetFunction$:(f$)
- EXTERNAL GetRange:
- EXTERNAL GetMesh:
- EXTERNAL GetZoom:
- EXTERNAL GetCenter:
- EXTERNAL LoadModule:
- EXTERNAL UnloadModule:
-
- CONST BW%=10 REM Border width in pixels
- CONST KMax=1.0
- CONST MaxZoom%=10
-
- #include "Shortcuts.oph"
- #include "DrawPlot.oph"
-
- PROC MainLoop:
- EXTERNAL TbWidth%, TVisible%, TbMenuSym%
- // Plot parameters
- GLOBAL WinH%, WinW%, Zoom, Mesh&, Offscreen%, Overprint%
- GLOBAL XCent%, YCent%, DrawAxes%, QuitFlag%, UseLines%, overPrintCount%
- GLOBAL LoadedModules$(8,255)
- // Function parameters
- GLOBAL RMin, RMax, f$(255), drawWindow%
- LOCAL k%, mod%, ev&(16), blank%, file$(KDFileNameLen%)
-
- k%=1
- DO
- LoadedModules$(k%)=""
- k%++
- UNTIL k%>8
-
- drawWindow%=gIDENTITY
- blank%=gCREATEBIT(1,1)
- gUSE drawWindow%
- overPrintCount%=0
-
- TBarInit:("Plotter",gWIDTH,gHEIGHT)
- TBarButt:("p",1,"Plot",0,blank%,0,0)
- TBarButt:("f",2,"Func",0,blank%,0,0)
- TBarButt:("r",3,"Range",0,blank%,0,0)
- TBarButt:("e",4,"Exit",0,blank%,0,0)
- TBarShow:
-
- gUPDATE ON
-
- WinH% = gHEIGHT - BW%
- WinW% = gWIDTH - BW% - TBWidth%
- XCent% = WinW%/2
- YCent% = WinH%/2
- // Set default values
- Offscreen%=KFalse% : Zoom=1.0 : Mesh&=WinW%/10
- f$="SIN(x)" : RMin=-6.0 : RMax=6.0
- DrawAxes%=KTrue% : OverPrint%=KFalse% : UseLines%=KTrue%
-
- QuitFlag%=KFalse%
-
- DO
- GETEVENT32 ev&()
-
- IF ev&(KEvAType%)=KEvPtr&
- IF TBarOffer%:(ev&(KEvAPtrOplWindowId%),ev&(KEvAPtrType%),ev&(KEvAPtrPositionX%),ev&(KEvAPtrPositionY%))
- CONTINUE
- ENDIF
- ELSEIF ((ev&(KEvAType%) AND &400)=0) OR (ev&(KEvAType%)=KKeySidebarMenu32%)
- k%=ev&(KEvAType%)
- mod%=ev&(KEvAKMod%)
- IF (k%=KKeyMenu32%) OR (k%=KKeySidebarMenu32%)
- SetupMenu:
- k%=MENU
- mod%=0
- ELSEIF mod% AND KKmodControl%
- k%=k%+$60
- IF mod% AND KKmodShift%
- k%=k%-32 // Do uppercase translation
- ENDIF
- ELSE
- CONTINUE
- ENDIF
-
- IF k%=KEYCOPY
- #ifdef CLIPBOARD_NONE
- gIPRINT "Not implemented (sorry)"
- #endif
- #ifdef CLIPBOARD_CLIPBIT
- BitmapToClipBrd%:(gIDENTITY)
- gIPRINT "Copied"
- #endif
- ELSEIF k%=KEYCLS
- gCLS
- overPrintCount%=0
- ELSEIF k%=KEYFUNCTION
- f$=GetFunction$:(f$)
- ELSEIF k%=KEYRANGE
- GetRange:
- ELSEIF k%=KEYLOADM
- LoadModule:
- ELSEIF k%=KEYUNLOADM
- UnloadModule:
- ELSEIF k%=KEYPLOT
- IF NOT OverPrint%
- gCLS
- overPrintCount%=0
- ELSE
- overPrintCount%++
- ENDIF
- IF DrawAxes%
- Axis:
- ENDIF
- Caption:
- PlotFunction:(f$)
- ELSEIF k%=KEYMESH
- GetMesh:
- ELSEIF k%=KEYZOOM
- GetZoom:
- ELSEIF k%=KEYCENTER
- GetCenter:
- ELSEIF k%=KEYRESETCENTER
- XCent% = WinW%/2
- YCent% = WinH%/2
- gIPRINT "Origin reset"
- ELSEIF k%=KEYOFFSCREEN
- Offscreen% = NOT Offscreen%
- IF Offscreen%
- gIPRINT "Offscreen set"
- ELSE
- gIPRINT "Offscreen unset"
- ENDIF
- ELSEIF k%=KEYOVERPRINT
- Overprint% = NOT Overprint%
- ELSEIF k%=KEYAXES
- DrawAxes% = NOT DrawAxes%
- IF DrawAxes%
- gIPRINT "Axes On"
- ELSE
- gIPRINT "Axes off"
- ENDIF
- ELSEIF k%=KEYUSELINES
- Uselines% = NOT UseLines%
- IF Uselines%
- gIPRINT "Lines on"
- ELSE
- gIPRINT "Lines off"
- ENDIF
- ELSEIF k%=KEYTOOLBAR
- IF TbMenuSym%<>KMenuCheckBox%
- TbarHide:
- WinW% = gWIDTH - BW%
- XCent% = WinW%/2
- ELSE
- TbarShow:
- WinW% = gWIDTH - BW% - TBWidth%
- XCent% = WinW%/2
- ENDIF
- ELSEIF k%=KEYEXPORT
- dINIT "Export MBM file"
- dFILE file$, "File,Folder,Disk", KDFileEditBox%+KDFileEditorQueryExisting%
- dBUTTONS "Cancel", -KDButtonEsc%, "OK", KDButtonEnter%
- IF DIALOG<>0
- gIPRINT "Saving..."
- gSAVEBIT file$
- ELSE
- gIPRINT "Cancelled..."
- ENDIF
- ELSEIF k%=KEYQUIT
- QuitFlag%=KTrue%
- ELSEIF k%=KEYABOUT
- dINIT "About this program"
- dTEXT "Plotter ","version 1.0", KDTextRight%
- dTEXT "", "⌐ 1999-2000 Glenn Strong", KDTextCentre%
- dTEXT "", "Free software under the GPL", KDTextCentre%
- dTEXT "","", KDTextSeparator%
- dTEXT "", "Glenn.Strong@cs.tcd.ie", KDTextCentre%
- dTEXT "","http://www.cs.tcd.ie/Glenn.Strong/epoc/", KDTextCentre%
- dBUTTONS "OK", KDButtonEnter% OR KDButtonNoLabel%
- DIALOG
- ENDIF
- ENDIF
- UNTIL QuitFlag%
- ENDP
-
-
- // Convert up to 255 bytes of a buffer into a string.
- PROC buf$:(b&)
- LOCAL l%, w&, s$(255)
- w& = PEEKL(b&)
- l% = MIN(255,w&)
- POKEB (b&+3),l%
- s$=PEEK$(b&+3)
- POKEL b&, w&
- RETURN s$
- ENDP
-
-
- // Set up menu and process selection
- PROC SetupMenu:
- EXTERNAL Offscreen%, DrawAxes%, OverPrint%, TbMenuSym%
- EXTERNAL Uselines%
- LOCAL OSOption%, AXOption%, OPOption%, LIOption%
-
- OSOption% = KMenuCheckBox%
- IF Offscreen% : OSOption% = OSOption% OR KMenuSymbolOn% : ENDIF
-
- AXOption% = KMenuCheckBox%
- IF DrawAxes% : AXOption% = AXOption% OR KMenuSymbolOn% : ENDIF
-
- OPOption% = KMenuCheckBox%
- IF OverPrint% : OPOption% = OPOption% OR KMenuSymbolOn% : ENDIF
-
- LIOption% = KMenuCheckBox%
- IF UseLines%
- LIOption% = LIOption% OR KMenuSymbolOn%
- ENDIF
-
- mINIT
- mCARD "File","Export plot...",KEYEXPORT,"Close",KEYQUIT
- mCARD "Edit","Copy",KEYCOPY,"Erase",KEYCLS
- mCARD "Function","Set...",KEYFUNCTION,"Range...",KEYRANGE,\
- "Load module...", KEYLOADM, "Unload module...", KEYUNLOADM
- mCARD "Graph", "Plot",KEYPLOT, "Mesh...",KEYMESH, "Zoom",KEYZOOM,\
- "Set origin",KEYCENTER, "Reset origin", KEYRESETCENTER
- mCARD "Options", "Offscreen",(KEYOFFSCREEN OR OSOption%),\
- "Draw Axes",(KEYAXES OR AXOption%), \
- "Overprint",(KEYOVERPRINT OR OPOption%),\
- "Show toolbar",(KEYTOOLBAR or TbMenuSym%),\
- "Use lines", (KEYUSELINES or LIOption%)
- mCARD "Help", "About...", KEYABOUT
- ENDP
-
- // Get and return a new function from the user.
- // The old function to offer is in f$
- PROC GetFunction$:(f$)
- LOCAL b&(64), t$(255), k%, i%, p@
-
- POKE$ ADDR(b&())+3,f$
- POKEL ADDR(b&()), LEN(f$)
- dINIT "Function"
- dEDITMULTI ADDR(b&()), "f(x)=",15,3,255
- dBUTTONS "OK",%o,"Cancel",KKeyEsc%
- k%=DIALOG
- IF k%=%o
- t$=buf$:(ADDR(b&()))
- // Remove embedded control characters
- i%=1
- p@=ADDR(t$)
- WHILE i%<=LEN(t$)
- IF PEEKB(p@+i%) < 32 // Control code
- POKEB p@+i%,32 // Space
- ENDIF
- i%++
- ENDWH
- RETURN t$
- ELSE
- RETURN f$
- ENDIF
- ENDP
-
- // Prompt the user to change the range
- PROC GetRange:
- EXTERNAL RMin, RMax
- dINIT "Select Range of x"
- dFLOAT RMin, " From ", -100, 100
- dFLOAT RMax, " To ", -100, 100
- dButtons "OK",KKeyEnter%,"Cancel",KKeyEsc%
- DIALOG
- ENDP
-
- // Prompt the user to change the mesh
- PROC GetMesh:
- EXTERNAL Mesh&, WinW%
- dINIT "Mesh granularity"
- dLONG Mesh&,"Mesh:",1,WinW%
- dButtons "OK",KKeyEnter%,"Cancel",KKeyEsc%
- DIALOG
- ENDP
-
- // Prompt the user to change the zoomevel
- PROC GetZoom:
- EXTERNAL Zoom, WinW%
- LOCAL z&
- z&=Zoom
- dINIT "Zoomlevel"
- dLONG z&, "Zoom:", -MaxZoom%, MaxZoom%
- dButtons "OK",KKeyEnter%,"Cancel",KKeyEsc%
- IF DIALOG
- IF z&=0
- z&=1
- ENDIF
- Zoom=z&
- ENDIF
- ENDP
-
- // Prompt the user to change the origin
- PROC GetCenter:
- EXTERNAL XCent%, YCent%
- LOCAL ev&(16), done%
- BUSY "Tap new origin"
- done%=KFalse%
- DO
- GETEVENT32 ev&()
- IF ev&(KEvAType%)=KEvPtr&
- XCent%=ev&(KEvAPtrPositionX%)
- YCent%=ev&(KEvAPtrPositionY%)
- Done%=KTrue%
- ELSEIF ev&(KEvAType%)=KEvKeyDown&
- Done% = ev&(3)=4 // Scancode for ESC
- ENDIF
- UNTIL Done%
- BUSY OFF
- ENDP
-
- PROC LoadModule:
- EXTERNAL LoadedModules$()
- LOCAL file$(255), free%
- free%=1
- WHILE (free%<9) AND (LoadedModules$(free%)<>"")
- free%++
- ENDWH
- IF free%=9
- ALERT("Can't load any more modules!")
- RETURN
- ENDIF
- dINIT "Load a module"
- dFILE file$, "File,Folder,Disk", 0, 0, KUidOPO&, 0
- dBUTTONS "Cancel", -KDButtonEsc%, "OK", KDButtonEnter%
- IF DIALOG<>0
- LOADM(file$)
- gIPRINT "Loaded "+file$
- LoadedModules$(free%)=file$
- ENDIF
- ENDP
-
- PROC UnloadModule:
- EXTERNAL LoadedModules$()
- LOCAL release%
- release% = mPOPUP(0,0,0,LoadedModules$(1),1,\
- LoadedModules$(2),2,\
- LoadedModules$(3),3,\
- LoadedModules$(4),4,\
- LoadedModules$(5),5,\
- LoadedModules$(6),6,\
- LoadedModules$(7),7,\
- LoadedModules$(8),8)
- IF (release%<>0) AND (LoadedModules$(release%)<>"")
- UNLOADM(LoadedModules$(release%))
- gIPRINT "Unloaded "+LoadedModules$(release%)
- LoadedModules$(release%)=""
- ENDIF
- ENDP
-
- // Toolbar shortcut procedures
-
- // Toolbar shortcut "p": Plot
- PROC CmdP%:
- EXTERNAL OverPrint%, DrawAxes%, f$, overprintcount%
- IF NOT OverPrint%
- gCLS
- overPrintCount%=0
- ENDIF
- IF DrawAxes%
- Axis:
- ENDIF
- Caption:
- PlotFunction:(f$)
- RETURN 0
- ENDP
-
- // Toolbar shortcut "f": Set function
- PROC CmdF%:
- EXTERNAL f$
- f$=GetFunction$:(f$)
- RETURN 0
- ENDP
-
- // Toolbar shortcut "r": Set range
- PROC CmdR%:
- GetRange:
- RETURN 0
- ENDP
-
- // Toolbar shortcut "e": Exit
- PROC CmdE%:
- EXTERNAL QuitFlag%
- QuitFlag%=KTrue%
- Return 0
- ENDP
-
- #include "DrawPlot.opp"