-- TiogaInputImpl.mesa Edited by McGregor on  7-Aug-81 14:05:39
-- Last changed by Winiger, 14-Aug-81  9:32:55

DIRECTORY

  JaMControlDefs USING [RegisterCommand, InterpreteAtom],
  InputFocus USING [SetInputFocus],
  CedarAtoms USING [GetPName],
  MessageWindow USING [AppendMessageWindow],

  Inline USING [LowHalf],
  Real USING [RoundC],
  TextLooks USING [Look],
  TiogaDocumentDefs USING [TiogaDocumentData],
  TiogaImplDefs,
  TiogaInputOpsDefs, -- USING Lots
  TiogaSelectionDefs USING [Extend, pSel, PushOrExchangeSelections, SelectChar, SelectionId,
  	SelectNode, SelectWord, SetInsertSelection, sSel, Update],
  TiogaTypeScriptDefs USING [ProcessChar],
  TIPUser USING [InstantiateNewTIPTable, TIPScreenCoords],
  UserTerminal USING [BlinkDisplay],
  ViewerOps USING [PaintViewer],
  Viewers USING [NotifyProc, Viewer],
  WTMisc USING [Print];

TiogaInputImpl: MONITOR

IMPORTS Inline, InputFocus, Real, TiogaInputOpsDefs, TiogaSelectionDefs, TiogaTypeScriptDefs,
	TIPUser, UserTerminal, ViewerOps, WTMisc
	,
	MessageWindow, CedarAtoms, JaMControlDefs
	
EXPORTS TiogaImplDefs =

BEGIN OPEN TiogaSelectionDefs;

mx, my: CARDINAL;		-- global Coord param for ops below
n: LONG INTEGER;		-- global number param for ops below

sel: SelectionId;		-- global sel ID; can be set to "secondary" by $SelSecondary
pendingDelete: BOOLEAN;		-- global sel ID; can be set to TRUE by $SelPendDel

InterpretAtom: PROCEDURE [viewer: Viewers.Viewer, atom: ATOM] =
	BEGIN OPEN TiogaInputOpsDefs;
	SELECT atom FROM
--		$Again		=> Again[];
		$AllCaps	=> Capitalise[allCaps, sel];
		$AllLower	=> Capitalise[allLower, sel];
		$ApplyLook	=> ModifyLook[NumberToLook[n], add, sel];
		$BackSpace	=> BackSpace[];
		$BackWord	=> BackWord[];
--		$BSRight	=> BSRight[];
--		$BWRight	=> BWRight[]
--		$CaretLook	=> CaretLook[];
--		$ControlChar	=> ControlChar[];
		$Copy		=> Copy[sel];
		$Delete		=> Delete[sel];
--		$Eval		=> Eval[];
--		$Include	=> Include[];
		$InitialCaps	=> Capitalise[initCaps, sel];
--		$MakeNode	=> MakeNode[];
--		$MergeNodes	=> MergeNodes[];
		$Move		=> Move[sel];
--		$NodeType	=> NodeType[];
--		$OctalChar	=> OctalChar[];
		$Paint		=> ViewerOps.PaintViewer[viewer];
		$ReadProfile	=> ReloadTIPTable[viewer];
		$RemoveLook	=> ModifyLook[NumberToLook[n], remove, sel];
--		$Replace	=> Replace[sel];
--		$SelAll		=> SelAll[];
		$SelChar	=> SelectChar[viewer, NARROW[viewer.data], mx, my, sel];
--		$SelCharSpots	=> SelCharSpots[];
--		$SelClick	=> SelClick[];
--		$SelDelims	=> SelDelims[];
--		$SelDotUnder	=> SelDotUnder[];
		$SelExchange	=> PushOrExchangeSelections[];
		$SelExtend	=> Extend[viewer, NARROW[viewer.data], mx, my, sel];
--		$SelInvert	=> SelInvert[];
--		$SelLeft	=> SelLeft[];
--		$SelLine	=> SelLine[];
		$SelNode	=> SelectNode[viewer, NARROW[viewer.data], mx, my, sel];
--		$SelNoDelims	=> SelNoDelims[];
		$SelPendDel	=> pendingDelete ← TRUE;
--		$SelPoint	=> SelPoint[];
		$SelPrimary	=> sel ← primary;
--		$SelRight	=> SelRight[];
		$SelSecondary	=> sel ← secondary;
--		$SelSelSpots	=> SelSelSpots[];
--		$SelSent	=> SelSent[];
		$SelUpdate	=> Update[viewer, NARROW[viewer.data], mx, my, sel];
--		$SelUnderline	=> SelUnderline[];
		$SelWord	=> SelectWord[viewer, NARROW[viewer.data], mx, my, sel];
--		$SplitNode	=> SplitNode[];
--		$Stop		=> Stop[];
		$Transpose	=> Transpose[sel];
--		$Undo		=> Undo[];
		ENDCASE		=> JaMControlDefs.InterpreteAtom[CedarAtoms.GetPName[atom]];
	END;

NumberToLook: PROC [n: LONG INTEGER] RETURNS [look: TextLooks.Look] = INLINE BEGIN
	RETURN['a+Inline.LowHalf[n]];
	END;

TiogaNotifyProc: PUBLIC ENTRY Viewers.NotifyProc = BEGIN
	tdd: TiogaDocumentDefs.TiogaDocumentData ← NARROW[self.data];
	IF tdd.tsInfo=NIL THEN InterpretInput[self, input]
	ELSE InterpretTypescriptInput[self, input];
	END;

InterpretInput: PROCEDURE [viewer: Viewers.Viewer, params: LIST OF REF ANY] =
	BEGIN OPEN TiogaInputOpsDefs;

	InsSel: PROC RETURNS [BOOLEAN] =
		INLINE {RETURN[pSel.granularity=point AND sSel.viewer=NIL]};
	
	sel ← primary;	-- reset non-sticky switches
	pendingDelete ← FALSE;
	
	FOR input: LIST OF REF ANY ← params, input.rest UNTIL input=NIL DO
	    WITH input.first SELECT FROM
		z: REF CHARACTER => {IF ~InsSel[] THEN SetInsertSelection[];
			BufferedInsertChar[z↑]};
		z: ATOM	=> {WaitForRepaintToFinish[]; InterpretAtom[viewer, z]};
		z: REF LONG INTEGER => n ← z↑;
		z: TIPUser.TIPScreenCoords => {mx ← Real.RoundC[z.x];
			my ← viewer.ch-Real.RoundC[z.y]};
		z: REF TEXT => {IF ~InsSel[] THEN SetInsertSelection[]; BufferedInsertText[z]};
		ENDCASE	=> UserTerminal.BlinkDisplay;
	    ENDLOOP;
	END;

InterpretTypescriptInput: PROCEDURE [viewer: Viewers.Viewer, params: LIST OF REF ANY] =
	BEGIN OPEN TiogaInputOpsDefs;

	sel ← primary;	-- reset non-sticky switches
	pendingDelete ← FALSE;
	
	FOR input: LIST OF REF ANY ← params, input.rest UNTIL input=NIL DO
	    WITH input.first SELECT FROM
		z: REF CHARACTER => TiogaTypeScriptDefs.ProcessChar[viewer, z↑];
		z: ATOM	=> {WaitForRepaintToFinish[]; InterpretAtom[viewer, z]};
		z: TIPUser.TIPScreenCoords => {mx ← Real.RoundC[z.x];
			my ← viewer.ch-Real.RoundC[z.y]};
		ENDCASE	=> UserTerminal.BlinkDisplay;
	    ENDLOOP;
	END;

ReloadTIPTable: PROCEDURE [viewer: Viewers.Viewer] = BEGIN
	viewer.class.tipTable ← TIPUser.InstantiateNewTIPTable["Tioga.tip" ! ANY =>
		{UserTerminal.BlinkDisplay; CONTINUE}];
	InputFocus.SetInputFocus[];	-- kill selection; force ChangeTIPContext
	END;
	

-- for debugging...
Print: PROC [ref: REF READONLY ANY] RETURNS[STRING] = {RETURN[WTMisc.Print[ref]]};

-- main code (under development)

RegAllCaps: PROC = {TiogaInputOpsDefs.Capitalise[allCaps, sel]};
RegAllLower: PROC = {TiogaInputOpsDefs.Capitalise[allLower, sel]};
RegCopy: PROC = {TiogaInputOpsDefs.Copy[sel]};
RegDelete: PROC = {TiogaInputOpsDefs.Delete[sel]};
RegInitialCaps: PROC = {TiogaInputOpsDefs.Capitalise[initCaps, sel]};
RegMove: PROC = {TiogaInputOpsDefs.Move[sel]};
RegSelPrimary: PROC = {sel ← primary};
RegSelSecondary: PROC = {sel ← secondary};
RegTranspose: PROC = {TiogaInputOpsDefs.Transpose[sel]};

JaMControlDefs.RegisterCommand["AllCaps"L,RegAllCaps];
JaMControlDefs.RegisterCommand["AllLower"L,RegAllLower];
JaMControlDefs.RegisterCommand["Copy"L,RegCopy];
JaMControlDefs.RegisterCommand["Delete"L,RegDelete];
JaMControlDefs.RegisterCommand["InitialCaps"L,RegInitialCaps];
JaMControlDefs.RegisterCommand["Move"L,RegMove];
JaMControlDefs.RegisterCommand["SelPrimary"L,RegSelPrimary];
JaMControlDefs.RegisterCommand["SelSecondary"L,RegSelSecondary];
JaMControlDefs.RegisterCommand["Transpose"L,RegTranspose];

MessageWindow.AppendMessageWindow["  JaM (8.7.81)"];

END.