DIRECTORY ImagerSample, List, PropList, SF, SlatePrivateTypes, Slate, XlBitmap; SlatePagesImpl: CEDAR MONITOR IMPORTS ImagerSample, List, PropList, SlatePrivateTypes, Slate, XlBitmap EXPORTS Slate, SlatePrivateTypes ~ BEGIN OPEN Slate; SessionPrivateRec: PUBLIC TYPE = SlatePrivateTypes.SessionPrivateRec; InstancePrivateRec: PUBLIC TYPE = SlatePrivateTypes.InstancePrivateRec; AnyPage: PROC [session: Session] RETURNS [page: Page ¬ NIL] = { sessionPrivate: REF SessionPrivateRec ¬ session.private; list: List.LORA ¬ sessionPrivate.pageList; IF list#NIL THEN RETURN [NARROW[list.first]]; }; CurrentListOfPages: PUBLIC PROC [sesion: Session] RETURNS [list: LIST OF Page ¬ NIL] = { tail: LIST OF Page ¬ NIL; Each: PageProc = { l: LIST OF Page ¬ LIST[page]; IF tail=NIL THEN list ¬ l ELSE tail.rest ¬ l; tail ¬ l }; [] ¬ EnumeratePages[sesion, Each] }; EnumeratePages: PUBLIC PROC [session: Session, eachPage: PageProc, clientData: REF ¬ NIL] RETURNS [quit: BOOL ¬ FALSE] = { Each: PROC [p: REF ANY] RETURNS [quit: BOOL] = { quit ¬ eachPage[page: NARROW[p, Page], clientData: clientData].quit }; sessionPrivate: REF SessionPrivateRec ¬ session.private; list: List.LORA ¬ sessionPrivate.pageList; WHILE list # NIL DO IF Each[list.first].quit THEN RETURN; list ¬ list.rest; ENDLOOP; }; defaultPageSize: PUBLIC <> SF.Vec ¬ [s: 480, f: 640]; NewPage: PUBLIC PROC [session: Session, sz: SF.Vec ¬ [0, 0], initial: ImagerSample.RasterSampleMap, properties: PropList.List ¬ NIL, bpp: INT ¬ 0] RETURNS [page: Page] = { bm: XlBitmap.Bitmap; contents: ImagerSample.SampleMap; IF sz.f<=0 OR sz.s<=0 THEN sz ¬ SlatePrivateTypes.defaultPageSize; IF bpp<=0 THEN bpp ¬ 1; bm ¬ XlBitmap.Create[sz, bpp]; contents ¬ XlBitmap.GetSM[bm]; ImagerSample.Clear[contents]; IF initial#NIL THEN ImagerSample.Transfer[dst: contents, src: initial]; page ¬ NEW[PageRec ¬ [ session: session, activeArea: bm, properties: PropList.NewCopy[properties] ]]; CallGlobalEvent[instance: NIL, session: NIL, event: $NewPage, callData: page]; IF session#NIL THEN { sessionPrivate: REF SessionPrivateRec ¬ session.private; Monitored: ENTRY PROC [] = { sessionPrivate.pageList ¬ List.Append[sessionPrivate.pageList, LIST[page]]; }; IF sessionPrivate=NIL THEN ERROR; Monitored[]; CallGlobalEvent[instance: NIL, session: session, event: $AddPage0, callData: page]; CallGlobalForAllInstancesOfSession[session: session, event: $AddPage, callData: page]; }; }; RemovePage: PUBLIC PROC [page: Page] = { session: Session ¬ page.session; IF session#NIL THEN { sessionPrivate: REF SessionPrivateRec ¬ session.private; oldActivePage: Page ¬ ActivePage[session]; Monitored: ENTRY PROC [] = INLINE { page.session ¬ NIL; sessionPrivate.pageList ¬ List.Remove[page, sessionPrivate.pageList]; IF session.activePage=page THEN session.activePage ¬ NIL; }; IF sessionPrivate=NIL THEN ERROR; Monitored[]; CallGlobalEvent[instance: NIL, session: session, event: $RemovePage0, callData: page]; CallGlobalForAllInstancesOfSession[session: session, event: $RemovePage, callData: page]; IF oldActivePage=page AND session.activePage=NIL THEN { page: Page ¬ AnyPage[session]; IF page#NIL THEN ActivatePage[page]; }; }; CallGlobalEvent[instance: NIL, session: NIL, event: $DestroyPage, callData: page]; }; ActivePage: PUBLIC PROC [session: Session] RETURNS [page: Page] = { RETURN [session.activePage] }; ActivatePage: PUBLIC PROC [page: Page] = { session: Session ~ page.session; IF session=NIL THEN ERROR; IF page#ActivePage[session] THEN { oldActivePage: Page ¬ NIL; Monitored: ENTRY PROC [] = INLINE { --yep, we are protecting the structure, not the pixels oldActivePage ¬ session.activePage; session.activePage ¬ page; }; Monitored[]; CallGlobalEvent[instance: NIL, session: session, event: $DeActivatePage0, callData: oldActivePage]; CallGlobalForAllInstancesOfSession[session: session, event: $DeActivatePage, callData: oldActivePage]; CallGlobalEvent[instance: NIL, session: session, event: $ActivatePage0, callData: page]; CallGlobalForAllInstancesOfSession[session: session, event: $ActivatePage, callData: page]; }; }; END. Ό SlatePagesImpl.mesa Copyright Σ 1992, 1993 by Xerox Corporation. All rights reserved. Christian Jacobi, December 28, 1992 3:17 pm PST Christian Jacobi, March 6, 1993 4:21 pm PST Κ­•NewlineDelimiter ™™J™BJ™/J™+J™—codešΟk ˜ K˜ K˜K˜ K˜K˜K˜K˜ —J˜šΟnœœ˜JšœA˜HJšœ˜"—Kšœœ˜K˜Kšœœœ'˜EKšœœœ(˜GK˜šžœœœœ˜?Kšœœ%˜8Kšœ œ˜*Kš œœœœœ˜-K˜K˜—šžœœœœœœœ˜XKšœœœœ˜šžœ˜Kšœœœœ˜Kšœœœ œ˜-K˜K˜—K˜!K˜K˜—šžœœœ4œœœœœ˜zš žœœœœœœ˜0Kšœœ'˜CK˜—Kšœœ%˜8Kšœ œ˜*šœœœ˜Kšœœœ˜&K˜Kšœ˜—K˜—K˜Kšœœœ˜HK˜šžœœœœRœœœ˜«K˜6Kšœ œ œ)˜CKšœœ ˜K˜K˜K˜Kšœ œœ4˜Gšœœ ˜K˜K˜K˜(K˜—Kšœœ œ#˜Nšœ œœ˜Kšœœ%˜8šž œœœ˜Kšœ?œ˜KK˜—Kšœœœœ˜!K˜ Kšœœ6˜SK˜VK˜—K˜—K˜šž œœœ˜(K˜ šœ œœ˜Kšœœ%˜8K˜*šž œœœœ˜#Kšœœ˜K˜EKšœœœ˜9K˜—Kšœœœœ˜!K˜ Kšœœ9˜VK˜Yšœœœœ˜7K˜Kšœœœ˜$K˜—K˜—Kšœœ œ'˜RK˜K˜—šž œ œœ˜CKšœ˜K˜K™—šž œœœ˜*K˜ Kšœ œœœ˜šœœ˜"Kšœœ˜š ž œœœœΟc6˜ZK˜#K˜K˜—K˜ KšœœF˜cK˜fKšœœ;˜XK˜[K˜—K˜K˜—Kšœ˜K˜K˜—…—k