DIRECTORY
FS USING [ComponentPositions, ExpandName, Error],
GriffinDefs USING [UserMessage],
GriffinText,
GriffinFontDefs USING [Rot0Degrees, Regular, FontDescriptor],
GriffinStyle USING [FontFromInternalFont, InternalFont],
ImagerFont USING [Extents, RopeWidth, FontBoundingBox],
MessageWindow USING [Append, Blink],
StyleDefs USING [StyleHandle, Font],
ObjectDefs USING [tokenSize],
PointDefs,
Real USING [RoundI],
Rope USING [ROPE, Cat],
Vector2 USING [VEC],
ViewerTools USING [GetSelectionContents];



GriffinTextImpl: CEDAR PROGRAM
IMPORTS FS, GriffinDefs, ImagerFont, Real, Rope, GriffinStyle, MessageWindow, PointDefs, ViewerTools
EXPORTS GriffinText
~ BEGIN OPEN GriffinText;
ROPE: TYPE = Rope.ROPE;
X: NAT = PointDefs.X;
Y: NAT = PointDefs.Y;
InternalFont: TYPE = GriffinStyle.InternalFont;
ScrPt: TYPE = PointDefs.ScrPt;
StyleHandle: TYPE = StyleDefs.StyleHandle;
iFont: InternalFont _ NEW[GriffinFontDefs.FontDescriptor _ [
name: "Helvetica",
rotation: GriffinFontDefs.Rot0Degrees,
face: GriffinFontDefs.Regular,
points: 18]];
currentFont: StyleDefs.Font _ GriffinStyle.FontFromInternalFont[iFont];
GetFileName: PUBLIC PROC[wDir: ROPE] RETURNS[ROPE] = {
name: ROPE _ ViewerTools.GetSelectionContents[];
fullFName: ROPE; cp: FS.ComponentPositions;
IF name=NIL THEN SIGNAL GriffinDefs.UserMessage["Please select a name"];
[fullFName: fullFName, cp: cp] _ FS.ExpandName[name, wDir ! FS.Error => {
MessageWindow.Append[error.explanation, TRUE];
GOTO Fail};];
IF cp.ext.length=0 THEN fullFName _ Rope.Cat[fullFName, ".griffin"];
RETURN [fullFName];
EXITS Fail =>{
MessageWindow.Blink[];
RETURN[NIL];
};
};
GetCaption: PUBLIC PROC RETURNS[ROPE] = {
RETURN[ViewerTools.GetSelectionContents[]];
};
GetBoundingBox: PUBLIC PROC[text: ROPE, style: StyleHandle, anchor: PointDefs.ObjPt] RETURNS[tl,br: ScrPt] =  {
pt: PointDefs.ScrRealPt _ PointDefs.ObjToScrReal[anchor];
width: Vector2.VEC _ ImagerFont.RopeWidth[style.font, text];
extents:  ImagerFont.Extents _ ImagerFont.FontBoundingBox[style.font];
token: REAL _ ObjectDefs.tokenSize;	--select token space
tl[X] _ SELECT style.anchor FROM
left => Real.RoundI[pt[X]-token],
center => Real.RoundI[pt[X]-width.x/2.0],
right => Real.RoundI[pt[X]-width.x],
ENDCASE => ERROR;
tl[Y] _ Real.RoundI[pt[Y]+token];
br[X] _ SELECT style.anchor FROM
left => Real.RoundI[pt[X]+width.x],
center => Real.RoundI[pt[X]+width.x/2.0],
right => Real.RoundI[pt[X]+token],
ENDCASE => ERROR;
br[Y] _ Real.RoundI[pt[Y]-(extents.ascent+extents.descent)]-1;
RETURN[tl, br];
};
EditCaption: PUBLIC PROC[caption: ROPE] = {};

GetFont: PUBLIC PROC RETURNS[StyleDefs.Font] = {RETURN[currentFont]};
SetFont: PUBLIC PROC [font: StyleDefs.Font] = {currentFont _ font};

END.

���GriffinTextImpl.mesa
Copyright c 1985 by Xerox Corporation.  All rights reserved.
Written by:  Maureen Stone, September 20, 1985 1:20:58 pm PDT

Called from Save, Restore and Press.  Return a full file path name without an extension
Called by FileOps
Called by Caption (DrawOps)
Hand the selected caption to the editing routine.  Called by Modify (DrawOps)
--currently unused
called when?  need to update current style when appropriate.
Called by SetCurrentStyle (GriffinStyleImpl)

�Êo��˜�codešœÏkœ™Kšœ
Ïmœ1™<Kšœ=™=K™�—š	˜	Kšœœ)˜1Kšœœ˜ K˜Kšœœ(˜=Kšœ
œ&˜8Kšœœ'˜7Kšœœ˜$Kšœ
œ˜$Kšœœ
˜Kšœ
˜
Kšœœ
˜Kšœœœ˜Kšœœœ˜Kšœœ˜)K˜�K˜�—K˜�KšÏlœœ˜Kšœ]˜dKšœ˜šœœœ
˜Kšœœœ˜Kšœœ˜Kšœœ˜Jšœœ˜/Kšœœ˜Kšœ
œ˜*šœœ#˜<Kšœ˜Kšœ&˜&Kšœ˜K˜
—K˜Gš
Ïnœœœœœ˜6Kšœœ&˜0Kšœœœ˜+Jšœœœœ1˜Hšœ!œœ˜IKšœ(œ˜.Kšœ	˜
—Kšœœ-˜DKšœ
˜šœ	˜Kšœ˜Kšœœ˜K˜—Kšœ˜—K™WK™š 
œœœœ˜)Kšœ%˜+Kšœ˜—š
 œœœœ/œ˜oKšœ9˜9Kšœœ*˜<K˜FKšœœÏc˜8šœœ˜ Kšœ!˜!Kšœ)˜)Kšœ$˜$Kšœœ˜—Kšœ!˜!šœœ˜ Kšœ#˜#Kšœ)˜)Kšœ"˜"Kšœœ˜—Kšœ>˜>Kšœ	˜K˜—K™Kš œœ
œ˜-K™MK™K˜�Kš œœœœ˜EK™<Kš œœ/˜CK™,K™�—K˜�Kšœ˜J˜�—�…—����
Š��ã��