home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / OTHERUTI / TPASCAL3.ZIP / TVISION.ZIP / COLORSEL.PAS < prev    next >
Pascal/Delphi Source File  |  1991-06-11  |  20KB  |  880 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Turbo Pascal Version 6.0                        }
  5. {       Turbo Vision Unit                               }
  6. {                                                       }
  7. {       Copyright (c) 1990 Borland International        }
  8. {                                                       }
  9. {*******************************************************}
  10.  
  11. unit ColorSel;
  12.  
  13. {$F+,O+,X+,D-}
  14.  
  15. interface
  16.  
  17. uses Objects, Drivers, Views, Dialogs;
  18.  
  19. const
  20.   cmColorForegroundChanged = 71;
  21.   cmColorBackgroundChanged = 72;
  22.   cmColorSet               = 73;
  23.   cmNewColorItem           = 74;
  24.   cmNewColorIndex          = 75;
  25.  
  26. type
  27.  
  28.   { TColorItem }
  29.  
  30.   PColorItem = ^TColorItem;
  31.   TColorItem = record
  32.     Name: PString;
  33.     Index: Byte;
  34.     Next: PColorItem;
  35.   end;
  36.  
  37.   { TColorGroup }
  38.  
  39.   PColorGroup = ^TColorGroup;
  40.   TColorGroup = record
  41.     Name:  PString;
  42.     Items: PColorItem;
  43.     Next:  PColorGroup;
  44.   end;
  45.  
  46.   { TColorSelector }
  47.  
  48.   TColorSel = (csBackground, csForeground);
  49.  
  50.   PColorSelector = ^TColorSelector;
  51.   TColorSelector = object(TView)
  52.     Color: Byte;
  53.     SelType: TColorSel;
  54.     constructor Init(var Bounds: TRect; ASelType: TColorSel);
  55.     constructor Load(var S: TStream);
  56.     procedure Draw; virtual;
  57.     procedure HandleEvent(var Event: TEvent); virtual;
  58.     procedure Store(var S: TStream);
  59.   end;
  60.  
  61.   { TMonoSelector }
  62.  
  63.   PMonoSelector = ^TMonoSelector;
  64.   TMonoSelector = object(TCluster)
  65.     constructor Init(var Bounds: TRect);
  66.     procedure Draw; virtual;
  67.     procedure HandleEvent(var Event: TEvent); virtual;
  68.     function Mark(Item: Integer): Boolean; virtual;
  69.     procedure NewColor;
  70.     procedure Press(Item: Integer); virtual;
  71.     procedure MovedTo(Item: Integer); virtual;
  72.   end;
  73.  
  74.   { TColorDisplay }
  75.  
  76.   PColorDisplay = ^TColorDisplay;
  77.   TColorDisplay = object(TView)
  78.     Color: ^Byte;
  79.     Text: PString;
  80.     constructor Init(var Bounds: TRect; AText: PString);
  81.     constructor Load(var S: TStream);
  82.     destructor Done; virtual;
  83.     procedure Draw; virtual;
  84.     procedure HandleEvent(var Event: TEvent); virtual;
  85.     procedure SetColor(var AColor: Byte); virtual;
  86.     procedure Store(var S: TStream);
  87.   end;
  88.  
  89.   { TColorGroupList }
  90.  
  91.   PColorGroupList = ^TColorGroupList;
  92.   TColorGroupList = object(TListViewer)
  93.     Groups: PColorGroup;
  94.     constructor Init(var Bounds: TRect; AScrollBar: PScrollBar;
  95.       AGroups: PColorGroup);
  96.     constructor Load(var S: TStream);
  97.     destructor Done; virtual;
  98.     procedure FocusItem(Item: Integer); virtual;
  99.     function GetText(Item: Integer; MaxLen: Integer): String; virtual;
  100.     procedure Store(var S: TStream);
  101.   end;
  102.  
  103.   { TColorItemList }
  104.  
  105.   PColorItemList = ^TColorItemList;
  106.   TColorItemList = object(TListViewer)
  107.     Items: PColorItem;
  108.     constructor Init(var Bounds: TRect; AScrollBar: PScrollBar;
  109.       AItems: PColorItem);
  110.     procedure FocusItem(Item: Integer); virtual;
  111.     function GetText(Item: Integer; MaxLen: Integer): String; virtual;
  112.     procedure HandleEvent(var Event: TEvent); virtual;
  113.   end;
  114.  
  115.   { TColorDialog }
  116.  
  117.   PColorDialog = ^TColorDialog;
  118.   TColorDialog = object(TDialog)
  119.     Display: PColorDisplay;
  120.     Groups: PColorGroupList;
  121.     ForLabel: PLabel;
  122.     ForSel: PColorSelector;
  123.     BakLabel: PLabel;
  124.     BakSel: PColorSelector;
  125.     MonoLabel: PLabel;
  126.     MonoSel: PMonoSelector;
  127.     Pal: TPalette;
  128.     constructor Init(APalette: TPalette; AGroups: PColorGroup);
  129.     constructor Load(var S: TStream);
  130.     function DataSize: Word; virtual;
  131.     procedure GetData(var Rec); virtual;
  132.     procedure HandleEvent(var Event: TEvent); virtual;
  133.     procedure SetData(var Rec); virtual;
  134.     procedure Store(var S: TStream);
  135.   end;
  136.  
  137. { Color list building routines }
  138.  
  139. function ColorItem(Name: String; Index: Byte; Next: PColorItem): PColorItem;
  140. function ColorGroup(Name: String; Items: PColorItem; Next: PColorGroup):
  141.   PColorGroup;
  142.  
  143. { ColorSel registration procedure }
  144.  
  145. procedure RegisterColorSel;
  146.  
  147. { Stream registration records }
  148.  
  149. const
  150.   RColorSelector: TStreamRec = (
  151.      ObjType: 21;
  152.      VmtLink: Ofs(TypeOf(TColorSelector)^);
  153.      Load:    @TColorSelector.Load;
  154.      Store:   @TColorSelector.Store
  155.   );
  156.   RMonoSelector: TStreamRec = (
  157.      ObjType: 22;
  158.      VmtLink: Ofs(TypeOf(TMonoSelector)^);
  159.      Load:    @TMonoSelector.Load;
  160.      Store:   @TMonoSelector.Store
  161.   );
  162.   RColorDisplay: TStreamRec = (
  163.      ObjType: 23;
  164.      VmtLink: Ofs(TypeOf(TColorDisplay)^);
  165.      Load:    @TColorDisplay.Load;
  166.      Store:   @TColorDisplay.Store
  167.   );
  168.   RColorGroupList: TStreamRec = (
  169.      ObjType: 24;
  170.      VmtLink: Ofs(TypeOf(TColorGroupList)^);
  171.      Load:    @TColorGroupList.Load;
  172.      Store:   @TColorGroupList.Store
  173.   );
  174.   RColorItemList: TStreamRec = (
  175.      ObjType: 25;
  176.      VmtLink: Ofs(TypeOf(TColorItemList)^);
  177.      Load:    @TColorItemList.Load;
  178.      Store:   @TColorItemList.Store
  179.   );
  180.   RColorDialog: TStreamRec = (
  181.      ObjType: 26;
  182.      VmtLink: Ofs(TypeOf(TColorDialog)^);
  183.      Load:    @TColorDialog.Load;
  184.      Store:   @TColorDialog.Store
  185.   );
  186.  
  187. implementation
  188.  
  189. { TColorSelector }
  190.  
  191. constructor TColorSelector.Init(var Bounds: TRect; ASelType: TColorSel);
  192. begin
  193.   TView.Init(Bounds);
  194.   Options := Options or (ofSelectable + ofFirstClick + ofFramed);
  195.   EventMask := EventMask or evBroadcast;
  196.   SelType := ASelType;
  197.   Color := 0;
  198. end;
  199.  
  200. constructor TColorSelector.Load(var S: TStream);
  201. begin
  202.   TView.Load(S);
  203.   S.Read(Color, SizeOf(Byte) + SizeOf(TColorSel));
  204. end;
  205.  
  206. procedure TColorSelector.Draw;
  207. var
  208.   B: TDrawBuffer;
  209.   C, I, J: Integer;
  210. begin
  211.   MoveChar(B, ' ', $70, Size.X);
  212.   for I := 0 to Size.Y do
  213.   begin
  214.     if I < 4 then
  215.       for J := 0 to 3 do
  216.       begin
  217.         C := I * 4 + J;
  218.         MoveChar(B[ J*3 ], #219, C, 3);
  219.         if C = Byte(Color) then
  220.         begin
  221.           WordRec(B[ J*3+1 ]).Lo := 8;
  222.           if C = 0 then WordRec(B[ J*3+1 ]).Hi := $70;
  223.         end;
  224.       end;
  225.     WriteLine(0, I, Size.X, 1, B);
  226.   end;
  227. end;
  228.  
  229. procedure TColorSelector.HandleEvent(var Event: TEvent);
  230. const
  231.   Width = 4;
  232. var
  233.   MaxCol: Byte;
  234.   Mouse: TPoint;
  235.   OldColor: Byte;
  236.  
  237. procedure ColorChanged;
  238. var
  239.   Msg: Integer;
  240. begin
  241.   if SelType = csForeground then
  242.     Msg := cmColorForegroundChanged else
  243.     Msg := cmColorBackgroundChanged;
  244.   Message(Owner, evBroadcast, Msg, Pointer(Color));
  245. end;
  246.  
  247. begin
  248.   TView.HandleEvent(Event);
  249.   case Event.What of
  250.     evMouseDown:
  251.       begin
  252.         OldColor := Color;
  253.         repeat
  254.           if MouseInView(Event.Where) then
  255.           begin
  256.             MakeLocal(Event.Where, Mouse);
  257.             Color := Mouse.Y * 4 + Mouse.X div 3;
  258.           end
  259.           else
  260.             Color := OldColor;
  261.           ColorChanged;
  262.           DrawView;
  263.         until not MouseEvent(Event, evMouseMove);
  264.       end;
  265.     evKeyDown:
  266.       begin
  267.         if SelType = csBackground then
  268.           MaxCol := 7 else
  269.           MaxCol := 15;
  270.         case CtrlToArrow(Event.KeyCode) of
  271.           kbLeft:
  272.             if Color > 0 then
  273.               Dec(Color) else
  274.               Color := MaxCol;
  275.           kbRight:
  276.             if Color < MaxCol then
  277.               Inc(Color) else
  278.               Color := 0;
  279.           kbUp:
  280.             if Color > Width - 1 then
  281.               Dec(Color, Width) else
  282.               if Color = 0 then
  283.                 Color := MaxCol else
  284.                 Inc(Color, MaxCol - Width);
  285.           kbDown:
  286.             if Color < MaxCol - (Width - 1) then
  287.               Inc(Color, Width) else
  288.               if Color = MaxCol then
  289.                 Color := 0 else
  290.                 Dec(Color, MaxCol - Width);
  291.         else
  292.           Exit;
  293.         end;
  294.       end;
  295.     evBroadcast:
  296.       if Event.Command = cmColorSet then
  297.       begin
  298.         if SelType = csBackground then
  299.           Color := Event.InfoByte shr 4 else
  300.           Color := Event.InfoByte and $0F;
  301.         DrawView;
  302.         Exit;
  303.       end else Exit;
  304.   else
  305.     Exit;
  306.   end;
  307.   DrawView;
  308.   ColorChanged;
  309.   ClearEvent(Event);
  310. end;
  311.  
  312. procedure TColorSelector.Store(var S: TStream);
  313. begin
  314.   TView.Store(S);
  315.   S.Write(Color, SizeOf(Byte) + SizeOf(TColorSel));
  316. end;
  317.  
  318. { TMonoSelector }
  319.  
  320. const
  321.   MonoColors: array[0..4] of Byte = ($07, $0F, $01, $70, $09);
  322.  
  323. constructor TMonoSelector.Init(var Bounds: TRect);
  324. begin
  325.   TCluster.Init(Bounds,
  326.     NewSItem('Normal',
  327.     NewSItem('Highlight',
  328.     NewSItem('Underline',
  329.     NewSItem('Inverse', nil)))));
  330.   EventMask := EventMask or evBroadcast;
  331. end;
  332.  
  333. procedure TMonoSelector.Draw;
  334. const
  335.   Button = ' ( ) ';
  336. begin
  337.   DrawBox(Button, #7);
  338. end;
  339.  
  340. procedure TMonoSelector.HandleEvent(var Event: TEvent);
  341. begin
  342.   TCluster.HandleEvent(Event);
  343.   if (Event.What = evBroadcast) and (Event.Command = cmColorSet) then
  344.   begin
  345.     Value := Event.InfoByte;
  346.     DrawView;
  347.   end;
  348. end;
  349.  
  350. function TMonoSelector.Mark(Item: Integer): Boolean;
  351. begin
  352.   Mark := MonoColors[Item] = Value;
  353. end;
  354.  
  355. procedure TMonoSelector.NewColor;
  356. begin
  357.   Message(Owner, evBroadcast, cmColorForegroundChanged,
  358.     Pointer(Value and $0F));
  359.   Message(Owner, evBroadcast, cmColorBackgroundChanged,
  360.     Pointer((Value shr 4) and $0F));
  361. end;
  362.  
  363. procedure TMonoSelector.Press(Item: Integer);
  364. begin
  365.   Value := MonoColors[Item];
  366.   NewColor;
  367. end;
  368.  
  369. procedure TMonoSelector.MovedTo(Item: Integer);
  370. begin
  371.   Value := MonoColors[Item];
  372.   NewColor;
  373. end;
  374.  
  375. { TColorDisplay }
  376.  
  377. constructor TColorDisplay.Init(var Bounds: TRect; AText: PString);
  378. begin
  379.   TView.Init(Bounds);
  380.   EventMask := EventMask or evBroadcast;
  381.   Text := AText;
  382.   Color := nil;
  383. end;
  384.  
  385. constructor TColorDisplay.Load(var S: TStream);
  386. begin
  387.   TView.Load(S);
  388.   Text := S.ReadStr;
  389. end;
  390.  
  391. destructor TColorDisplay.Done;
  392. begin
  393.   DisposeStr(Text);
  394.   TView.Done;
  395. end;
  396.  
  397. procedure TColorDisplay.Draw;
  398. var
  399.   B: TDrawBuffer;
  400.   I: Integer;
  401.   C: Byte;
  402. begin
  403.   C := Color^;
  404.   if C = 0 then C := ErrorAttr;
  405.   for I := 0 to Size.X div Length(Text^) do
  406.     MoveStr(B[I*Length(Text^)], Text^, C);
  407.   WriteLine(0, 0, Size.X, Size.Y, B);
  408. end;
  409.  
  410. procedure TColorDisplay.HandleEvent(var Event: TEvent);
  411. begin
  412.   TView.HandleEvent(Event);
  413.   case Event.What of
  414.     evBroadcast:
  415.       case Event.Command of
  416.         cmColorBackgroundChanged:
  417.           begin
  418.             Color^ := (Color^ and $0F) or (Event.InfoByte shl 4 and $F0);
  419.             DrawView;
  420.           end;
  421.         cmColorForegroundChanged:
  422.           begin
  423.             Color^ := (Color^ and $F0) or (Event.InfoByte and $0F);
  424.             DrawView;
  425.           end;
  426.       end;
  427.   end;
  428. end;
  429.  
  430. procedure TColorDisplay.SetColor(var AColor: Byte);
  431. begin
  432.   Color := @AColor;
  433.   Message(Owner, evBroadcast, cmColorSet, Pointer(Color^));
  434.   DrawView;
  435. end;
  436.  
  437. procedure TColorDisplay.Store(var S: TStream);
  438. begin
  439.   TView.Store(S);
  440.   S.WriteStr(Text);
  441. end;
  442.  
  443. { TColorGroupList }
  444.  
  445. constructor TColorGroupList.Init(var Bounds: TRect; AScrollBar: PScrollBar;
  446.   AGroups: PColorGroup);
  447. var
  448.   I: Integer;
  449. begin
  450.   TListViewer.Init(Bounds, 1, nil, AScrollBar);
  451.   Groups := AGroups;
  452.   I := 0;
  453.   while AGroups <> nil do
  454.   begin
  455.     AGroups := AGroups^.Next;
  456.     Inc(I);
  457.   end;
  458.   SetRange(I);
  459. end;
  460.  
  461. constructor TColorGroupList.Load(var S: TStream);
  462.  
  463. function ReadItems: PColorItem;
  464. var
  465.   Itms:  PColorItem;
  466.   CurItm: ^PColorItem;
  467.   Count, I: Integer;
  468. begin
  469.   S.Read(Count, SizeOf(Integer));
  470.   Itms := nil;
  471.   CurItm := @Itms;
  472.   for I := 1 to Count do
  473.   begin
  474.     New(CurItm^);
  475.     with CurItm^^ do
  476.     begin
  477.       Name := S.ReadStr;
  478.       S.Read(Index, SizeOf(Byte));
  479.     end;
  480.     CurItm := @CurItm^^.Next;
  481.   end;
  482.   CurItm^ := nil;
  483.   ReadItems := Itms;
  484. end;
  485.  
  486. function ReadGroups: PColorGroup;
  487. var
  488.   Grps:  PColorGroup;
  489.   CurGrp: ^PColorGroup;
  490.   Count, I: Integer;
  491. begin
  492.   S.Read(Count, SizeOf(Integer));
  493.   Grps := nil;
  494.   CurGrp := @Grps;
  495.   for I := 1 to Count do
  496.   begin
  497.     New(CurGrp^);
  498.     with CurGrp^^ do
  499.     begin
  500.       Name := S.ReadStr;
  501.       Items := ReadItems;
  502.     end;
  503.     CurGrp := @CurGrp^^.Next;
  504.   end;
  505.   CurGrp^ := nil;
  506.   ReadGroups := Grps;
  507. end;
  508.  
  509. begin
  510.   TListViewer.Load(S);
  511.   Groups := ReadGroups;
  512. end;
  513.  
  514. destructor TColorGroupList.Done;
  515.  
  516. procedure FreeItems(CurITem: PColorItem);
  517. var
  518.   P: PColorItem;
  519. begin
  520.   while CurItem <> nil do
  521.   begin
  522.     P := CurItem;
  523.     DisposeStr(CurItem^.Name);
  524.     CurItem := CurItem^.Next;
  525.     Dispose(P);
  526.   end;
  527. end;
  528.  
  529. procedure FreeGroups(CurGroup: PColorGroup);
  530. var
  531.   P: PColorGroup;
  532. begin
  533.   while CurGroup <> nil do
  534.   begin
  535.     P := CurGroup;
  536.     FreeItems(CurGroup^.Items);
  537.     DisposeStr(CurGroup^.Name);
  538.     CurGroup := CurGroup^.Next;
  539.     Dispose(P);
  540.   end
  541. end;
  542.  
  543. begin
  544.   TListViewer.Done;
  545.   FreeGroups(Groups);
  546. end;
  547.  
  548. procedure TColorGroupList.FocusItem(Item: Integer);
  549. var
  550.   CurGroup: PColorGroup;
  551. begin
  552.   TListViewer.FocusItem(Item);
  553.   CurGroup := Groups;
  554.   while Item > 0 do
  555.   begin
  556.     CurGroup := CurGroup^.Next;
  557.     Dec(Item);
  558.   end;
  559.   Message(Owner, evBroadcast, cmNewColorItem, CurGroup^.Items);
  560. end;
  561.  
  562. function TColorGroupList.GetText(Item: Integer; MaxLen: Integer): String;
  563. var
  564.   CurGroup: PColorGroup;
  565.   I: Integer;
  566. begin
  567.   CurGroup := Groups;
  568.   while Item > 0 do
  569.   begin
  570.     CurGroup := CurGroup^.Next;
  571.     Dec(Item);
  572.   end;
  573.   GetText := CurGroup^.Name^;
  574. end;
  575.  
  576. procedure TColorGroupList.Store(var S: TStream);
  577.  
  578. procedure WriteItems(Items: PColorItem);
  579. var
  580.   CurItm: PColorItem;
  581.   Count: Integer;
  582. begin
  583.   Count := 0;
  584.   CurItm := Items;
  585.   while CurItm <> nil do
  586.   begin
  587.     CurItm := CurItm^.Next;
  588.     Inc(Count);
  589.   end;
  590.   S.Write(Count, SizeOf(Integer));
  591.   CurItm := Items;
  592.   while CurItm <> nil do
  593.   begin
  594.     with CurItm^ do
  595.     begin
  596.       S.WriteStr(Name);
  597.       S.Write(Index, SizeOf(Byte));
  598.     end;
  599.     CurItm := CurItm^.Next;
  600.   end;
  601. end;
  602.  
  603. procedure WriteGroups(Groups: PColorGroup);
  604. var
  605.   CurGrp: PColorGroup;
  606.   Count: Integer;
  607. begin
  608.   Count := 0;
  609.   CurGrp := Groups;
  610.   while CurGrp <> nil do
  611.   begin
  612.     CurGrp := CurGrp^.Next;
  613.     Inc(Count);
  614.   end;
  615.   S.Write(Count, SizeOf(Integer));
  616.   CurGrp := Groups;
  617.   while CurGrp <> nil do
  618.   begin
  619.     with CurGrp^ do
  620.     begin
  621.       S.WriteStr(Name);
  622.       WriteItems(Items);
  623.     end;
  624.     CurGrp := CurGrp^.Next;
  625.   end;
  626. end;
  627.  
  628. begin
  629.   TListViewer.Store(S);
  630.   WriteGroups(Groups);
  631. end;
  632.  
  633. { TColorItemList }
  634.  
  635. constructor TColorItemList.Init(var Bounds: TRect; AScrollBar: PScrollBar;
  636.   AItems: PColorItem);
  637. var
  638.   I: Integer;
  639. begin
  640.   TListViewer.Init(Bounds, 1, nil, AScrollBar);
  641.   EventMask := EventMask or evBroadcast;
  642.   Items := AItems;
  643.   I := 0;
  644.   while AItems <> nil do
  645.   begin
  646.     AItems := AItems^.Next;
  647.     Inc(I);
  648.   end;
  649.   SetRange(I);
  650. end;
  651.  
  652. procedure TColorItemList.FocusItem(Item: Integer);
  653. var
  654.   CurItem: PColorItem;
  655. begin
  656.   TListViewer.FocusItem(Item);
  657.   CurItem := Items;
  658.   while Item > 0 do
  659.   begin
  660.     CurItem := CurItem^.Next;
  661.     Dec(Item);
  662.   end;
  663.   Message(Owner, evBroadcast, cmNewColorIndex, Pointer(CurItem^.Index));
  664. end;
  665.  
  666. function TColorItemList.GetText(Item: Integer; MaxLen: Integer): String;
  667. var
  668.   CurItem: PColorItem;
  669. begin
  670.   CurItem := Items;
  671.   while Item > 0 do
  672.   begin
  673.     CurItem := CurItem^.Next;
  674.     Dec(Item);
  675.   end;
  676.   GetText := CurItem^.Name^;
  677. end;
  678.  
  679. procedure TColorItemList.HandleEvent(var Event: TEvent);
  680. var
  681.   CurItem: PColorItem;
  682.   I: Integer;
  683. begin
  684.   TListViewer.HandleEvent(Event);
  685.   case Event.What of
  686.     evBroadcast:
  687.       if Event.Command = cmNewColorItem then
  688.       begin
  689.         Items := Event.InfoPtr;
  690.         CurItem := Items;
  691.         I := 0;
  692.         while CurItem <> nil do
  693.         begin
  694.           CurItem := CurItem^.Next;
  695.           Inc(I);
  696.         end;
  697.         SetRange(I);
  698.         FocusItem(0);
  699.         DrawView;
  700.       end;
  701.   end;
  702. end;
  703.  
  704. { TColorDialog }
  705.  
  706. constructor TColorDialog.Init(APalette: TPalette; AGroups: PColorGroup);
  707. var
  708.   R: TRect;
  709.   P: PView;
  710. begin
  711.   R.Assign(0, 0, 61, 18);
  712.   TDialog.Init(R, 'Colors');
  713.   Options := Options or ofCentered;
  714.   Pal := APalette;
  715.  
  716.   R.Assign(18, 3, 19, 14);
  717.   P := New(PScrollBar, Init(R));
  718.   Insert(P);
  719.   R.Assign(3, 3, 18, 14);
  720.   Groups := New(PColorGroupList, Init(R, PScrollBar(P), AGroups));
  721.   Insert(Groups);
  722.   R.Assign(2, 2, 8, 3);
  723.   Insert(New(PLabel, Init(R, '~G~roup', Groups)));
  724.  
  725.   R.Assign(41, 3, 42, 14);
  726.   P := New(PScrollBar, Init(R));
  727.   Insert(P);
  728.   R.Assign(21, 3, 41, 14);
  729.   P := New(PColorItemList, Init(R, PScrollBar(P), AGroups^.Items));
  730.   Insert(P);
  731.   R.Assign(20, 2, 25, 3);
  732.   Insert(New(PLabel, Init(R, '~I~tem', P)));
  733.  
  734.   R.Assign(45, 3, 57, 7);
  735.   ForSel := New(PColorSelector, Init(R, csForeground));
  736.   Insert(ForSel);
  737.   Dec(R.A.Y); R.B.Y := R.A.Y+1;
  738.   ForLabel := New(PLabel, Init(R, '~F~oreground', ForSel));
  739.   Insert(ForLabel);
  740.  
  741.   Inc(R.A.Y, 7); Inc(R.B.Y,8);
  742.   BakSel := New(PColorSelector, Init(R, csBackground));
  743.   Insert(BakSel);
  744.   Dec(R.A.Y); R.B.Y := R.A.Y+1;
  745.   BakLabel := New(PLabel, Init(R, '~B~ackground', BakSel));
  746.   Insert(BakLabel);
  747.  
  748.   Dec(R.A.X); Inc(R.B.X); Inc(R.A.Y, 4); Inc(R.B.Y, 5);
  749.   Display := New(PColorDisplay, Init(R, NewStr('Text ')));
  750.   Insert(Display);
  751.  
  752.   R.Assign(44, 3, 59, 8);
  753.   MonoSel := New(PMonoSelector, Init(R));
  754.   MonoSel^.Hide;
  755.   Insert(MonoSel);
  756.   R.Assign(43, 2, 49, 3);
  757.   MonoLabel := New(PLabel, Init(R, '~C~olor', MonoSel));
  758.   MonoLabel^.Hide;
  759.   Insert(MonoLabel);
  760.  
  761.   if (AGroups <> nil) and (AGroups^.Items <> nil) then
  762.     Display^.SetColor(Byte(Pal[AGroups^.Items^.Index]));
  763.  
  764.   R.Assign(36, 15, 46, 17);
  765.   P := New(PButton, Init(R, 'O~K~', cmOk, bfDefault));
  766.   Insert(P);
  767.   R.Assign(48, 15, 58, 17);
  768.   P := New(PButton, Init(R, 'Cancel', cmCancel, bfNormal));
  769.   Insert(P);
  770.   SelectNext(False);
  771. end;
  772.  
  773. constructor TColorDialog.Load(var S: TStream);
  774. var
  775.   Len: Byte;
  776. begin
  777.   TDialog.Load(S);
  778.   GetSubViewPtr(S, Display);
  779.   GetSubViewPtr(S, Groups);
  780.   GetSubViewPtr(S, ForLabel);
  781.   GetSubViewPtr(S, ForSel);
  782.   GetSubViewPtr(S, BakLabel);
  783.   GetSubViewPtr(S, BakSel);
  784.   GetSubViewPtr(S, MonoLabel);
  785.   GetSubViewPtr(S, MonoSel);
  786.   S.Read(Len, SizeOf(Byte));
  787.   S.Read(Pal[1], Len);
  788.   Pal[0] := Char(Len);
  789. end;
  790.  
  791. procedure TColorDialog.HandleEvent(var Event: TEvent);
  792. var
  793.   C: Byte;
  794. begin
  795.   TDialog.HandleEvent(Event);
  796.   if Event.What = evBroadcast then
  797.     if Event.Command = cmNewColorIndex then
  798.       Display^.SetColor(Byte(Pal[Event.InfoByte]));
  799. end;
  800.  
  801. procedure TColorDialog.Store(var S: TStream);
  802. begin
  803.   TDialog.Store(S);
  804.   PutSubViewPtr(S, Display);
  805.   PutSubViewPtr(S, Groups);
  806.   PutSubViewPtr(S, ForLabel);
  807.   PutSubViewPtr(S, ForSel);
  808.   PutSubViewPtr(S, BakLabel);
  809.   PutSubViewPtr(S, BakSel);
  810.   PutSubViewPtr(S, MonoLabel);
  811.   PutSubViewPtr(S, MonoSel);
  812.   S.Write(Pal, Length(Pal)+1);
  813. end;
  814.  
  815. function TColorDialog.DataSize: Word;
  816. begin
  817.   DataSize := SizeOf(TPalette);
  818. end;
  819.  
  820. procedure TColorDialog.GetData(var Rec);
  821. begin
  822.   String(Rec) := Pal;
  823. end;
  824.  
  825. procedure TColorDialog.SetData(var Rec);
  826. begin
  827.   Pal := String(Rec);
  828.   Display^.SetColor(Byte(Pal[1]));
  829.   Groups^.FocusItem(0);
  830.   if ShowMarkers then
  831.   begin
  832.     ForLabel^.Hide;
  833.     ForSel^.Hide;
  834.     BakLabel^.Hide;
  835.     BakSel^.Hide;
  836.     MonoLabel^.Show;
  837.     MonoSel^.Show;
  838.   end;
  839.   Groups^.Select;
  840. end;
  841.  
  842. { -- Color list building routines -- }
  843.  
  844. function ColorItem(Name: String; Index: Byte; Next: PColorItem): PColorItem;
  845. var
  846.   Item: PColorItem;
  847. begin
  848.   New(Item);
  849.   Item^.Name := NewStr(Name);
  850.   Item^.Index := Index;
  851.   Item^.Next := Next;
  852.   ColorItem := Item;
  853. end;
  854.  
  855. function ColorGroup(Name: String; Items: PColorItem; Next: PColorGroup):
  856.   PColorGroup;
  857. var
  858.   Group: PColorGroup;
  859. begin
  860.   New(Group);
  861.   Group^.Name := NewStr(Name);
  862.   Group^.Items := Items;
  863.   Group^.Next := Next;
  864.   ColorGroup := Group;
  865. end;
  866.  
  867. { ColorSel registration procedure }
  868.  
  869. procedure RegisterColorSel;
  870. begin
  871.   RegisterType(RColorSelector);
  872.   RegisterType(RMonoSelector);
  873.   RegisterType(RColorDisplay);
  874.   RegisterType(RColorGroupList);
  875.   RegisterType(RColorItemList);
  876.   RegisterType(RColorDialog);
  877. end;
  878.  
  879. end.
  880.