DIRECTORY Atom, BiScrollers, GGInterfaceTypes, GGUserInput, GGProps, InputFocus, IO, PropRegistry, Rope, ViewerClasses; GGRegistryImpl: CEDAR PROGRAM IMPORTS Atom, BiScrollers, GGUserInput, InputFocus, PropRegistry, Rope = BEGIN Viewer: TYPE = ViewerClasses.Viewer; GGData: TYPE = GGInterfaceTypes.GGData; STREAM: TYPE = IO.STREAM; ROPE: TYPE = PropRegistry.ROPE; Doc: TYPE = PropRegistry.Doc; Key: TYPE = PropRegistry.Key; lf: ROPE = "\l"; noFocus: ROPE = "No input focus in any viewer"; noGGFocus: ROPE = "No input focus in Gargoyle viewer"; LFNewLine: PROC [in: ROPE] RETURNS [out: ROPE] = { IF in#NIL THEN { size: INT = Rope.Size[in]; out _ in; FOR index: INT _ Rope.SkipTo[s: in, pos: 0, skip: "\l\r"], Rope.SkipTo[s: in, pos: index+1, skip: "\l\r"] UNTIL index = size DO out _ Rope.Replace[base: out, start: index, len: 1, with: lf]; ENDLOOP; }; }; GGPropGet: PropRegistry.PropGetProc = { lor: LIST OF ROPE; extRef: GGUserInput.External; ggData: GGData; focus: InputFocus.Focus _ InputFocus.GetInputFocus[]; from: Viewer _ IF focus#NIL THEN focus.owner ELSE NIL; IF from=NIL THEN RETURN [NIL, noFocus]; ggData _ NARROW[BiScrollers.ClientDataOfViewer[from]]; IF ggData=NIL THEN RETURN [NIL, noGGFocus]; extRef _ NEW[GGUserInput.ExternalRec _ [FALSE, key] ]; -- pass in Key GGUserInput.EventNotify[ggData, LIST[$GetPropExternal, extRef] ]; UNTIL extRef.valid DO GGUserInput.WaitExternal[extRef] ENDLOOP; lor _ NARROW[extRef.results]; prop _ LFNewLine[lor.first]; error _ LFNewLine[lor.rest.first]; }; GGPropList: PropRegistry.PropListProc = { extRef: GGUserInput.External; ggData: GGData; focus: InputFocus.Focus _ InputFocus.GetInputFocus[]; from: Viewer _ IF focus#NIL THEN focus.owner ELSE NIL; IF from=NIL THEN RETURN [NIL]; ggData _ NARROW[BiScrollers.ClientDataOfViewer[from]]; IF ggData=NIL THEN RETURN [NIL]; extRef _ NEW[GGUserInput.ExternalRec _ [] ]; GGUserInput.EventNotify[ggData, LIST[$ListPropsExternal, extRef] ]; UNTIL extRef.valid DO GGUserInput.WaitExternal[extRef] ENDLOOP; props _ NARROW[extRef.results]; }; GGPropRem: PropRegistry.PropRemProc = { ggData: GGData; focus: InputFocus.Focus _ InputFocus.GetInputFocus[]; from: Viewer _ IF focus#NIL THEN focus.owner ELSE NIL; IF from=NIL THEN RETURN; ggData _ NARROW[BiScrollers.ClientDataOfViewer[from]]; IF ggData=NIL THEN RETURN; GGUserInput.EventNotify[ggData, LIST[$RemoveProp, Atom.GetPName[key]] ]; }; GGPropSet: PropRegistry.PropSetProc = { keyVal: Rope.ROPE; ggData: GGData; focus: InputFocus.Focus _ InputFocus.GetInputFocus[]; from: Viewer _ IF focus#NIL THEN focus.owner ELSE NIL; IF from=NIL THEN RETURN; ggData _ NARROW[BiScrollers.ClientDataOfViewer[from]]; IF ggData=NIL THEN RETURN; keyVal _ Rope.Cat[Atom.GetPName[key], " ", prop]; -- that's what GG wants GGUserInput.EventNotify[ggData, LIST[$SetProp, keyVal] ]; }; GGGetTarget: PropRegistry.GetTargetProc = { success _ TRUE; -- LIE FOR NOW }; GGSetTarget: PropRegistry.SetTargetProc = { success _ TRUE; -- LIE FOR NOW }; GGValidateTarget: PropRegistry.ValidateTargetProc = { success _ NOT (doc.destroyed OR doc.iconic); IF NOT success THEN error _ IF doc.destroyed THEN "target viewer destroyed" ELSE "target viewer iconic" }; RegisterGG: PROC = { class: PropRegistry.RegistryClass _ NEW[PropRegistry.RegistryClassObj]; class^_ [ name: $ActionArea, getProp: GGPropGet, setProp: GGPropSet, remProp: GGPropRem, listProps: GGPropList, getTarget: GGGetTarget, setTarget: GGSetTarget, validTarget: GGValidateTarget ]; PropRegistry.Register[class]; }; RegisterGG[]; END. Β GGRegistryImpl.mesa Copyright Σ 1991 by Xerox Corporation. All rights reserved. Kenneth A. Pier, June 14, 1991 6:15 pm PDT PROC [key: Key, doc: Doc, hint: REF] RETURNS [prop, error: ROPE]; extRef action type triggers BROADCAST when completed GetPropExternal returns LIST[prop, error] in extRef.results PROC [doc: Doc, hint: REF] RETURNS [props: LIST OF Key]; extRef action type triggers BROADCAST when completed ListPropsExternal returns LIST OF ATOM in extRef.results PROC [key: Key, doc: Doc, hint: REF, edited: BOOL]; no need for special RemPropExternal since nothing is returned PROC [key: Key, doc: Doc, hint: REF, prop: ROPE, edited: BOOL]; no need for special SetPropExternal since nothing is returned PROC [doc: Doc, hint: REF] RETURNS [success: BOOL, t: Target]; RETURN [FALSE, [NIL, NIL]]; PROC [doc: Doc, hint: REF, t: Target] RETURNS [success: BOOL, error: ROPE]; PROC [doc: Doc, hint: REF, t: Target] RETURNS [success: BOOL, error: ROPE]; Κλ•NewlineDelimiter ™šœ™J™˜>Kšœ˜—K˜—K˜—K˜šž œ˜'Kšœœœœ™AKšœœœœ˜Kšœ˜Kšœ˜Kšœ5˜5Kš œœœœ œœ˜6Kš œœœœœ ˜'Kšœ œ'˜6Kš œœœœœ ˜+Kšœ œœ Οc˜EKšœ œΟbœ ˜Ašœœ   œ œ˜?KšŸ4™4—šœœ˜Kš œ,™;—Kšœ˜Kšœ"˜"K˜K˜—šž œ˜)Kš œœœ œœ™8Kšœ˜Kšœ˜Kšœ5˜5Kš œœœœ œœ˜6Kš œœœœœ˜Kšœ œ'˜6Kš œœœœœ˜ Kšœ œ ˜,šœ œ œ ˜CKšŸ4™4—šœœ   œ œ˜?Kš œ'™8—Kšœœ˜K˜K˜—šž œ˜'Kšœœ œ™3Kšœ˜Kšœ5˜5Kš œœœœ œœ˜6Kšœœœœ˜Kšœ œ'˜6Kšœœœœ˜šœ œ  œ˜HK™=—K˜K˜—šž œ˜'Kšœœœ œ™?Kšœ œ˜Kšœ˜Kšœ5˜5Kš œœœœ œœ˜6Kšœœœœ˜Kšœ œ'˜6Kšœœœœ˜Kšœ2Ÿ˜Išœ œ˜9K™=—K˜K˜—šž œ ˜+Kšœœœ œ ™>Kšœ œŸΠbc ˜Kšœœœœ™K˜K˜—šž œ ˜+Kš œœ œ œ œ™KKšœ œŸ‘ ˜K˜K˜—šžœ%˜5Kš œœ œ œ œ™KKšœ œœ ˜,Kš œœ œ œœœ˜gK˜—K˜šž œœ˜Kšœ$œ ˜G˜ Kšœ˜K˜K˜Kšœ˜K˜K˜K˜K˜K˜—Kšœ˜K˜—K˜Kšœ ˜ K˜Kšœ˜—…— ΐm