home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / jËzyki_programowania / oberon / system / statusviewer.mod (.txt) < prev    next >
Oberon Text  |  1977-12-31  |  4KB  |  116 lines

  1. Syntax10.Scn.Fnt
  2. Syntax10i.Scn.Fnt
  3. Syntax10b.Scn.Fnt
  4. MODULE StatusViewer;    (* MH Dec 93 / Jun 94 *)
  5. IMPORT
  6.     Input, Display, Fonts, Files, Texts, TextFrames, Viewers,  MenuViewers, Oberon;
  7.     Time = RECORD
  8.         sec, min, hour, day, month, year: SHORTINT;
  9.         timeStamp, dateStamp: LONGINT
  10.     END;
  11.     ClockUpdateMsg = RECORD (Display.FrameMsg)
  12.         t: Time;
  13.     END;
  14.     Months: ARRAY 12*3+1 OF CHAR;
  15.     CurDir: ARRAY 256 OF CHAR;
  16.     W: Texts.Writer;
  17.     T: Texts.Text;
  18.     Task: Oberon.Task;
  19.     CurTime: Time; (* time currently displayed in status viewers *)
  20. PROCEDURE GetTime (VAR t: Time);
  21. BEGIN
  22.     Oberon.GetClock(t.timeStamp, t.dateStamp);
  23.     t.sec := SHORT(SHORT( t.timeStamp MOD 40H ));
  24.     t.min := SHORT(SHORT( (t.timeStamp DIV 40H) MOD 40H ));
  25.     t.hour := SHORT(SHORT( (t.timeStamp DIV 1000H) MOD 40H ));
  26.     t.day := SHORT(SHORT( t.dateStamp MOD 20H ));
  27.     t.month := SHORT(SHORT( (t.dateStamp DIV 20H) MOD 10H ));
  28.     t.year := SHORT(SHORT( (t.dateStamp DIV 200H) MOD 100 ));
  29. END GetTime;
  30. PROCEDURE GenLabel (VAR t: Time; VAR label: ARRAY OF CHAR);
  31.     VAR m, i: INTEGER;
  32.     PROCEDURE Ch (ch: CHAR);
  33.     BEGIN label[i] := ch; INC(i)
  34.     END Ch;
  35.     PROCEDURE Int (n: SHORTINT; lead: BOOLEAN);
  36.     BEGIN IF lead OR (n DIV 10 > 0) THEN Ch(CHR(48 + (n DIV 10) MOD 10)) END;
  37.         Ch(CHR(48 + n MOD 10))
  38.     END Int;
  39. BEGIN i := 0;
  40.     WHILE label[i] # 0X DO INC(i) END;
  41.     IF label[0] # 0X THEN Ch(" "); Ch(" ") END;
  42.     Int(t.day, FALSE);
  43.     m := t.month - 1;
  44.     Ch(" "); Ch(Months[m * 3]); Ch(Months[m * 3 + 1]); Ch(Months[m * 3 + 2]); Ch(" ");
  45.     Int(t.year, TRUE); 
  46.     Ch(" "); Ch(" "); Ch(" ");
  47.     Int(t.hour, TRUE); Ch(":"); Int(t.min, TRUE); Ch(":"); Int(t.sec, TRUE); Ch(0X)
  48. END GenLabel;
  49. PROCEDURE StrWidth (s: ARRAY OF CHAR): INTEGER;
  50.     VAR i, x, y, w, h, dx, width: INTEGER; pat: LONGINT;
  51. BEGIN i := 0; width := 0;
  52.     WHILE s[i] # 0X DO
  53.         Display.GetChar(Fonts.Default.raster, s[i], dx, x, y, w, h, pat);
  54.         INC(width, dx); INC(i);
  55.     END;
  56.     RETURN width;
  57. END StrWidth;
  58. PROCEDURE DispStr (X, Y, col: INTEGER; s: ARRAY OF CHAR);
  59.     VAR i, x, y, w, h, dx, width: INTEGER; pat: LONGINT;
  60. BEGIN i := 0;
  61.     WHILE s[i] # 0X DO
  62.         Display.GetChar(Fonts.Default.raster, s[i], dx, x, y, w, h, pat);
  63.         Display.CopyPattern(col, pat, X+x, Y+y, Display.paint);
  64.         INC(X, dx); INC(i);
  65. END DispStr;
  66. PROCEDURE UpdateClock (F: TextFrames.Frame; VAR t: Time);
  67.     VAR s: ARRAY 32 OF CHAR; w, x, y: INTEGER;
  68. BEGIN
  69.     GenLabel(t, s); w := StrWidth(s);
  70.     x := F.X + F.W - 7 - w; y := F.Y + 1 + (-Fonts.Default.minY);
  71.     Oberon.RemoveMarks(x, F.Y, w, Fonts.Default.height);
  72.     Display.ReplConst(F.col, x, F.Y, w, Fonts.Default.height, Display.replace);
  73.     DispStr(x, y, Display.white-F.col, s);
  74. END UpdateClock;
  75. PROCEDURE ClockFrameHandle (F: Display.Frame; VAR M: Display.FrameMsg);
  76. BEGIN
  77.     IF M IS ClockUpdateMsg THEN UpdateClock(F(TextFrames.Frame), M(ClockUpdateMsg).t)
  78.     ELSIF M IS MenuViewers.ModifyMsg THEN TextFrames.Handle(F, M);
  79.         IF F.H > Fonts.Default.height THEN UpdateClock(F(TextFrames.Frame), CurTime) END;
  80.     ELSIF M IS TextFrames.UpdateMsg THEN TextFrames.Handle(F, M);
  81.         IF M(TextFrames.UpdateMsg).text = F(TextFrames.Frame).text THEN
  82.             IF F.H > Fonts.Default.height THEN UpdateClock(F(TextFrames.Frame), CurTime) END
  83.         END
  84.     ELSE TextFrames.Handle(F, M);
  85.     END;
  86. END ClockFrameHandle;
  87. PROCEDURE Open*;
  88.     VAR V: MenuViewers.Viewer; Menu, Main: TextFrames.Frame; text: Texts.Text; x, y: INTEGER;
  89. BEGIN
  90.     Menu := TextFrames.NewMenu("", ""); Menu.text := T; Menu.handle := ClockFrameHandle;
  91.     text := TextFrames.Text("");
  92.     Main := TextFrames.NewText(text, 0);
  93.     Oberon.AllocateSystemViewer(Oberon.Mouse.X, x, y);
  94.     V := MenuViewers.New(Menu, Main, TextFrames.menuH, x, y);
  95. END Open;
  96. PROCEDURE Update;
  97.     VAR cu: ClockUpdateMsg;
  98. BEGIN
  99.     IF CurDir # Files.CurrentDir THEN
  100.         COPY(Files.CurrentDir, CurDir);
  101.         Texts.WriteString(W, CurDir); Texts.Delete(T, 0, T.len); Texts.Append(T, W.buf);
  102.     END;
  103.     GetTime(cu.t);
  104.     IF (CurTime.hour # cu.t.hour) OR (CurTime.min # cu.t.min) OR (CurTime.sec # cu.t.sec) THEN
  105.         Viewers.Broadcast(cu); CurTime := cu.t
  106.     END;
  107.     Oberon.CurTask.time := Oberon.Time() + 1*Input.TimeUnit;
  108. END Update;
  109. BEGIN
  110.     Months := "JanFebMarAprMayJunJulAugSepOctNovDec"; GetTime(CurTime);
  111.     Texts.OpenWriter(W); T := TextFrames.Text("");
  112.     NEW(Task); Task.safe := FALSE; Task.time := 0; Task.handle := Update;
  113.     Oberon.Install(Task);
  114. END StatusViewer.
  115. StatusViewer.Open
  116.