⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frame.tpl

📁 在手机操作系统symbina上使用的一个脚本扩展语言的代码实现,可以参考用于自己的开发
💻 TPL
📖 第 1 页 / 共 2 页
字号:
REM Frame for OplER1

INCLUDE "Const.oph"
INCLUDE "system.oxh"
INCLUDE "Toolbar.oph"

REM For convience sake, frame.tph is included inline:
REM INCLUDE "frame.tph"

REM Must get a real Uid from Symbian sometime! 
CONST KUidFrame& = &153112B5

CONST KApprsc$    = ".rsc"
CONST KAppEng$		= "Frame"

CONST KAppName$   = "Frame"
REM CONST KRSCroot$   = "Frame"
CONST KAppdir$    = "\system\apps\frame\"
CONST KAppini$    = ".ini"
CONST KApphlp$    = ".hlp"

REM Events
CONST KCSystemEvent%=0
CONST KCUserEvent%=1

REM Menu unassigned options.
CONST KCMenuNoKey1%=1

REM For OpenINIFile%:
REM CONST KCRead%=1
REM CONST KCWrite%=2

REM Debug values
REM Debug window rank.
CONST KCDebugTopRank%=2

REM Color stuff.
CONST kColorMode%=5

REM End of frame.tph inline inclusion.

CONST KReadMode%=0
CONST KWriteMode%=1

CONST KOplAlignment%=1 rem 0 for lbc1, 1 for LBC2.
CONST KUnicodeCharLen%=2 rem 1 for ASCII, 2 for Unicode machines.

REM 7Sep98 Added pointerfilter.

DECLARE EXTERNAL
EXTERNAL Frame:
EXTERNAL FrameMain:
EXTERNAL GetEv%:
EXTERNAL MoveCur%:(akey%,aKeyMod%)
EXTERNAL HandAct%:(aCmd$)
EXTERNAL NewFile:(aEventType%)
EXTERNAL OpenFile:(aEventType%)
EXTERNAL GetName%:(aTitle$,aType%)
EXTERNAL Revert:
EXTERNAL Init:
EXTERNAL Read_Ini:
EXTERNAL ReadINIRec$:(aDefaultValue$)
EXTERNAL Write_Ini:
EXTERNAL WriteINIRec%:(aDefaultValue$)
EXTERNAL OpenINIFile%:(aAppUid&,aMode%)
EXTERNAL GetLang:
EXTERNAL InitTBar:
EXTERNAL InitTopTbar:
EXTERNAL StatVis:
EXTERNAL initStat:
EXTERNAL TopToolVis:
EXTERNAL Help:
EXTERNAL KillHelp:
EXTERNAL WhereIs$:(aPath$)
EXTERNAL UpdateTBarTitle:
EXTERNAL InitScr:
EXTERNAL Pref:
EXTERNAL DebugPref:
EXTERNAL PointerFilterPref:
EXTERNAL Save:
EXTERNAL SaveAs:
EXTERNAL LowSave:(aName$,aInformF%)
EXTERNAL LowLoad%:(aName$)
EXTERNAL CmdE%:
EXTERNAL CmdA%:
EXTERNAL CmdC:
EXTERNAL CmdTBDownP%:
EXTERNAL ToolVis:
EXTERNAL DemoA:
EXTERNAL DemoC:
EXTERNAL DoSomething:
EXTERNAL SelectAll:
EXTERNAL About:
EXTERNAL Copy:
EXTERNAL Delete:
EXTERNAL Export:
EXTERNAL MergeIn:
EXTERNAL Print:
EXTERNAL PrintSetup:
EXTERNAL PageSetup:
EXTERNAL Paste:
EXTERNAL PrintPreview:
EXTERNAL Cut:
EXTERNAL Redo:
EXTERNAL Undo:
EXTERNAL CutPaste:
EXTERNAL IrTrans:
EXTERNAL ZoomIn:
EXTERNAL ZoomOut:
EXTERNAL Color:
EXTERNAL Setcolor:(aR%,aG%,aB%)

CONST NYI$ = " Not yet implemented"

APP Frame, KUidFrame&
	ICON "frameIcon.mbm"
	ICON "frameIconMask.mbm"
	CAPTION KAppName$, KLangEnglish%
	FLAGS 1
ENDA

PROC Frame:
	GLOBAL gScrHt%, gScrWid%

	gScrWid% = gWIDTH
	gScrHt% = gHEIGHT

	REM Enable the receipt of machine switch-on events
	SETFLAGS KSendSwitchOnMessage&
	REM Maybe disable this in future?

	Getlang:

	LOADM "Z:\System\Opl\Toolbar.opo"
	TBarLink:("FrameMain")
	dINIT "Abnormal exit from TBarLink"
	DIALOG
ENDP

PROC FrameMain:
	EXTERNAL TbVis%

	GLOBAL gFile$(255), gNFile$(255), gLUFile$(255)
	GLOBAL gExit%
	GLOBAL gEvent&(16)
	GLOBAL gWId%
	GLOBAL gHelpId&, gHStatus&
	GLOBAL gINIfile$(255)
	GLOBAL gDebugF%
	GLOBAL gDeltaF%	REM Bool flag true if a change has been made.
	GLOBAL gFileDeltaF% REM Bool flag true if the file has changed since loading.
	GLOBAL gTopTBVis%	REM Top toolbar visible flag.
	GLOBAL gStatVis%	REM Status window visible.
	REM Pointer Filter stuff
	GLOBAL gPointerFilterF%, gPFFilter%, gPFMask%


	LOCAL EventType&
	LOCAL justInF%
	LOCAL key%, kmod%, menu%
	LOCAL menuPos%
	LOCAL TBon% REM simple bool flag menu toolbar.
	LOCAL TopTBon% REM Top toolbar bool flag.
	LOCAL SWon%	REM Status window on.
	LOCAL RevertDim% REM Grey out revert in menu.
	LOCAL HotF% REM Hotkey flag.
	LOCAL scrDbg%	REM toggle debug screen.

	scrDbg%=1
	justInF%=KTrue%
	Init:

	REM Process command line.
	gNFile$ = CMD$(KCmdUsedFile%)
	HandAct%:( CMD$(KCmdLetter%) )

	REM the main loop.
	DO

		REM Check the change flag.
		IF gDeltaF%
			gFileDeltaF% = KTrue%
			gDeltaF% = KFalse%
			rem if Zoom on
				rem update zoom window
			rem endif
		ENDIF

		GetEv%:

		REM In the future, this functionality will be somewhere
		REM else, so calling GetEv%: will return a key press.

		EventType& = gEvent&(KEvaType%)
		IF gDebugF%
			PRINT "FrameMain: evt="; HEX$(EventType&),
		ENDIF

		IF EventType&=KEvPtr&
			REM PRINT "KEvPtr"
			IF gEvent&(KEvAPtrType%)=KEvPtrDrag&
				IF JustInF%
					gAT gEvent&(KEvAPtrScreenPosX%), gEvent&(KEvAPtrScreenPosY%)
					justInF%=KFalse%
				ENDIF
				gLINETO gEvent&(KEvAPtrScreenPosX%), gEvent&(KEvAPtrScreenPosY%)
				gDeltaF%=KTrue%
			ELSEIF gEvent&(KEvAPtrType%) = KEvPtrPenDown&
				justInF%=KFalse%
				gAT gEvent&(KEvAPtrScreenPosX%), gEvent&(KEvAPtrScreenPosY%)
				gLINEBY 0,0
				gDeltaF%=KTrue%
			ENDIF
			CONTINUE

		ELSEIF EventType&=KEvPtrEnter&
			REM PRINT "KEvPtrEnter&"
			justInF%=KTrue%
			CONTINUE

		ELSEIF EventType&=KevPtrExit&
			REM PRINT "KEvPtrExit&"
			CONTINUE

		ENDIF

		REM To get this far, it must be a keypress.

		key% = gEvent&(KEvaType%)	REM AND $FF
		kmod% = gEvent&(KEvAKMod%)
		PRINT "Key=";key%, "KMod=";kmod%

		REM If its the sidebar (anything other than menu...)
		IF (key%>KKeySidebarMenu%) AND (key%<=KKeySidebarMenu%+4)
			IF key%=KKeySidebarMenu%+1 :CutPaste:
			ELSEIF key%=KKeySidebarMenu%+2 :Irtrans:
			ELSEIF key%=KKeySidebarMenu%+3 :ZoomIn:
			ELSEIF key%=KKeySidebarMenu%+4 :ZoomOut:
			ENDIF
			CONTINUE
		ENDIF

		HotF%=KFalse%
		IF (key%<=26)
			IF kMod% AND 4	REM Ctrl
				HotF%=KTrue%
			ENDIF
		ENDIF

		REM Check for Menu or hotkey.
		IF ( (key%=KKeyMenu%) OR (key%=KKeySidebarMenu%) OR (HotF%=KTrue%) )
			IF key%=KKeyMenu% OR key%=KKeySidebarMenu%
				PRINT "MENU"
			ELSE
				PRINT "HOT"
			ENDIF

			IF ( (key%=KKeyMenu%) OR (key%=KKeySidebarMenu%) )
				REM Build menu ctors.
				IF TbVis% :TbOn%=$2000 :ELSE :TbOn%=0 :ENDIF
				IF gTopTbVis% :TopTbOn%=$2000 :ELSE :TopTbOn%=0 :ENDIF
				IF gStatVis% :SWOn%=$2000 :ELSE :SWOn%=0 :ENDIF
				IF gFileDeltaF% :RevertDim%=0 :ELSE :RevertDim%=KMenuDimmed% :ENDIF

				mINIT
				mCASC "Printing", "Page setup"+CHR$(KEllipsis&), %U, "Print setup"+CHR$(KEllipsis&), %P, "Print preview"+CHR$(KEllipsis&), %V, "Print"+CHR$(KEllipsis&), %p
				mCASC "More", "Save as"+CHR$(KEllipsis&), %S, "Save", %s, "Revert to saved", %r OR RevertDim%, "Merge in"+CHR$(KEllipsis&), %I, "Export"+CHR$(KEllipsis&), %E
				mCARD "File", "Create new file"+CHR$(KEllipsis&),%n, "Open file"+CHR$(KEllipsis&), %o, "Printing>",16, "More>",-16, "Close", %e
				mCARD "Edit","Undo", %z, "Redo", -%y, "Cut", %x, "Copy", %c, "Paste", -%v, "Delete all", %d, "Select all", %a
				mCARD "View", "Zoom in", %m, "Zoom out", -%M, "Show toolbar",%t OR KMenuCheckBox% OR TbOn%,"Show top toolbar",%T OR KMenuCheckBox% OR TopTbOn%, "Show status window", %C OR KMenuCheckBox% OR SWOn%
				mCARD "Tools", "Preferences"+CHR$(KEllipsis&), %k, "Some other stuff here", -KCMenuNokey1%, "Colour", -%u, "About", %A, "Help", %H

				LOCK ON
				menu%=MENU(MenuPos%)
				LOCK OFF

				IF menu%=0
					REM Esc hit.
					CONTINUE
				ENDIF

				key%=menu%

			ELSE
				REM Must be hotkey.
				key% = key% - 1 + %a
				IF kmod% AND 2
					key% = key% + (%A - %a)
				ENDIF
			ENDIF

			PRINT "Now key=";key%

			IF key%=KCMenuNokey1% REM Unassigned menu option #1
				DoSomething:
			ELSEIF key%=%a :SelectAll:
			ELSEIF key%=%A :About:
			ELSEIF key%=%c :Copy:
			ELSEIF key%=%C :StatVis:
			ELSEIF key%=%d :Delete:
			ELSEIF key%=%e :gExit%=KTrue%
			ELSEIF key%=%E :Export:


			ELSEIF key%=%H :Help:
			ELSEIF key%=%I :MergeIn:
			ELSEIF key%=%k :Pref:
			ELSEIF key%=%m :ZoomIn:
			ELSEIF key%=%M :ZoomOut:
			ELSEIF key%=%n :NewFile:(KCUserEvent%)
			ELSEIF key%=%o :OpenFile:(KCUserEvent%)
			ELSEIF key%=%p :Print:
			ELSEIF key%=%P :PrintSetup:
			ELSEIF key%=%r :Revert:
			ELSEIF key%=%s :Save:
			ELSEIF key%=%S :SaveAs:

			ELSEIF key%=%t :ToolVis:
			ELSEIF key%=%T :TopToolVis:
			ELSEIF key%=%u :Color:
			ELSEIF key%=%U :PageSetup:

			ELSEIF key%=%v :Paste:
			ELSEIF key%=%V :PrintPreview:
			ELSEIF key%=%x :Cut:
			ELSEIF key%=%y :Redo:
			ELSEIF key%=%z :Undo:
			ENDIF	REM End of huge if statement.

		REM End of hotkey processing.

		ELSEIF MoveCur%:(key%, kmod%)

		ELSEIF key%=9	REM Tab
			REM Toggle the debug screen.
			IF scrDbg%=KCDebugTopRank%
				scrDbg%=255
			ELSE
				scrDbg%=KCDebugTopRank%
			ENDIF
			gORDER 1,scrDbg%

		ENDIF REM Of key pressing.

REM Can't put much here because pen actions
REM don't get down here these days...
	
	UNTIL gExit%=KTrue%

	IF gFileDeltaF% = KTrue%
		Save:
	ENDIF

	REM Close INI etc.
	Write_INI:

	KillHelp:

	REM If debug window is top, let me see the final
	REM debug trace, otherwise exit.
	IF scrDbg%=KCDebugTopRank%
		PRINT "Exit."
		GET
	ENDIF

	STOP
ENDP

PROC GetEv%:
	EXTERNAL gDebugF%,gPointerFilterF%,gPFFilter%,gPFMask%
	EXTERNAL gExit%,gEvent&(),gWid%,gNFile$

	LOCAL type$(1)
	LOCAL proF%	REM Processed flag.
	LOCAL EventType&

	IF gDebugF%
		PRINT "[";
	ENDIF

	IF gDebugF%
		IF gPointerFilterF%
			POINTERFILTER gPFFilter%, gPFMask%
		ENDIF
	ENDIF

	WHILE gExit% = KFalse%
		GETEVENT32 gEvent&()
		EventType& = gEvent&( KEvaType% )

		IF gDebugF%
			PRINT ">";
		ENDIF
		REM PRINT "Event=";HEX$(EventType&),

		REM Examine eventType
		IF eventType& = KEvPtr&
			REM For Pointer events...
			proF%=TBarOffer%:(gEvent&(KEvAPtrOplWindowId%), gEvent&(KEvAPtrType%), gEvent&(KEvAPtrPositionX%), gEvent&(KEvAPtrPositionY%))
			IF proF%
				REM TB handled it.
			ELSE
				REM Pass it to our handler to check the window...
				IF gDebugF%
					PRINT "KEvPtr",
				ENDIF
				IF gEvent&(KEvAPtrOplWindowId%) = gWId%
					BREAK
				ENDIF
			ENDIF

		ELSEIF eventType& = KEvPtrEnter&
			IF gDebugF%
				PRINT "KEvPtrEnter",
			ENDIF
			IF gEvent&(KEvAPtrOplWindowId%) = gWId%
				BREAK
			ENDIF

		ELSEIF eventType& = KEvCommand&
			gNFile$ = GETCMD$
			type$ = LEFT$(gNFile$,1)
			gNFile$ = MID$(gNFile$,2,255)
			HandAct%:( type$ )

		ELSEIF eventType&=0
			REM Null event.
			CONTINUE

		ELSEIF ( (eventType&=KEvKeyDown&) OR (eventType&=KEvKeyUp&) )
			CONTINUE

		ELSEIF ( (eventType& = KEvFocusGained&) OR (eventType& = KEvFocusLost&) )
			IF gDebugF%
				PRINT "Focus!",
			ENDIF
			CONTINUE

		ELSEIF eventType& = KEvSwitchOn&
			CONTINUE

		ELSEIF (eventType& AND KKeySidebarMenu%)
			REM PRINT "sidebar",
			BREAK

		ELSEIF (eventType& AND $400)=0
			REM PRINT "event_keypress",
			REM keypress.
			BREAK

		ELSE
			PRINT "Ignored event=0x";HEX$(eventType&), EventType&,
		ENDIF
	ENDWH
	IF gDebugF%
		PRINT "]"
	ENDIF
ENDP

PROC MoveCur%:(key%, kmod%)
	PRINT "^",
ENDP

PROC HandAct%:(e$)
	REM Process EPOC command events, using
	REM the new filename to allow old one
	REM to be saved etc.
	REM The new name always (ends up in) gNFile$.

	EXTERNAL gExit%,gNFile$,gLUFile$

	LOCAL file$(255)
	LOCAL command$(1)

	command$ = e$

	IF e$="X"
		gExit% = KTrue%
		RETURN

	ELSEIF e$=KCmdLetterRun$
		PRINT "HandAct: Info - gNFile$="; gNFile$
		REM Now ignore gNFile$

		file$=gLUFile$ REM GetLastUsedFile$:(KUidFrame&)
		PRINT "HandAct: LU File$ is", file$
		IF file$<>"" AND EXIST(file$)
			gNFile$ = file$
			OpenFile:(KCSystemEvent%)
			RETURN
		ENDIF

		REM If not found, try using the command line arg.
		IF EXIST( gNFile$ )
			command$ = KCmdLetterOpen$
		ELSE
			command$ = KCmdLetterCreate$
		ENDIF
		REM And fall through into next bit...
	ENDIF

	IF command$ = KCmdLetterOpen$
		OpenFile:( KCSystemEvent% )
	ELSEIF command$ = KCmdLetterCreate$
		NewFile:( KCSystemEvent% )
	ENDIF
ENDP

PROC NewFile:( eventType% )
	EXTERNAL gFile$,gWId%,gNFile$
	EXTERNAL gScrWid%,gScrHt%

	PRINT "NewFile:";

	REM First things first. Save the old file
	REM before even talking to the user.
	IF gFile$ = ""
		PRINT "No old file to save"
	ELSE
		PRINT "Saving old file ["; gFile$; "]"
		IF gWId%
			LowSave:( gFile$, KTrue% ) REM Let user know.
		ELSE
			PRINT "NewFile: no gWId to save"
		ENDIF
	ENDIF

	IF eventType%=KCUserEvent%
		PRINT "User event: get name"
		IF GetName%:("Create new file",KDFileEditBox%+KDFileEditorQueryExisting%)
		ELSE
			RETURN
		ENDIF
	ELSE
		PRINT "System event"
	ENDIF
	PRINT "["; gNFile$; "]"

	IF EXIST(gNFile$)
		PRINT "Created file ["; gNFile$;
		PRINT "] already exists"
	ENDIF
	gFile$ = gNFile$
	SETDOC gFile$
	IF gWId%
		gCLOSE gWId% :gWId%=0
	ENDIF

	gWId% = gCREATE(0,0, gScrWid%, gScrHt%, 1, kColorMode%)
	UpdateTBarTitle:
	InitScr:

	REM Save it here, to match fn of Sketch.
	REM This also provides something to Revert to.
	LowSave:( gFile$, KFalse% ) REM Don't tell user.
	REM It's safe to not tell because this new
	REM file can't be very big, therefore it won't
	REM take long to save!
ENDP

PROC OpenFile:(eventType%)
	REM Opens the file in gNFile$, but trys to save
	REM the file in gFile$ first.

	EXTERNAL gFileDeltaF%,gFile$,gNFile$,gWId%
	
	LOCAL newId%

	PRINT "OpenFile:";

	REM Save the current one if it needs it.
	IF gFileDeltaF%=KTrue%
		IF gFile$ = ""
			PRINT "No old file to save"
		ELSE
			PRINT "Saving old file ["; gFile$; "]"
			LowSave:( gFile$, KTrue% ) REM tell user.
		ENDIF
	ENDIF
	
	IF eventType%=KCUserEvent%
		PRINT "User event: get name"		
		IF GetName%:("Open file",0)
		ELSE
			RETURN
		ENDIF
	ELSE
		PRINT "System event"
	ENDIF
	PRINT "["; gNFile$; "]"

	IF NOT EXIST(gNFile$)
		GIPRINT "File does not exist"
		RETURN
	ENDIF

REM Attempt to load it before changing names etc.
REM OK, for a second you need 2x memory for bitmaps
REM but with a 8MB machine...
REM One day, make this an option.

	REM Untrusted new file.
	newId% = LowLoad%:( gNFile$ )
	IF newId%=0
		GIPRINT "Error loading file"
	ELSE
		gFile$ = gNFile$
		IF gWid%
			gCLOSE gWId% :gWId%=0
		ENDIF
		gWId% = newId%
		SETDOC gFile$
		UpdateTBarTitle:
		InitScr:
	ENDIF
ENDP

PROC GetName%:(title$, type%)
	EXTERNAL gNFile$

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -