home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9302 / tvision / tvpas / xdialogs.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-11-10  |  26.7 KB  |  1,099 lines

  1. (* ------------------------------------------------------ *)
  2. (*                     XDIALOGS.PAS                       *)
  3. (*                                                        *)
  4. (*          Spezielle Dialog- und View-Objekte            *)
  5. (*        (C) 1992 by Christian Ohr & DMV-Verlag          *)
  6. (* ------------------------------------------------------ *)
  7. {$R-,S-,I-,B-,D-,L-,V-,A+,F+,O+,X+}
  8.  
  9. UNIT XDialogs;
  10.  
  11.  
  12. INTERFACE
  13.  
  14.  
  15. USES Objects, Views, Drivers, Dialogs, App, XViews;
  16.  
  17.  
  18. CONST
  19.   cmProgress   = 120;
  20.   cmWindowList = 121;
  21.  
  22.   OutOfRange = MaxInt XOR -1;
  23.  
  24. TYPE
  25.  
  26.   (* tBarView stellt einen Balken auf dem Bildschirm dar  *)
  27.   (* dessen Länge vom Wert in Percentage abhängig ist.    *)
  28.   (* Dieser Wert wird über eine Nachricht, deren InfoPtr  *)
  29.   (* auf eine REAL-Variable zeigt, übermittelt. Gültige   *)
  30.   (* Werte: 0 <= x <= 100.                                *)
  31.  
  32.   pBarView = ^tBarView;
  33.   tBarView = OBJECT(tView)
  34.     Percentage: REAL;
  35.     toDoChar, DoneChar: CHAR;
  36.     CloseOwner: BOOLEAN;
  37.     CONSTRUCTOR Init (VAR Bounds: tRect);
  38.     CONSTRUCTOR Load (VAR S: tStream);
  39.     PROCEDURE Draw; VIRTUAL;
  40.     FUNCTION GetPalette: pPalette; VIRTUAL;
  41.     PROCEDURE HandleEvent (VAR Event: tEvent); VIRTUAL;
  42.     PROCEDURE Store (VAR S: tStream); VIRTUAL;
  43.   END;
  44.  
  45.  
  46.   (* tMonolog ist e. Dialog,d. nur per Dispose(..., Done) *)
  47.   (* wieder verschwinden kann. Er eignet sich z.B. für    *)
  48.   (* kurze Mitteilungen für den Anwender, auch in Verbin- *)
  49.   (* dung mit tBarView. Routinen zum Setzen und           *)
  50.   (* Verschwindenlassen eines einzelnen Monologs mit TEXT *)
  51.   (* finden sich weiter unten.                            *)
  52.  
  53.   pMonolog = ^tMonolog;
  54.   tMonolog = OBJECT(tDialog)
  55.     CONSTRUCTOR Init(VAR Bounds: tRect; ATitle: tTitleStr);
  56.   END;
  57.  
  58.  
  59.   (* tXLabel nimmt darauf Rücksicht, ob das ihm           *)
  60.   (* verbundene Dialogobjekt überhaupt selektierbar ist.  *)
  61.  
  62.   pXLabel = ^tXLabel;
  63.   tXLabel = OBJECT(tLabel)
  64.     PROCEDURE HandleEvent (VAR Event: tEvent); VIRTUAL;
  65.   END;
  66.  
  67.  
  68.   (* pScrollInputLine kopiert in etwa die Eigenschaften   *)
  69.   (* des tScroller-Objekts auf eine Eingabezeile. Dieses  *)
  70.   (* Objekt ist noch nicht funktionsfähig und muß erst    *)
  71.   (* noch weiterentwickelt werden (z.B. für Arrays, Kol-  *)
  72.   (* lektionen, Queues, etc.                              *)
  73.  
  74.   pScrollInputLine = ^tScrollInputLine;
  75.   tScrollInputLine = OBJECT(tInputLine)
  76.     ScrollBar: pScrollBar;
  77.     Value: INTEGER;
  78.     Limit: tPoint;
  79.     CONSTRUCTOR Init (VAR Bounds: tRect; AMaxLen: INTEGER;
  80.                       AScrollBar: pScrollBar);
  81.     CONSTRUCTOR Load (VAR S: tStream);
  82.     FUNCTION  At (AValue: INTEGER): pString; VIRTUAL;
  83.     PROCEDURE HandleEvent(VAR Event: tEvent); VIRTUAL;
  84.     FUNCTION  IndexOf (P: pString): INTEGER; VIRTUAL;
  85.     PROCEDURE ScrollDraw; VIRTUAL;
  86.     PROCEDURE ScrollTo (AValue: INTEGER);
  87.     PROCEDURE SetLimit (X, Y: INTEGER);
  88.     PROCEDURE Store (VAR S: tStream); VIRTUAL;
  89.     FUNCTION Valid (Command: WORD): BOOLEAN; VIRTUAL;
  90.   END;
  91.  
  92.  
  93.   (* tColInputLine wendet tScrollInputLine auf Kollektio- *)
  94.   (* nen an. Lediglich At, IndexOf und evt. SetData/Get-  *)
  95.   (* Data/DataSize muß noch überschrieben werden, um das  *)
  96.   (* Objekt an die Art der Kollektion anzupassen.         *)
  97.  
  98.   pColInputLine = ^tColInputLine;
  99.   tColInputLine = OBJECT(tScrollInputLine)
  100.     Col: pCollection;
  101.     CONSTRUCTOR Init(VAR Bounds: TRect; AMaxLen: INTEGER;
  102.                  AScrollBar: pScrollBar; ACol: pCollection);
  103.     CONSTRUCTOR Load (VAR S: tStream);
  104.     PROCEDURE Store (VAR S: tStream); VIRTUAL;
  105.   END;
  106.  
  107.  
  108.   (* Für eine StringCollection sind die Änderungen nur    *)
  109.   (* minimal.                                             *)
  110.  
  111.   pSColInputLine = ^tSColInputLine;
  112.   tSColInputLine = OBJECT(tColInputLine)
  113.     FUNCTION At(AValue: INTEGER): pString; VIRTUAL;
  114.     FUNCTION IndexOf (P: pString): INTEGER; VIRTUAL;
  115.   END;
  116.  
  117.  
  118.   (* Die ListBox, in der die auszuwählenden Daten stehen, *)
  119.   (* welche für die betreffende Eingabezeile gültig sind. *)
  120.  
  121.   pDropViewer = ^tDropViewer;
  122.   tDropViewer = OBJECT(tListBox)
  123.     PROCEDURE HandleEvent (VAR Event: tEvent); VIRTUAL;
  124.     FUNCTION GetPalette: pPalette; VIRTUAL;
  125.   END;
  126.  
  127.  
  128.   (* tDropWindow beherbergt den ListViewer, in dem die    *)
  129.   (* verfügbaren Daten angezeigt werden.                  *)
  130.  
  131.   pDropWindow = ^tDropWindow;
  132.   tDropWindow = OBJECT(tWindow)
  133.     Viewer: pListViewer;
  134.     CONSTRUCTOR Init (VAR Bounds: tRect;
  135.                       AList: pCollection);
  136.     FUNCTION GetPalette: pPalette; VIRTUAL;
  137.     FUNCTION GetSelection: STRING; VIRTUAL;
  138.     PROCEDURE InitViewer (AList: pCollection); VIRTUAL;
  139.   END;
  140.  
  141.  
  142.   (* tDrop ist eine Schaltfläche für Auswahlfenster in    *)
  143.   (* Verbindung mit Eingabezeilen.                        *)
  144.  
  145.   pDrop = ^tDrop;
  146.   tDrop = OBJECT(tView)
  147.     DropList: pCollection;
  148.     Link: pInputLine;
  149.     WinHeight: INTEGER;
  150.     CONSTRUCTOR Init (VAR Bounds: tRect; ALink: pInputLine;
  151.                       AHeight: INTEGER; AList: pCollection);
  152.     CONSTRUCTOR Load (VAR S: tStream);
  153.     PROCEDURE Draw; VIRTUAL;
  154.     FUNCTION GetPalette: pPalette; VIRTUAL;
  155.     PROCEDURE HandleEvent (VAR Event: tEvent); VIRTUAL;
  156.     PROCEDURE InitList (AList: pCollection); VIRTUAL;
  157.     FUNCTION InitDropWindow: pDropWindow; VIRTUAL;
  158.     PROCEDURE Store (VAR S: tStream); VIRTUAL;
  159.   END;
  160.  
  161.  
  162.   (* tWindowListBox sucht alle in den Desktop eingefügte  *)
  163.   (* Fenster und stellt deren Namen in einer Listbox dar  *)
  164.  
  165.   pWindowListBox = ^tWindowListBox;
  166.   tWindowListBox = OBJECT(tListBox)
  167.     CONSTRUCTOR Init (VAR Bounds: tRect;
  168.                       AScrollBar: pScrollBar);
  169.     DESTRUCTOR Done; VIRTUAL;
  170.     PROCEDURE CollectWindows;
  171.     FUNCTION GetText (Item: INTEGER; MaxLen: INTEGER)
  172.              : STRING; VIRTUAL;
  173.     PROCEDURE GetData (VAR Rec); VIRTUAL;
  174.     PROCEDURE HandleEvent (VAR Event: tEvent); VIRTUAL;
  175.     PROCEDURE SetData (VAR Rec); VIRTUAL;
  176.   END;
  177.  
  178.  
  179.   (* Wie tInputLine, jedoch ungültig, falls leer          *)
  180.  
  181.   pKeyInputLine = ^tKeyInputLine;
  182.   tKeyInputLine = OBJECT(tInputLine)
  183.     FUNCTION Valid(Command: WORD): BOOLEAN; VIRTUAL;
  184.   END;
  185.  
  186.  
  187.   (* Nur Longints zwischen Min und Max sind gültig        *)
  188.  
  189.   pNumInputLine = ^tNumInputLine;
  190.   tNumInputLine = OBJECT(tInputLine)
  191.     Min: LONGINT;
  192.     Max: LONGINT;
  193.     CONSTRUCTOR Init(VAR Bounds: tRect; AMaxLen: INTEGER;
  194.                      AMin, AMax: LONGINT);
  195.     CONSTRUCTOR Load(VAR S: tStream);
  196.     FUNCTION DataSize: WORD; VIRTUAL;
  197.     PROCEDURE GetData(VAR Rec); VIRTUAL;
  198.     PROCEDURE SetData(VAR Rec); VIRTUAL;
  199.     PROCEDURE Store(VAR S: tStream);
  200.     FUNCTION Valid(Command: WORD): BOOLEAN; VIRTUAL;
  201.   END;
  202.  
  203.  
  204. CONST
  205.   rScrollInputLine: tStreamRec = (
  206.     ObjType: 1200;
  207.     VmtLink: Ofs(TypeOf(tScrollInputLine)^);
  208.     Load:    @tScrollInputLine.Load;
  209.     Store:   @tScrollInputLine.Store
  210.   );
  211.   rColInputLine: tStreamRec = (
  212.     ObjType: 1201;
  213.     VmtLink: Ofs(TypeOf(tColInputLine)^);
  214.     Load:    @tColInputLine.Load;
  215.     Store:   @tColInputLine.Store
  216.   );
  217.   rSColInputLine: tStreamRec = (
  218.     ObjType: 1202;
  219.     VmtLink: Ofs(TypeOf(tSColInputLine)^);
  220.     Load:    @tSColInputLine.Load;
  221.     Store:   @tSColInputLine.Store
  222.   );
  223.   rBarView : tStreamRec = (
  224.     ObjType: 1203;
  225.     VmtLink: Ofs(TypeOf(tBarView)^);
  226.     Load:    @tBarView.Load;
  227.     Store:   @tBarView.Store
  228.   );
  229.   rMonolog : tStreamRec = (
  230.     ObjType: 1204;
  231.     VmtLink: Ofs(TypeOf(tMonolog)^);
  232.     Load:    @tMonolog.Load;
  233.     Store:   @tMonolog.Store
  234.   );
  235.   rXLabel : tStreamRec = (
  236.     ObjType: 1205;
  237.     VmtLink: Ofs(TypeOf(tXLabel)^);
  238.     Load:    @tXLabel.Load;
  239.     Store:   @tXLabel.Store
  240.   );
  241.   rWindowListBox : tStreamRec = (
  242.     ObjType: 1206;
  243.     VmtLink: Ofs(TypeOf(tWindowListBox)^);
  244.     Load:    @tWindowListBox.Load;
  245.     Store:   @tWindowListBox.Store
  246.   );
  247.   rDrop : tStreamRec = (
  248.     ObjType: 1207;
  249.     VmtLink: Ofs(TypeOf(tDrop)^);
  250.     Load:    @tDrop.Load;
  251.     Store:   @tDrop.Store
  252.   );
  253.   rKeyInputLine: tStreamRec = (
  254.      ObjType: 1208;
  255.      VmtLink: Ofs(TypeOf(tKeyInputLine)^);
  256.      Load:    @tKeyInputLine.Load;
  257.      Store:   @tKeyInputLine.Store
  258.   );
  259.   rNumInputLine: tStreamRec = (
  260.      ObjType: 1209;
  261.      VmtLink: Ofs(TypeOf(tNumInputLine)^);
  262.      Load:    @tNumInputLine.Load;
  263.      Store:   @tNumInputLine.Store
  264.   );
  265.  
  266.  
  267.  
  268. (* Routinen z. Auf- und Abhängen eines tMonolog mit einer *)
  269. (* kurzen Mitteilung. Es kann nur ein Monolog auf einmal  *)
  270. (* hängen.                                                *)
  271.  
  272. PROCEDURE PinUp (W, H: INTEGER; S: STRING; Params: POINTER);
  273. PROCEDURE PinDown;
  274.  
  275.  
  276. (* Routine für einen Dialog mit Fensterliste              *)
  277.  
  278. PROCEDURE WindowListDialog;
  279.  
  280.  
  281. FUNCTION ExecDialog(P: pDialog; Data: POINTER): WORD;
  282.  
  283. PROCEDURE RegisterXDialogs;
  284.  
  285.  
  286. IMPLEMENTATION
  287.  
  288.  
  289. USES MsgBoxG;
  290.  
  291.  
  292. CONST
  293.   Pinned: BOOLEAN = FALSE;
  294.  
  295. VAR
  296.   P: pMonolog;
  297.  
  298.  
  299. FUNCTION SSet(C : CHAR; Len : BYTE) : STRING; ASSEMBLER;
  300. ASM
  301.   LES DI, @Result
  302.   CLD
  303.   XOR CH, CH
  304.   MOV CL, Len       (* STRING-Länge in CX   *)
  305.   MOV AX, CX        (* und in AX            *)
  306.   STOSB             (* Längenbyte speichern *)
  307.   MOV AL, C
  308.   REP STOSB         (* STRING auffüllen     *)
  309. END;
  310.  
  311.  
  312.  
  313. (* -------------------------------------------------------*)
  314. (*                      tBarView                          *)
  315. (* ------------------------------------------------------ *)
  316.  
  317.  
  318. CONSTRUCTOR tBarView.Init (VAR Bounds: tRect);
  319. BEGIN
  320.   tView.Init(Bounds);
  321.   toDoChar := #177;
  322.   DoneChar := #219;
  323.   Percentage := 0.0;
  324.   Options := Options AND NOT ofSelectable;
  325.   EventMask := evBroadcast;
  326. END;
  327.  
  328.  
  329. CONSTRUCTOR tBarView.Load (VAR S: tStream);
  330. BEGIN
  331.   tView.Load(S);
  332.   S.Read(Percentage, SizeOf(REAL));
  333.   S.Read(toDoChar, SizeOf(CHAR));
  334.   S.Read(DoneChar, SizeOf(CHAR));
  335. END;
  336.  
  337.  
  338. PROCEDURE tBarView.Draw;
  339. VAR
  340.   B: tDrawBuffer;
  341.   IntPerc, BarLen: INTEGER;
  342.   PercStr: STRING[5];
  343. BEGIN
  344.   IntPerc := Round(Percentage * 100);
  345.   BarLen := Size.X - 5;
  346.   IF NOT (IntPerc > 100) THEN BEGIN
  347.     WriteStr(0, 0, SSet(DoneChar,
  348.       Round(BarLen * Percentage)) + SSet(
  349.        toDoChar, BarLen - Round(BarLen * Percentage)), 2);
  350.     Str(IntPerc:4, PercStr); PercStr := PercStr + '%';
  351.     WriteStr(BarLen, 0, PercStr, 1);
  352.   END;
  353. END;
  354.  
  355.  
  356. FUNCTION tBarView.GetPalette: pPalette;
  357. CONST
  358.   cBarView: STRING[Length(cLabel)] = cLabel;
  359. BEGIN
  360.   GetPalette := @cBarView;
  361. END;
  362.  
  363.  
  364. PROCEDURE tBarView.HandleEvent (VAR Event: tEvent);
  365. BEGIN
  366.   tView.HandleEvent(Event);
  367.   IF Event.What = evBroadcast THEN
  368.     IF Event.Command = cmProgress THEN BEGIN
  369.       Percentage := REAL(Event.InfoPtr^);
  370.       DrawView;
  371.       ClearEvent(Event);
  372.     END;
  373. END;
  374.  
  375.   
  376. PROCEDURE tBarView.Store (VAR S: tStream);
  377. BEGIN
  378.   tView.Store(S);
  379.   S.Write(Percentage, SizeOf(REAL));
  380.   S.Write(toDoChar, SizeOf(CHAR));
  381.   S.Write(DoneChar, SizeOf(CHAR));
  382. END;
  383.  
  384.  
  385.  
  386. (* ------------------------------------------------------ *)
  387. (*                      tMonolog                          *)
  388. (* ------------------------------------------------------ *)
  389.  
  390.  
  391. CONSTRUCTOR tMonolog.Init (VAR Bounds: tRect;
  392.                            ATitle: tTitleStr);
  393. BEGIN
  394.   tDialog.Init(Bounds, ATitle);
  395.   Flags := Flags AND NOT wfClose;
  396. END;
  397.  
  398.  
  399.  
  400. (* ------------------------------------------------------ *)
  401. (*                       tXLabel                          *)
  402. (* ------------------------------------------------------ *)
  403.  
  404.  
  405. PROCEDURE tXLabel.HandleEvent (VAR Event: tEvent);
  406. BEGIN
  407.   IF (Link <> NIL) AND
  408.      (Link^.Options AND ofSelectable = 0) THEN Exit;
  409.   tLabel.HandleEvent(Event);
  410. END;
  411.  
  412.  
  413. (* ------------------------------------------------------ *)
  414. (*                  tScrollInputLine                      *)
  415. (* ------------------------------------------------------ *)
  416.  
  417.  
  418.  
  419. CONSTRUCTOR tScrollInputLine.Init (VAR Bounds: tRect;
  420.              AMaxLen: INTEGER; AScrollBar: pScrollBar);
  421. BEGIN
  422.   tInputLine.Init(Bounds, AMaxLen);
  423.   ScrollBar := AScrollBar;
  424.   EventMask := EventMask OR evBroadcast;
  425. END;
  426.  
  427.  
  428. CONSTRUCTOR tScrollInputLine.Load (VAR S: tStream);
  429. BEGIN
  430.   tInputLine.Load(S);
  431.   GetPeerViewPtr(S, ScrollBar);
  432.   S.Write(Value, SizeOf(INTEGER));
  433.   S.Write(Limit.X, SizeOf(INTEGER));
  434.   S.Write(Limit.Y, SizeOf(INTEGER));
  435. END;
  436.  
  437.  
  438. FUNCTION tScrollInputLine.At (AValue: INTEGER): pString;
  439. BEGIN
  440.   Abstract;
  441. END;
  442.  
  443.  
  444. PROCEDURE tScrollInputLine.HandleEvent(VAR Event: tEvent);
  445. VAR
  446.   KeyIn: BOOLEAN;
  447. BEGIN
  448.   KeyIn := Event.What = evKeyDown;
  449.   tInputLine.HandleEvent(Event);
  450.  
  451.   CASE Event.What OF
  452.     evKeyDown:
  453.       BEGIN
  454.         CASE Event.KeyCode OF
  455.           kbUp:
  456.             IF Value >= Limit.X + ScrollBar^.ArStep THEN
  457.               ScrollTo(Value - ScrollBar^.ArStep) ELSE
  458.               ScrollTo(Limit.X);
  459.           kbDown:
  460.             IF Value <= Limit.Y - ScrollBar^.ArStep THEN
  461.               ScrollTo(Value + ScrollBar^.ArStep) ELSE
  462.               ScrollTo(Limit.Y);
  463.           kbPgUp:
  464.             IF Value >= Limit.X + ScrollBar^.PgStep THEN
  465.               ScrollTo(Value - ScrollBar^.PgStep) ELSE
  466.               ScrollTo(Limit.X);
  467.           kbPgDn:
  468.             IF Value <= Limit.Y - ScrollBar^.PgStep THEN
  469.               ScrollTo(Value + ScrollBar^.PgStep) ELSE
  470.               ScrollTo(Limit.Y);
  471.           ELSE Exit;
  472.         END;
  473.         ClearEvent(Event);
  474.         Exit;
  475.       END;
  476.     evBroadcast:
  477.       CASE Event.Command OF
  478.         cmScrollBarChanged:
  479.           IF Event.InfoPtr = ScrollBar THEN
  480.             ScrollDraw;
  481.         cmScrollBarClicked:
  482.           ;
  483.     END;
  484.   END;
  485.   IF KeyIn THEN
  486.     IF IndexOf(Data) <> OutOfRange THEN
  487.       ScrollTo(IndexOf(Data));
  488. END;
  489.  
  490.  
  491. FUNCTION tScrollInputLine.IndexOf(P: pString): INTEGER;
  492. BEGIN
  493.   Abstract;
  494. END;
  495.  
  496.  
  497. PROCEDURE tScrollInputLine.ScrollDraw;
  498. BEGIN
  499.   IF Value <> ScrollBar^.Value THEN
  500.     Value := ScrollBar^.Value;
  501.   Data^ := At(Value)^;
  502.   SelectAll(TRUE);
  503. END;
  504.  
  505.  
  506. PROCEDURE tScrollInputLine.ScrollTo (AValue: INTEGER);
  507. BEGIN
  508.   Value := AValue;
  509.   ScrollBar^.SetValue(Value);
  510. END;
  511.  
  512.  
  513. PROCEDURE tScrollInputLine.SetLimit (X, Y: INTEGER);
  514. BEGIN
  515.   Limit.X := X;
  516.   Limit.Y := Y;
  517.   ScrollBar^.SetRange(X, Y);
  518. END;
  519.  
  520.  
  521. PROCEDURE tScrollInputLine.Store (VAR S: tStream);
  522. BEGIN
  523.   tInputLine.Store(S);
  524.   PutPeerViewPtr(S, ScrollBar);
  525.   S.Read(Value, SizeOf(INTEGER));
  526.   S.Read(Limit.X, SizeOf(INTEGER));
  527.   S.Read(Limit.Y, SizeOf(INTEGER));
  528. END;
  529.  
  530.  
  531. FUNCTION tScrollInputLine.Valid (Command: WORD): BOOLEAN;
  532. VAR
  533.   Ok: BOOLEAN;
  534. BEGIN
  535.   Ok := TRUE;
  536.   IF (Command <> cmCancel) AND (Command <> cmValid) THEN
  537.     IF (Value < Limit.X) OR (Value > Limit.Y) OR
  538.        (IndexOf(Data) = OutOfRange) THEN BEGIN
  539.       Select;
  540.       MessageBox('Ungültige Eingabe.', NIL,
  541.                  mfError + mfOkButton);
  542.       SelectAll(TRUE);
  543.       Ok := FALSE;
  544.   END;
  545.   IF Ok THEN
  546.     Valid := tInputLine.Valid(Command) ELSE
  547.     Valid := FALSE;
  548. END;
  549.  
  550.  
  551.  
  552. (* ------------------------------------------------------ *)
  553. (*                    tColInputLine                       *)
  554. (* ------------------------------------------------------ *)
  555.  
  556.  
  557. CONSTRUCTOR tColInputLine.Init(VAR Bounds: TRect;
  558.                    AMaxLen: INTEGER; AScrollBar: pScrollBar;
  559.                    ACol: pCollection);
  560. BEGIN
  561.   tScrollInputLine.Init(Bounds, AMaxLen, AScrollBar);
  562.   Col := ACol;
  563.   IF Col <> NIL THEN BEGIN
  564.     SetLimit(0, Pred(Col^.Count));
  565.     IF ScrollBar <> NIL THEN
  566.       IF ScrollBar^.Size.Y = 1 THEN
  567.         ScrollBar^.SetStep(Col^.Count DIV
  568.                            ScrollBar^.Size.X, 1) ELSE
  569.         ScrollBar^.SetStep(Col^.Count DIV
  570.                            ScrollBar^.Size.Y, 1);
  571.   END;
  572. END;
  573.  
  574.  
  575. CONSTRUCTOR tColInputLine.Load (VAR S: tStream);
  576. BEGIN
  577.   tScrollInputLine.Load(S);
  578.   S.Put(Col);
  579. END;
  580.  
  581.  
  582. PROCEDURE tColInputLine.Store (VAR S: tStream);
  583. BEGIN
  584.   tScrollInputLine.Store(S);
  585.   Col := pCollection(S.Get);
  586. END;
  587.  
  588.  
  589.  
  590. (* ------------------------------------------------------ *)
  591. (*                    tSColInputLine                      *)
  592. (* ------------------------------------------------------ *)
  593.  
  594.  
  595. FUNCTION tSColInputLine.At (AValue: INTEGER): pString;
  596. BEGIN
  597.   IF (AValue >= Limit.X) AND (AValue <= Limit.Y) THEN
  598.     At := pString(Col^.At(AValue));
  599. END;
  600.  
  601.  
  602. FUNCTION tSColInputLine.IndexOf (P: pString): INTEGER;
  603. VAR
  604.   Index: INTEGER;
  605. BEGIN
  606.   Index := Col^.IndexOf(P);
  607.   IF Index = -1 THEN
  608.     IndexOf := OutOfRange ELSE
  609.     IndexOf := Index;
  610. END;
  611.  
  612.  
  613.  
  614. (* ------------------------------------------------------ *)
  615. (*                     tDropViewer                        *)
  616. (* ------------------------------------------------------ *)
  617.  
  618.  
  619. PROCEDURE tDropViewer.HandleEvent (VAR Event: tEvent);
  620. BEGIN
  621.   IF ((Event.What = evCommand) AND
  622.       (Event.Command = cmClose)) OR
  623.      ((Event.What = evKeyDown) AND
  624.       (Event.KeyCode = kbEsc)) THEN BEGIN
  625.     EndModal(cmCancel);
  626.     ClearEvent(Event);
  627.   END ELSE
  628.   IF ((Event.What = evKeyDown) AND
  629.       (Event.KeyCode = kbEnter)) OR
  630.      ((Event.What = evMouseDown) AND
  631.        Event.DOUBLE) THEN BEGIN
  632.     IF List^.Count > 0 THEN
  633.       EndModal(cmOk) ELSE
  634.       EndModal(cmCancel);
  635.     ClearEvent(Event);
  636.   END;
  637.   tListBox.HandleEvent(Event);
  638. END;
  639.  
  640.  
  641. FUNCTION tDropViewer.GetPalette: pPalette;
  642. CONST
  643.   cDropViewer : STRING[Length(cHistoryViewer)]
  644.               = cHistoryViewer;
  645. BEGIN
  646.   GetPalette := @cDropViewer;
  647. END;
  648.  
  649.  
  650.  
  651. (* ------------------------------------------------------ *)
  652. (*                     tDropWindow                        *)
  653. (* ------------------------------------------------------ *)
  654.  
  655.  
  656. CONSTRUCTOR tDropWindow.Init (VAR Bounds: tRect;
  657.                               AList: pCollection);
  658. BEGIN
  659.   tWindow.Init(Bounds, '', wnNoNumber);
  660.   Flags := wfClose;
  661.   InitViewer(AList);
  662. END;
  663.  
  664.  
  665. FUNCTION tDropWindow.GetSelection: STRING;
  666. BEGIN
  667.   GetSelection := Viewer^.GetText(Viewer^.Focused, 255);
  668. END;
  669.  
  670.  
  671. FUNCTION tDropWindow.GetPalette: pPalette;
  672. CONST
  673.   cDropWindow : STRING[Length(cHistoryWindow)]
  674.               = cHistoryWindow;
  675. BEGIN
  676.   GetPalette := @cDropWindow;
  677. END;
  678.  
  679.  
  680. PROCEDURE tDropWindow.InitViewer (AList: pCollection);
  681. VAR
  682.   R: tRect;
  683.   ScrollBar: pScrollBar;
  684. BEGIN
  685.   GetExtent(R);
  686.   R.Grow(-1, -1);
  687.   Viewer := New(pDropViewer, Init(R, 1, StandardScrollBar(
  688.                 sbVertical + sbHandleKeyboard)));
  689.   pListBox(Viewer)^.NewList(AList);
  690.   Insert(Viewer);
  691. END;
  692.  
  693.  
  694.  
  695. (* ------------------------------------------------------ *)
  696. (*                        tDrop                           *)
  697. (* ------------------------------------------------------ *)
  698.  
  699.  
  700. CONSTRUCTOR tDrop.Init (VAR Bounds:tRect; ALink: pInputLine;
  701.                       AHeight: INTEGER; AList: pCollection);
  702. BEGIN
  703.   tView.Init(Bounds);
  704.   Options := Options OR ofPostProcess;
  705.   EventMask := EventMask OR evBroadcast;
  706.   Link := ALink;
  707.   WinHeight := AHeight;
  708.   InitList(AList);
  709. END;
  710.  
  711.  
  712. CONSTRUCTOR tDrop.Load (VAR S: tStream);
  713. BEGIN
  714.   tView.Load(S);
  715.   GetPeerViewPtr(S, Link);
  716.   S.Read(WinHeight, SizeOf(INTEGER));
  717.   DropList := pCollection(S.Get);
  718. END;
  719.  
  720.  
  721. PROCEDURE tDrop.Draw;
  722. VAR
  723.   T: tDrawBuffer;
  724. BEGIN
  725.   MoveCStr(T, '▐~~▌', GetColor($0102));
  726.   WriteLine(0, 0, 3, 1, T);
  727. END;
  728.  
  729.  
  730. FUNCTION tDrop.GetPalette: pPalette;
  731. CONST
  732.   cDrop : STRING[Length(cHistory)] = cHistory;
  733. BEGIN
  734.   GetPalette := @cDrop;
  735. END;
  736.  
  737.  
  738. PROCEDURE tDrop.HandleEvent (VAR Event: tEvent);
  739.  
  740.   PROCEDURE Drop;
  741.   VAR
  742.     DropWindow: pDropWindow;
  743.     Data: STRING;
  744.   BEGIN
  745.     DropWindow := InitDropWindow;
  746.     IF Owner^.ExecView(DropWindow) = cmOk THEN BEGIN
  747.       Data := DropWindow^.GetSelection;
  748.       Link^.SetData(Data);
  749.       Link^.SelectAll(TRUE);
  750.     END;
  751.     Dispose(DropWindow, Done);
  752.   END;
  753.  
  754. BEGIN
  755.   IF ((Event.What = evMouseDown) AND
  756.       MouseInView(Event.Where)) OR
  757.      ((Event.What = evKeyDown) AND
  758.       (Event.KeyCode = kbDown)) THEN BEGIN
  759.     Drop;
  760.     ClearEvent(Event);
  761.   END;
  762.   tView.HandleEvent(Event);
  763. END;
  764.  
  765.  
  766. FUNCTION tDrop.InitDropWindow: pDropWindow;
  767. VAR
  768.   R: tRect;
  769. BEGIN
  770.   Link^.GetBounds(R);
  771.   Inc(R.A.Y);
  772.   R.B.Y := R.A.Y + WinHeight;
  773.   InitDropWindow := New(pDropWindow, Init(R, DropList));
  774. END;
  775.  
  776.  
  777. PROCEDURE tDrop.InitList (AList: pCollection);
  778. BEGIN
  779.   DropList := AList;
  780. END;
  781.  
  782.  
  783. PROCEDURE tDrop.Store (VAR S: tStream);
  784. BEGIN
  785.   tView.Store(S);
  786.   PutPeerViewPtr(S, Link);
  787.   S.Write(WinHeight, SizeOf(INTEGER));
  788.   S.Put(DropList);
  789. END;
  790.  
  791.  
  792.  
  793. (* ------------------------------------------------------ *)
  794. (*                    tWindowListBox                      *)
  795. (* ------------------------------------------------------ *)
  796.  
  797.  
  798. CONSTRUCTOR tWindowListBox.Init (VAR Bounds: tRect;
  799.                                  AScrollBar: pScrollBar);
  800. VAR
  801.   R: tRect;
  802. BEGIN
  803.   tListBox.Init(Bounds, 1, AScrollBar);
  804.   CollectWindows;
  805. END;
  806.  
  807.  
  808. DESTRUCTOR tWindowListBox.Done;
  809. BEGIN
  810.   IF List <> NIL THEN BEGIN
  811.     List^.DeleteAll;
  812.     Dispose(List, Done);
  813.   END;
  814.   tListBox.Done;
  815. END;
  816.  
  817.  
  818. PROCEDURE tWindowListBox.CollectWindows;
  819. VAR
  820.   AList: pCollection;
  821.  
  822.   PROCEDURE GetWindows (P: pIDWindow); FAR;
  823.   VAR
  824.     M: POINTER;
  825.   BEGIN
  826.     M := Message(P, evBroadcast, cmWhoisWindow, NIL);
  827.     IF M <> NIL THEN
  828.       AList^.Insert(pWindow(P));
  829.   END;
  830.  
  831. BEGIN
  832.   AList := New(pCollection, Init(5, 2));
  833.   Desktop^.ForEach(@GetWindows);
  834.   NewList(AList);
  835.   IF List^.Count = 0 THEN
  836.     State := State OR sfDisabled;
  837. END;
  838.  
  839.  
  840. FUNCTION tWindowListBox.GetText (Item: INTEGER; MaxLen:
  841.                                  INTEGER): STRING;
  842. BEGIN
  843.   IF pWindow(List^.At(Item))^.GetTitle(MaxLen) = '' THEN
  844.     GetText := 'Unbenannt' ELSE
  845.     GetText := pIDWindow(List^.At(Item))^.GetTitle(MaxLen);
  846. END;
  847.  
  848.  
  849. PROCEDURE tWindowListBox.GetData(VAR Rec);
  850. BEGIN
  851.   IF List^.Count <> 0 THEN
  852.     pIDWindow(Rec) := pIDWindow(List^.At(Focused)) ELSE
  853.     pIDWindow(Rec) := NIL;
  854. END;
  855.  
  856.  
  857. PROCEDURE tWindowListBox.HandleEvent (VAR Event: tEvent);
  858. BEGIN
  859.   IF (Event.What = evMouseDown) AND (Event.DOUBLE) THEN
  860.   BEGIN
  861.     Event.What := evCommand;
  862.     Event.Command := cmOK;
  863.     PutEvent(Event);
  864.     ClearEvent(Event);
  865.   END ELSE
  866.     tListBox.HandleEvent(Event);
  867. END;
  868.  
  869.  
  870. PROCEDURE tWindowListBox.SetData(VAR Rec);
  871. BEGIN
  872. END;
  873.  
  874.  
  875.  
  876. (* ------------------------------------------------------ *)
  877. (*                    tKeyInputLine                       *)
  878. (* ------------------------------------------------------ *)
  879.  
  880.  
  881. FUNCTION tKeyInputLine.Valid(Command: WORD): BOOLEAN;
  882. VAR
  883.   Ok: BOOLEAN;
  884. BEGIN
  885.   Ok := TRUE;
  886.   IF (Command <> cmCancel) AND
  887.      (Command <> cmValid) THEN BEGIN
  888.     IF Data^ = '' THEN BEGIN
  889.       Select;
  890.       MessageBox('Dieses Feld muß Daten enthalten.', NIL,
  891.                   mfError + mfOkButton);
  892.       Ok := FALSE;
  893.     END;
  894.   END;
  895.   IF Ok THEN
  896.     Valid := tInputLine.Valid(Command) ELSE
  897.     Valid := FALSE;
  898. END;
  899.  
  900.  
  901.  
  902. (* ------------------------------------------------------ *)
  903. (*                    tNumInputLine                       *)
  904. (* ------------------------------------------------------ *)
  905.  
  906.  
  907. CONSTRUCTOR TNumInputLine.Init(VAR Bounds: tRect;
  908.             AMaxLen: INTEGER; AMin, AMax: LONGINT);
  909. BEGIN
  910.   tInputLine.Init(Bounds, AMaxLen);
  911.   Min := AMin;
  912.   Max := AMax;
  913. END;
  914.  
  915.  
  916. CONSTRUCTOR tNumInputLine.Load(VAR S: tStream);
  917. BEGIN
  918.   tInputLine.Load(S);
  919.   S.Read(Min, SizeOf(LONGINT) * 2);
  920. END;
  921.  
  922.  
  923. FUNCTION tNumInputLine.DataSize: WORD;
  924. BEGIN
  925.   DataSize := SizeOf(LONGINT);
  926. END;
  927.  
  928.  
  929. PROCEDURE tNumInputLine.GetData(VAR Rec);
  930. VAR
  931.   Code: INTEGER;
  932. BEGIN
  933.   Val(Data^, LONGINT(Rec), Code);
  934. END;
  935.  
  936.  
  937. PROCEDURE tNumInputLine.Store(VAR S: tStream);
  938. BEGIN
  939.   tInputLine.Store(S);
  940.   S.Write(Min, SizeOf(LONGINT) * 2);
  941. END;
  942.  
  943.  
  944. PROCEDURE tNumInputLine.SetData(VAR Rec);
  945. VAR
  946.   S: STRING[12];
  947. BEGIN
  948.   Str(LONGINT(Rec), Data^);
  949.   SelectAll(TRUE);
  950. END;
  951.  
  952.  
  953. FUNCTION tNumInputLine.Valid(Command: WORD): BOOLEAN;
  954. VAR
  955.   Code: INTEGER;
  956.   Value: LONGINT;
  957.   Params: ARRAY[0..1] OF LONGINT;
  958.   Ok: BOOLEAN;
  959. BEGIN
  960.   Ok := TRUE;
  961.   IF (Command <> cmCancel) AND
  962.      (Command <> cmValid) THEN BEGIN
  963.     IF Data^ = '' THEN Data^ := '0';
  964.     Val(Data^, Value, Code);
  965.     IF (Code <> 0) OR (Value < Min) OR
  966.        (Value > Max) THEN BEGIN
  967.       Select;
  968.       Params[0] := Min;
  969.       Params[1] := Max;
  970.       MessageBox('Gültiger Zahlenbereich: %D TO %D.',
  971.                   @Params, mfError + mfOkButton);
  972.       SelectAll(TRUE);
  973.       Ok := FALSE;
  974.     END;
  975.   END;
  976.   IF Ok THEN
  977.     Valid := tInputLine.Valid(Command) ELSE
  978.     Valid := FALSE;
  979. END;
  980.  
  981.  
  982.  
  983.  
  984. PROCEDURE WindowListDialog;
  985. VAR
  986.   Result: WORD;
  987.   Selected: pIDWindow;
  988.   D: pDialog;
  989.   R: tRect;
  990.   C: pView;
  991. BEGIN
  992.   R.Assign(0, 0, 51, 15);
  993.   D := New(pDialog, Init(R, 'Fenster'));
  994.  
  995.   WITH D^ DO BEGIN
  996.     Options := Options OR ofCentered;
  997.  
  998.     R.Assign( 36, 3, 37, 13);
  999.     C := New(pScrollBar, Init(R));
  1000.     Insert(C);
  1001.  
  1002.     R.Assign( 3, 3, 36, 13);
  1003.     C := New(pWindowListBox, Init(R, pScrollBar(C)));
  1004.     Insert(C);
  1005.     R.Assign( 2, 2, 12, 3);
  1006.     Insert(New(pLabel, Init(R, 'Fenster', C)));
  1007.     R.Assign(38, 3, 48, 5);
  1008.     Insert(New(pButton, Init(R, 'O~k~', cmOk,
  1009.                              bfDefault)));
  1010.     R.Move(0, 3); Inc(R.B.X);
  1011.     Insert(New(pButton, Init(R, '~L~öschen', cmNo,
  1012.                              bfNormal)));
  1013.     R.Move(0, 3);
  1014.     Insert(New(pButton, Init(R, 'Abbruch', cmCancel,
  1015.                              bfNormal)));
  1016.     SelectNext(FALSE);
  1017.   END;
  1018.  
  1019.   Result := ExecDialog(D, @Selected);
  1020.  
  1021.   CASE Result OF
  1022.     cmOk:
  1023.       IF Selected <> NIL THEN BEGIN
  1024.         Selected^.MakeFirst;
  1025.         Selected^.Show;
  1026.       END;
  1027.     cmNo:
  1028.       IF Selected <> NIL THEN Selected^.Close;
  1029.   END;
  1030. END;
  1031.  
  1032.  
  1033. PROCEDURE PinUp (W, H: INTEGER; S: STRING; Params: POINTER);
  1034. VAR
  1035.   R: tRect;
  1036.   PS: STRING;
  1037. BEGIN
  1038.   IF Pinned THEN Exit;
  1039.   R.Assign(0, 0, W, H);
  1040.   P := New(pMonolog, Init(R, ''));
  1041.   WITH P^ DO BEGIN
  1042.     Options := Options OR ofCentered;
  1043.     GetExtent(R);
  1044.     R.Grow(-1, -1);
  1045.     FormatStr(PS, S, Params^);
  1046.     Insert(New(pStaticText, Init(R, PS)));
  1047.   END;
  1048.   Desktop^.Insert(P);
  1049.   Pinned := TRUE;
  1050. END;
  1051.  
  1052.  
  1053. PROCEDURE PinDown;
  1054. BEGIN
  1055.   IF NOT Pinned THEN Exit;
  1056.   Dispose(P, Done);
  1057.   Pinned := FALSE;
  1058. END;
  1059.  
  1060.  
  1061. FUNCTION ExecDialog(P: pDialog; Data: POINTER): WORD;
  1062. VAR
  1063.   Result: WORD;
  1064. BEGIN
  1065.   Result := cmCancel;
  1066.   P := pDialog(Application^.ValidView(P));
  1067.   IF P <> NIL THEN
  1068.   BEGIN
  1069.     IF Data <> NIL THEN P^.SetData(Data^);
  1070.     Result := DeskTop^.ExecView(P);
  1071.     IF (Result <> cmCancel) AND (Data <> NIL) THEN
  1072.       P^.GetData(Data^);
  1073.     Dispose(P, Done);
  1074.   END;
  1075.   ExecDialog := Result;
  1076. END;
  1077.  
  1078.  
  1079.  
  1080. PROCEDURE RegisterXDialogs;
  1081. BEGIN
  1082.   RegisterType(rBarView);
  1083.   RegisterType(rMonolog);
  1084.   RegisterType(rScrollInputLine);
  1085.   RegisterType(rColInputLine);
  1086.   RegisterType(rSColInputLine);
  1087.   RegisterType(rWindowListBox);
  1088.   RegisterType(rDrop);
  1089.   RegisterType(rKeyInputLine);
  1090.   RegisterType(rNumInputLine);
  1091. END;
  1092.  
  1093.  
  1094. END.
  1095.  
  1096.  
  1097. (* ------------------------------------------------------ *)
  1098. (*                 Ende von XDIALOGS.PAS                  *)
  1099.