DIRECTORY Args, Commander, Containers, FS, Icons, Process, Real, Rope, ViewerClasses, ViewerOps; IconAnimateCmdImpl: CEDAR PROGRAM IMPORTS Args, Commander, Containers, FS, Icons, Process, Real, ViewerOps ~ BEGIN Data: TYPE ~ RECORD [ v: ViewerClasses.Viewer, icons: ARRAY [0..100) OF Icons.IconFlavor, -- the icons pause: INT ฌ 2000, -- milliSeconds to pause after a cycle delay: NAT ฌ 100, -- milliSeconds delay between each icon first: NAT ฌ 0, -- first icon last: NAT ฌ 0, -- last icon bounce: BOOL ฌ FALSE, -- forwards/backwards? forward: BOOL ฌ TRUE -- current direction ]; IconAnimateCmd: Commander.CommandProc ~ { iconsA, bounceA, pauseA, delayA, frameA, firstA, lastA: Args.Arg; [iconsA, pauseA, delayA, bounceA, frameA, firstA, lastA] ฌ Args.ArgsGet[cmd, "%s-pause%r-speed%r-bounce%b-frame%i-first%i-last%i" ! Args.Error => {msg ฌ reason; CONTINUE}]; IF msg # NIL THEN RETURN[$Failure, msg] ELSE TRUSTED { d: REF Data ฌ NEW[Data]; FOR i: NAT IN [0..100) DO d.icons[i] ฌ Icons.NewIconFromFile[iconsA.rope, i ! FS.Error => GOTO Bad]; IF d.icons[i] = LOOPHOLE[177777B] THEN EXIT; d.last ฌ i+1; ENDLOOP; IF pauseA.ok THEN d.pause ฌ Real.Round[1000.0*pauseA.real]; IF firstA.ok THEN d.first ฌ firstA.int; IF lastA.ok THEN d.last ฌ MIN[lastA.int, d.last]; IF bounceA.ok THEN d.bounce ฌ bounceA.bool; IF delayA.ok AND delayA.real # 0.0 THEN d.delay ฌ Real.Round[100/delayA.real]; d.v ฌ Containers.Create[info: [name: "Icon View", iconic: TRUE]]; IF frameA.ok THEN Paint[d, frameA.int] ELSE TRUSTED {Process.Detach[FORK CycleIcon[d]]}; }; EXITS Bad => RETURN[$Failure, "Can't find the icon file"]; }; Paint: PROC [d: REF Data, i: INT] ~ { d.v.icon ฌ d.icons[i]; ViewerOps.PaintViewer[d.v, all]; Process.Pause[Process.MsecToTicks[d.delay]]; }; CycleIcon: PROC [d: REF Data] ~ { d.v.icon ฌ d.icons[0]; WHILE NOT d.v.destroyed DO IF d.forward THEN FOR i: INT IN [d.first..d.last) DO IF d.v.iconic THEN Paint[d, i]; ENDLOOP ELSE FOR i:INT DECREASING IN [d.first..d.last) DO IF d.v.iconic THEN Paint[d,i]; ENDLOOP; IF d.bounce THEN d.forward ฌ NOT d.forward; Process.Pause[Process.MsecToTicks[d.pause]]; ENDLOOP; }; usage: Rope.ROPE ฌ " Usage: IconAnimate [-option] Options include: -pause (default: 2) -speed (default: 1) -first (default: 0) -last (default: last) -bounce (forward-backward-forward-etc.)"; ViewerOps.RegisterViewerClass[$IconAnimate, NEW[ViewerClasses.ViewerClassRec ฌ []]]; Commander.Register["IconAnimate", IconAnimateCmd, usage]; END. ฤ IconAnimateCmdImpl.mesa Copyright ำ 1988, 1991, 1992 by Xerox Corporation. All rights reserved. Bloomenthal, September 24, 1989 11:41:17 am PDT Kenneth A. Pier, May 24, 1991 5:37 pm PDT สh•NewlineDelimiter –(cedarcode) style™šœ™Jšœ ฯeœ=™HJšœ/™/J™)—code˜šฯk œW˜`K˜——šะlnœžœž˜!šžœA˜HK˜——šœž˜K˜šœžœžœ˜Kšœ˜Kšœ žœ žœฯc ˜9Kšœ žœ &˜BKšœ žœ '˜BKšœ žœ  ˜'Kšœ žœ  ˜&Kšœ žœžœ ˜3Kšœ žœžœ ˜0Kšœ˜K˜—šะbnœ˜)K˜A˜:˜FKšœžœ˜*——šžœž˜ Kšžœžœ˜šžœžœ˜Kšœžœžœ˜šžœžœžœ ž˜Kšœ4žœ žœ˜JKšžœ ž œ žœžœ˜,K˜ Kšžœ˜—Kšžœ žœ*˜;Kšžœ žœ˜'Kšžœ žœ žœ˜1Kšžœ žœ˜+Kšžœ žœžœ'˜NKšœ:žœ˜Ašžœ ˜ Kšžœ˜Kšžœžœžœ˜1—K˜——Kšžœžœ'˜:K˜K˜—šฯnœžœžœ žœ˜%K˜Kšœ ˜ Kšœ,˜,K˜K˜—šข œžœžœ ˜!K˜šžœžœž˜šžœ ˜ Kšžœžœžœžœžœžœ žœž˜OKšžฯsžฃœžฃž ฃžฃœฃžฃžฃœ ฃžฃœ ฃž˜Y—Kšžœ žœ žœ ˜+Kšœ,˜,Kšžœ˜—K˜K˜—šœ žœา˜โK˜—šœ,žœ%˜TK˜—Kšœ9˜9J™—Kšžœ˜K˜—…— |จ