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

  1. Syntax10.Scn.Fnt
  2. Syntax10i.Scn.Fnt
  3. StampElems
  4. Alloc
  5. 3 Feb 95
  6. Syntax10b.Scn.Fnt
  7. ParcElems
  8. Alloc
  9. MODULE DialogIntegerSliders;
  10.     (** Markus Knasm
  11. ller 31 Aug 94 - 
  12.     (* now DialogIntSliders -- 3 Feb 94 because modulename > 20 *)
  13.     IMPORT DialogFrames, Dialogs, DialogSliders, DialogTexts, Display, Fonts, GraphicUtils, In, Oberon, TextFrames, Texts, Viewers;
  14.     CONST backCol = DialogSliders.backCol; patternCol = backCol; W* = 70; H* = 20; MM = 1; ML = 0; MR =2;
  15.     TYPE
  16.         Item* = POINTER TO ItemDesc;
  17.         ItemDesc* = RECORD (DialogSliders.ItemDesc)
  18.             maxValue*: INTEGER (* highest possible value of sliderdY *)
  19.         END;
  20.         minusArrow*, plusArrow*: Display.Pattern;
  21.         minusArrowImage, plusArrowImage: ARRAY 10 OF SET;
  22.         fnt: Fonts.Font;
  23.     PROCEDURE Max (x, y: INTEGER): INTEGER;
  24.     BEGIN IF x > y THEN RETURN x ELSE RETURN y END
  25.     END Max;
  26.     PROCEDURE Min (x, y: INTEGER): INTEGER;
  27.     BEGIN IF x < y THEN RETURN x ELSE RETURN y END
  28.     END Min;
  29.     PROCEDURE (s: Item) Init*;
  30.     (** initialies the object, should be called after allocating the object with NEW *)
  31.     BEGIN s.Init^; s.maxValue := MAX (INTEGER)
  32.     END Init;
  33.     PROCEDURE (s: Item) Copy* (VAR dup: Dialogs.Object);
  34.     (** allocates dup and makes a deep copy of o. Before calling this methode dup should be equal NIL *)
  35.         VAR x: Item; 
  36.     BEGIN IF dup = NIL THEN NEW (x); dup := x ELSE x := dup(Item) END; s.Copy^ (dup); 
  37.     END Copy;
  38.     PROCEDURE (s: Item) MaxValue* (): INTEGER;
  39.     (** returns the highest possible value of sliderdY *)
  40.     BEGIN RETURN s.maxValue
  41.     END MaxValue;
  42.     PROCEDURE IntToChar (x0: INTEGER; VAR a: ARRAY OF CHAR);
  43.         VAR i, j: INTEGER; b: ARRAY 11 OF CHAR;
  44.     BEGIN 
  45.         i := 0; x0 := Max (0, x0);
  46.         REPEAT
  47.             b[i] := CHR(x0 MOD 10 + 30H); x0 := x0 DIV 10; INC(i)
  48.         UNTIL x0 = 0;
  49.         FOR j := 0 TO i - 1 DO
  50.             a[j] := b[i -1 - j]
  51.         END;
  52.         a[i] := 0X
  53.     END IntToChar;
  54.     PROCEDURE (s: Item) Arrow* (down: BOOLEAN): Display.Pattern;
  55.     BEGIN
  56.         IF down THEN RETURN (minusArrow) ELSE RETURN (plusArrow) END
  57.     END Arrow;
  58.     PROCEDURE (s: Item) DrawSlider* (f: Display.Frame; pressed : BOOLEAN; x, y, w, h, mode : INTEGER);
  59.     (** displays the slider of the item at (x, y) in frame f *)
  60.         VAR dummy: INTEGER; arr: ARRAY 11 OF CHAR; bgPat: Display.Pattern;
  61.     BEGIN
  62.         Display.ReplConstC (f, backCol, x, y , w, h, Display.replace); IntToChar (s.sliderdY, arr); 
  63.         IF h > w THEN bgPat := DialogSliders.vBgPat ELSE bgPat := DialogSliders.hBgPat END;
  64.         Display.ReplPatternC (f, patternCol, bgPat, x, y, w, h, 0, 0, mode);
  65.         y := y + (h DIV 2) - (fnt.maxY DIV 2);
  66.         GraphicUtils.DrawString (f, arr, x, y, w, fnt, mode, GraphicUtils.center, dummy) 
  67.     END DrawSlider;
  68.     PROCEDURE (s: Item) MoveSlider* (f: Display.Frame; pressed: BOOLEAN; dY: INTEGER);
  69.     (** changes the displayed value to dY *)
  70.         VAR dummy, x, y, w, h: INTEGER; arr: ARRAY 11 OF CHAR; bgPat: Display.Pattern;
  71.     BEGIN
  72.         s.GetDim (x, y, w, h); x := x + f.X; y := y + f.Y + f.H;
  73.         IF w > h THEN x := x + h; w := w - 2 * h ELSE y := y + w; h := h - 2 * w END;
  74.         Display.ReplConstC (f, backCol, x, y , w, h, Display.replace); IntToChar (dY, arr); 
  75.         IF h > w THEN bgPat := DialogSliders.vBgPat ELSE bgPat := DialogSliders.hBgPat END;
  76.         Display.ReplPatternC (f, patternCol, bgPat, x, y, w, h, 0, 0, Display.paint);
  77.         y := y + (h DIV 2) - (fnt.maxY DIV 2);
  78.         GraphicUtils.DrawString (f, arr, x, y, w, fnt, Display.paint, GraphicUtils.center, dummy) 
  79.     END MoveSlider;
  80.     PROCEDURE (s: Item) PrintSlider* (x, y, w, h: INTEGER);
  81.     (** prints the slider of the item at printer coordinates (x, y) *)
  82.         VAR dummy: INTEGER; arr: ARRAY 11 OF CHAR;
  83.     BEGIN
  84.         GraphicUtils.PrintBox (x, y, w,h); IntToChar (s.sliderdY, arr); 
  85.         y := y + (h DIV 2) - (SHORT (fnt.maxY * Dialogs.dUnit DIV Dialogs.pUnit) DIV 2);
  86.         GraphicUtils.PrintString (arr, x, y, w, fnt, GraphicUtils.center, dummy) 
  87.     END PrintSlider;
  88.     PROCEDURE (s: Item) CheckdY* (VAR dY: INTEGER);
  89.     (** checks whether dY is a possible value for sliderdY *)
  90.     BEGIN dY := Max (0, dY)
  91.     END CheckdY;
  92.     PROCEDURE (s: Item) TrackScrollBar* (f: Display.Frame; mx, my : INTEGER; keys : SET);
  93.     (** handles mouse events concerning the full scrollbar *)    
  94.         VAR x, y, w, h : INTEGER; t1: Texts.Text; olddY: INTEGER;
  95.     BEGIN
  96.         s.GetDim (x, y, w, h); x := x + f.X; y := y + f.Y + f.H; olddY:= s.sliderdY;
  97.         IF ((keys = {MM}) OR (keys = {ML}) OR (keys = {MR})) & (Max (w, h) >= 2 * Min (w, h)) THEN    
  98.             Oberon.RemoveMarks (x, y, w, h);
  99.             IF w > h THEN
  100.                 IF mx < x + h THEN s.TrackButton (f, x, y, h, mx, my, keys, TRUE)
  101.                 ELSIF mx >= x + w - h THEN s.TrackButton (f, x + w - h, y, h, mx, my, keys, FALSE)
  102.                 END 
  103.             ELSE
  104.                 IF my < y + w THEN s.TrackButton (f, x, y, w, mx, my, keys, TRUE)
  105.                 ELSIF my >= y + h - w THEN s.TrackButton (f, x, y + h - w, w, mx, my, keys, FALSE)
  106.                 END
  107.             END;
  108.             IF ((keys = {MM}) OR (keys = {ML}) OR (keys = {MR})) & (s.cmd[0] # 0X) & (olddY # s.sliderdY) THEN
  109.                 DialogTexts.GetParText (s.par, s.panel, t1);
  110.                 s.CallCmd (f, Viewers.This (x,y), t1)
  111.             END
  112.         END
  113.     END TrackScrollBar;
  114.     PROCEDURE Insert*;
  115.     (** Insert ([name] [x y w h] | ^ ) inserts a integerslider - item in the panel containing the caret position *)
  116.         VAR x, y, x1, y1, w, h: INTEGER; p : Dialogs.Panel; s: Item; name: ARRAY 64 OF CHAR;
  117.     BEGIN
  118.         NEW (s); 
  119.         DialogFrames.GetCaretPosition (p, x, y);
  120.         IF (p # NIL) THEN
  121.             s.Init; In.Open; In.Name (name);
  122.             IF ~In.Done THEN COPY ("", name); In.Open END;
  123.             s.SetName (name); 
  124.             In.Int (x1); In.Int (y1); In.Int (w); In.Int (h);
  125.             IF ~In.Done THEN x1 := x; y1 := y; w := W; h := H 
  126.             ELSE
  127.                 IF w < 0 THEN w := W END;
  128.                 IF h < 0 THEN h := H END
  129.             END;
  130.             s.SetDim (x1, y1, w, h, FALSE); p.Insert (s, FALSE)
  131.         ELSE
  132.             Dialogs.res := Dialogs.noPanelSelected
  133.         END;
  134.         IF Dialogs.res # 0 THEN Dialogs.Error ("DialogIntegerSliders") END;
  135.     END Insert;
  136. BEGIN
  137.     minusArrowImage[0] := {};    plusArrowImage[0] := {};
  138.     minusArrowImage[1] := {};    plusArrowImage[1] := {3..5};
  139.     minusArrowImage[2] := {};    plusArrowImage[2] := {3..5};
  140.     minusArrowImage[3] := {};    plusArrowImage[3] := {3..5};
  141.     minusArrowImage[4] := {0..8};    plusArrowImage[4] := {0..8};
  142.     minusArrowImage[5] := {0..8};    plusArrowImage[5] := {0..8};
  143.     minusArrowImage[6] := {0..8};    plusArrowImage[6] := {0..8};
  144.     minusArrowImage[7] := {};    plusArrowImage[7] := {3..5};
  145.     minusArrowImage[8] := {};    plusArrowImage[8] := {3..5};
  146.     minusArrowImage[9] := {};    plusArrowImage[9] := {3..5};
  147.     minusArrow := Display.NewPattern (minusArrowImage, 9, 9);
  148.     plusArrow := Display.NewPattern (plusArrowImage, 9, 9);
  149.     fnt := Fonts.This ("Syntax10.Scn.Fnt")
  150. END DialogIntegerSliders.
  151.