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 >
Wrap
Pascal/Delphi Source File
|
1991-06-11
|
20KB
|
880 lines
{*******************************************************}
{ }
{ Turbo Pascal Version 6.0 }
{ Turbo Vision Unit }
{ }
{ Copyright (c) 1990 Borland International }
{ }
{*******************************************************}
unit ColorSel;
{$F+,O+,X+,D-}
interface
uses Objects, Drivers, Views, Dialogs;
const
cmColorForegroundChanged = 71;
cmColorBackgroundChanged = 72;
cmColorSet = 73;
cmNewColorItem = 74;
cmNewColorIndex = 75;
type
{ TColorItem }
PColorItem = ^TColorItem;
TColorItem = record
Name: PString;
Index: Byte;
Next: PColorItem;
end;
{ TColorGroup }
PColorGroup = ^TColorGroup;
TColorGroup = record
Name: PString;
Items: PColorItem;
Next: PColorGroup;
end;
{ TColorSelector }
TColorSel = (csBackground, csForeground);
PColorSelector = ^TColorSelector;
TColorSelector = object(TView)
Color: Byte;
SelType: TColorSel;
constructor Init(var Bounds: TRect; ASelType: TColorSel);
constructor Load(var S: TStream);
procedure Draw; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
procedure Store(var S: TStream);
end;
{ TMonoSelector }
PMonoSelector = ^TMonoSelector;
TMonoSelector = object(TCluster)
constructor Init(var Bounds: TRect);
procedure Draw; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
function Mark(Item: Integer): Boolean; virtual;
procedure NewColor;
procedure Press(Item: Integer); virtual;
procedure MovedTo(Item: Integer); virtual;
end;
{ TColorDisplay }
PColorDisplay = ^TColorDisplay;
TColorDisplay = object(TView)
Color: ^Byte;
Text: PString;
constructor Init(var Bounds: TRect; AText: PString);
constructor Load(var S: TStream);
destructor Done; virtual;
procedure Draw; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
procedure SetColor(var AColor: Byte); virtual;
procedure Store(var S: TStream);
end;
{ TColorGroupList }
PColorGroupList = ^TColorGroupList;
TColorGroupList = object(TListViewer)
Groups: PColorGroup;
constructor Init(var Bounds: TRect; AScrollBar: PScrollBar;
AGroups: PColorGroup);
constructor Load(var S: TStream);
destructor Done; virtual;
procedure FocusItem(Item: Integer); virtual;
function GetText(Item: Integer; MaxLen: Integer): String; virtual;
procedure Store(var S: TStream);
end;
{ TColorItemList }
PColorItemList = ^TColorItemList;
TColorItemList = object(TListViewer)
Items: PColorItem;
constructor Init(var Bounds: TRect; AScrollBar: PScrollBar;
AItems: PColorItem);
procedure FocusItem(Item: Integer); virtual;
function GetText(Item: Integer; MaxLen: Integer): String; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
end;
{ TColorDialog }
PColorDialog = ^TColorDialog;
TColorDialog = object(TDialog)
Display: PColorDisplay;
Groups: PColorGroupList;
ForLabel: PLabel;
ForSel: PColorSelector;
BakLabel: PLabel;
BakSel: PColorSelector;
MonoLabel: PLabel;
MonoSel: PMonoSelector;
Pal: TPalette;
constructor Init(APalette: TPalette; AGroups: PColorGroup);
constructor Load(var S: TStream);
function DataSize: Word; virtual;
procedure GetData(var Rec); virtual;
procedure HandleEvent(var Event: TEvent); virtual;
procedure SetData(var Rec); virtual;
procedure Store(var S: TStream);
end;
{ Color list building routines }
function ColorItem(Name: String; Index: Byte; Next: PColorItem): PColorItem;
function ColorGroup(Name: String; Items: PColorItem; Next: PColorGroup):
PColorGroup;
{ ColorSel registration procedure }
procedure RegisterColorSel;
{ Stream registration records }
const
RColorSelector: TStreamRec = (
ObjType: 21;
VmtLink: Ofs(TypeOf(TColorSelector)^);
Load: @TColorSelector.Load;
Store: @TColorSelector.Store
);
RMonoSelector: TStreamRec = (
ObjType: 22;
VmtLink: Ofs(TypeOf(TMonoSelector)^);
Load: @TMonoSelector.Load;
Store: @TMonoSelector.Store
);
RColorDisplay: TStreamRec = (
ObjType: 23;
VmtLink: Ofs(TypeOf(TColorDisplay)^);
Load: @TColorDisplay.Load;
Store: @TColorDisplay.Store
);
RColorGroupList: TStreamRec = (
ObjType: 24;
VmtLink: Ofs(TypeOf(TColorGroupList)^);
Load: @TColorGroupList.Load;
Store: @TColorGroupList.Store
);
RColorItemList: TStreamRec = (
ObjType: 25;
VmtLink: Ofs(TypeOf(TColorItemList)^);
Load: @TColorItemList.Load;
Store: @TColorItemList.Store
);
RColorDialog: TStreamRec = (
ObjType: 26;
VmtLink: Ofs(TypeOf(TColorDialog)^);
Load: @TColorDialog.Load;
Store: @TColorDialog.Store
);
implementation
{ TColorSelector }
constructor TColorSelector.Init(var Bounds: TRect; ASelType: TColorSel);
begin
TView.Init(Bounds);
Options := Options or (ofSelectable + ofFirstClick + ofFramed);
EventMask := EventMask or evBroadcast;
SelType := ASelType;
Color := 0;
end;
constructor TColorSelector.Load(var S: TStream);
begin
TView.Load(S);
S.Read(Color, SizeOf(Byte) + SizeOf(TColorSel));
end;
procedure TColorSelector.Draw;
var
B: TDrawBuffer;
C, I, J: Integer;
begin
MoveChar(B, ' ', $70, Size.X);
for I := 0 to Size.Y do
begin
if I < 4 then
for J := 0 to 3 do
begin
C := I * 4 + J;
MoveChar(B[ J*3 ], #219, C, 3);
if C = Byte(Color) then
begin
WordRec(B[ J*3+1 ]).Lo := 8;
if C = 0 then WordRec(B[ J*3+1 ]).Hi := $70;
end;
end;
WriteLine(0, I, Size.X, 1, B);
end;
end;
procedure TColorSelector.HandleEvent(var Event: TEvent);
const
Width = 4;
var
MaxCol: Byte;
Mouse: TPoint;
OldColor: Byte;
procedure ColorChanged;
var
Msg: Integer;
begin
if SelType = csForeground then
Msg := cmColorForegroundChanged else
Msg := cmColorBackgroundChanged;
Message(Owner, evBroadcast, Msg, Pointer(Color));
end;
begin
TView.HandleEvent(Event);
case Event.What of
evMouseDown:
begin
OldColor := Color;
repeat
if MouseInView(Event.Where) then
begin
MakeLocal(Event.Where, Mouse);
Color := Mouse.Y * 4 + Mouse.X div 3;
end
else
Color := OldColor;
ColorChanged;
DrawView;
until not MouseEvent(Event, evMouseMove);
end;
evKeyDown:
begin
if SelType = csBackground then
MaxCol := 7 else
MaxCol := 15;
case CtrlToArrow(Event.KeyCode) of
kbLeft:
if Color > 0 then
Dec(Color) else
Color := MaxCol;
kbRight:
if Color < MaxCol then
Inc(Color) else
Color := 0;
kbUp:
if Color > Width - 1 then
Dec(Color, Width) else
if Color = 0 then
Color := MaxCol else
Inc(Color, MaxCol - Width);
kbDown:
if Color < MaxCol - (Width - 1) then
Inc(Color, Width) else
if Color = MaxCol then
Color := 0 else
Dec(Color, MaxCol - Width);
else
Exit;
end;
end;
evBroadcast:
if Event.Command = cmColorSet then
begin
if SelType = csBackground then
Color := Event.InfoByte shr 4 else
Color := Event.InfoByte and $0F;
DrawView;
Exit;
end else Exit;
else
Exit;
end;
DrawView;
ColorChanged;
ClearEvent(Event);
end;
procedure TColorSelector.Store(var S: TStream);
begin
TView.Store(S);
S.Write(Color, SizeOf(Byte) + SizeOf(TColorSel));
end;
{ TMonoSelector }
const
MonoColors: array[0..4] of Byte = ($07, $0F, $01, $70, $09);
constructor TMonoSelector.Init(var Bounds: TRect);
begin
TCluster.Init(Bounds,
NewSItem('Normal',
NewSItem('Highlight',
NewSItem('Underline',
NewSItem('Inverse', nil)))));
EventMask := EventMask or evBroadcast;
end;
procedure TMonoSelector.Draw;
const
Button = ' ( ) ';
begin
DrawBox(Button, #7);
end;
procedure TMonoSelector.HandleEvent(var Event: TEvent);
begin
TCluster.HandleEvent(Event);
if (Event.What = evBroadcast) and (Event.Command = cmColorSet) then
begin
Value := Event.InfoByte;
DrawView;
end;
end;
function TMonoSelector.Mark(Item: Integer): Boolean;
begin
Mark := MonoColors[Item] = Value;
end;
procedure TMonoSelector.NewColor;
begin
Message(Owner, evBroadcast, cmColorForegroundChanged,
Pointer(Value and $0F));
Message(Owner, evBroadcast, cmColorBackgroundChanged,
Pointer((Value shr 4) and $0F));
end;
procedure TMonoSelector.Press(Item: Integer);
begin
Value := MonoColors[Item];
NewColor;
end;
procedure TMonoSelector.MovedTo(Item: Integer);
begin
Value := MonoColors[Item];
NewColor;
end;
{ TColorDisplay }
constructor TColorDisplay.Init(var Bounds: TRect; AText: PString);
begin
TView.Init(Bounds);
EventMask := EventMask or evBroadcast;
Text := AText;
Color := nil;
end;
constructor TColorDisplay.Load(var S: TStream);
begin
TView.Load(S);
Text := S.ReadStr;
end;
destructor TColorDisplay.Done;
begin
DisposeStr(Text);
TView.Done;
end;
procedure TColorDisplay.Draw;
var
B: TDrawBuffer;
I: Integer;
C: Byte;
begin
C := Color^;
if C = 0 then C := ErrorAttr;
for I := 0 to Size.X div Length(Text^) do
MoveStr(B[I*Length(Text^)], Text^, C);
WriteLine(0, 0, Size.X, Size.Y, B);
end;
procedure TColorDisplay.HandleEvent(var Event: TEvent);
begin
TView.HandleEvent(Event);
case Event.What of
evBroadcast:
case Event.Command of
cmColorBackgroundChanged:
begin
Color^ := (Color^ and $0F) or (Event.InfoByte shl 4 and $F0);
DrawView;
end;
cmColorForegroundChanged:
begin
Color^ := (Color^ and $F0) or (Event.InfoByte and $0F);
DrawView;
end;
end;
end;
end;
procedure TColorDisplay.SetColor(var AColor: Byte);
begin
Color := @AColor;
Message(Owner, evBroadcast, cmColorSet, Pointer(Color^));
DrawView;
end;
procedure TColorDisplay.Store(var S: TStream);
begin
TView.Store(S);
S.WriteStr(Text);
end;
{ TColorGroupList }
constructor TColorGroupList.Init(var Bounds: TRect; AScrollBar: PScrollBar;
AGroups: PColorGroup);
var
I: Integer;
begin
TListViewer.Init(Bounds, 1, nil, AScrollBar);
Groups := AGroups;
I := 0;
while AGroups <> nil do
begin
AGroups := AGroups^.Next;
Inc(I);
end;
SetRange(I);
end;
constructor TColorGroupList.Load(var S: TStream);
function ReadItems: PColorItem;
var
Itms: PColorItem;
CurItm: ^PColorItem;
Count, I: Integer;
begin
S.Read(Count, SizeOf(Integer));
Itms := nil;
CurItm := @Itms;
for I := 1 to Count do
begin
New(CurItm^);
with CurItm^^ do
begin
Name := S.ReadStr;
S.Read(Index, SizeOf(Byte));
end;
CurItm := @CurItm^^.Next;
end;
CurItm^ := nil;
ReadItems := Itms;
end;
function ReadGroups: PColorGroup;
var
Grps: PColorGroup;
CurGrp: ^PColorGroup;
Count, I: Integer;
begin
S.Read(Count, SizeOf(Integer));
Grps := nil;
CurGrp := @Grps;
for I := 1 to Count do
begin
New(CurGrp^);
with CurGrp^^ do
begin
Name := S.ReadStr;
Items := ReadItems;
end;
CurGrp := @CurGrp^^.Next;
end;
CurGrp^ := nil;
ReadGroups := Grps;
end;
begin
TListViewer.Load(S);
Groups := ReadGroups;
end;
destructor TColorGroupList.Done;
procedure FreeItems(CurITem: PColorItem);
var
P: PColorItem;
begin
while CurItem <> nil do
begin
P := CurItem;
DisposeStr(CurItem^.Name);
CurItem := CurItem^.Next;
Dispose(P);
end;
end;
procedure FreeGroups(CurGroup: PColorGroup);
var
P: PColorGroup;
begin
while CurGroup <> nil do
begin
P := CurGroup;
FreeItems(CurGroup^.Items);
DisposeStr(CurGroup^.Name);
CurGroup := CurGroup^.Next;
Dispose(P);
end
end;
begin
TListViewer.Done;
FreeGroups(Groups);
end;
procedure TColorGroupList.FocusItem(Item: Integer);
var
CurGroup: PColorGroup;
begin
TListViewer.FocusItem(Item);
CurGroup := Groups;
while Item > 0 do
begin
CurGroup := CurGroup^.Next;
Dec(Item);
end;
Message(Owner, evBroadcast, cmNewColorItem, CurGroup^.Items);
end;
function TColorGroupList.GetText(Item: Integer; MaxLen: Integer): String;
var
CurGroup: PColorGroup;
I: Integer;
begin
CurGroup := Groups;
while Item > 0 do
begin
CurGroup := CurGroup^.Next;
Dec(Item);
end;
GetText := CurGroup^.Name^;
end;
procedure TColorGroupList.Store(var S: TStream);
procedure WriteItems(Items: PColorItem);
var
CurItm: PColorItem;
Count: Integer;
begin
Count := 0;
CurItm := Items;
while CurItm <> nil do
begin
CurItm := CurItm^.Next;
Inc(Count);
end;
S.Write(Count, SizeOf(Integer));
CurItm := Items;
while CurItm <> nil do
begin
with CurItm^ do
begin
S.WriteStr(Name);
S.Write(Index, SizeOf(Byte));
end;
CurItm := CurItm^.Next;
end;
end;
procedure WriteGroups(Groups: PColorGroup);
var
CurGrp: PColorGroup;
Count: Integer;
begin
Count := 0;
CurGrp := Groups;
while CurGrp <> nil do
begin
CurGrp := CurGrp^.Next;
Inc(Count);
end;
S.Write(Count, SizeOf(Integer));
CurGrp := Groups;
while CurGrp <> nil do
begin
with CurGrp^ do
begin
S.WriteStr(Name);
WriteItems(Items);
end;
CurGrp := CurGrp^.Next;
end;
end;
begin
TListViewer.Store(S);
WriteGroups(Groups);
end;
{ TColorItemList }
constructor TColorItemList.Init(var Bounds: TRect; AScrollBar: PScrollBar;
AItems: PColorItem);
var
I: Integer;
begin
TListViewer.Init(Bounds, 1, nil, AScrollBar);
EventMask := EventMask or evBroadcast;
Items := AItems;
I := 0;
while AItems <> nil do
begin
AItems := AItems^.Next;
Inc(I);
end;
SetRange(I);
end;
procedure TColorItemList.FocusItem(Item: Integer);
var
CurItem: PColorItem;
begin
TListViewer.FocusItem(Item);
CurItem := Items;
while Item > 0 do
begin
CurItem := CurItem^.Next;
Dec(Item);
end;
Message(Owner, evBroadcast, cmNewColorIndex, Pointer(CurItem^.Index));
end;
function TColorItemList.GetText(Item: Integer; MaxLen: Integer): String;
var
CurItem: PColorItem;
begin
CurItem := Items;
while Item > 0 do
begin
CurItem := CurItem^.Next;
Dec(Item);
end;
GetText := CurItem^.Name^;
end;
procedure TColorItemList.HandleEvent(var Event: TEvent);
var
CurItem: PColorItem;
I: Integer;
begin
TListViewer.HandleEvent(Event);
case Event.What of
evBroadcast:
if Event.Command = cmNewColorItem then
begin
Items := Event.InfoPtr;
CurItem := Items;
I := 0;
while CurItem <> nil do
begin
CurItem := CurItem^.Next;
Inc(I);
end;
SetRange(I);
FocusItem(0);
DrawView;
end;
end;
end;
{ TColorDialog }
constructor TColorDialog.Init(APalette: TPalette; AGroups: PColorGroup);
var
R: TRect;
P: PView;
begin
R.Assign(0, 0, 61, 18);
TDialog.Init(R, 'Colors');
Options := Options or ofCentered;
Pal := APalette;
R.Assign(18, 3, 19, 14);
P := New(PScrollBar, Init(R));
Insert(P);
R.Assign(3, 3, 18, 14);
Groups := New(PColorGroupList, Init(R, PScrollBar(P), AGroups));
Insert(Groups);
R.Assign(2, 2, 8, 3);
Insert(New(PLabel, Init(R, '~G~roup', Groups)));
R.Assign(41, 3, 42, 14);
P := New(PScrollBar, Init(R));
Insert(P);
R.Assign(21, 3, 41, 14);
P := New(PColorItemList, Init(R, PScrollBar(P), AGroups^.Items));
Insert(P);
R.Assign(20, 2, 25, 3);
Insert(New(PLabel, Init(R, '~I~tem', P)));
R.Assign(45, 3, 57, 7);
ForSel := New(PColorSelector, Init(R, csForeground));
Insert(ForSel);
Dec(R.A.Y); R.B.Y := R.A.Y+1;
ForLabel := New(PLabel, Init(R, '~F~oreground', ForSel));
Insert(ForLabel);
Inc(R.A.Y, 7); Inc(R.B.Y,8);
BakSel := New(PColorSelector, Init(R, csBackground));
Insert(BakSel);
Dec(R.A.Y); R.B.Y := R.A.Y+1;
BakLabel := New(PLabel, Init(R, '~B~ackground', BakSel));
Insert(BakLabel);
Dec(R.A.X); Inc(R.B.X); Inc(R.A.Y, 4); Inc(R.B.Y, 5);
Display := New(PColorDisplay, Init(R, NewStr('Text ')));
Insert(Display);
R.Assign(44, 3, 59, 8);
MonoSel := New(PMonoSelector, Init(R));
MonoSel^.Hide;
Insert(MonoSel);
R.Assign(43, 2, 49, 3);
MonoLabel := New(PLabel, Init(R, '~C~olor', MonoSel));
MonoLabel^.Hide;
Insert(MonoLabel);
if (AGroups <> nil) and (AGroups^.Items <> nil) then
Display^.SetColor(Byte(Pal[AGroups^.Items^.Index]));
R.Assign(36, 15, 46, 17);
P := New(PButton, Init(R, 'O~K~', cmOk, bfDefault));
Insert(P);
R.Assign(48, 15, 58, 17);
P := New(PButton, Init(R, 'Cancel', cmCancel, bfNormal));
Insert(P);
SelectNext(False);
end;
constructor TColorDialog.Load(var S: TStream);
var
Len: Byte;
begin
TDialog.Load(S);
GetSubViewPtr(S, Display);
GetSubViewPtr(S, Groups);
GetSubViewPtr(S, ForLabel);
GetSubViewPtr(S, ForSel);
GetSubViewPtr(S, BakLabel);
GetSubViewPtr(S, BakSel);
GetSubViewPtr(S, MonoLabel);
GetSubViewPtr(S, MonoSel);
S.Read(Len, SizeOf(Byte));
S.Read(Pal[1], Len);
Pal[0] := Char(Len);
end;
procedure TColorDialog.HandleEvent(var Event: TEvent);
var
C: Byte;
begin
TDialog.HandleEvent(Event);
if Event.What = evBroadcast then
if Event.Command = cmNewColorIndex then
Display^.SetColor(Byte(Pal[Event.InfoByte]));
end;
procedure TColorDialog.Store(var S: TStream);
begin
TDialog.Store(S);
PutSubViewPtr(S, Display);
PutSubViewPtr(S, Groups);
PutSubViewPtr(S, ForLabel);
PutSubViewPtr(S, ForSel);
PutSubViewPtr(S, BakLabel);
PutSubViewPtr(S, BakSel);
PutSubViewPtr(S, MonoLabel);
PutSubViewPtr(S, MonoSel);
S.Write(Pal, Length(Pal)+1);
end;
function TColorDialog.DataSize: Word;
begin
DataSize := SizeOf(TPalette);
end;
procedure TColorDialog.GetData(var Rec);
begin
String(Rec) := Pal;
end;
procedure TColorDialog.SetData(var Rec);
begin
Pal := String(Rec);
Display^.SetColor(Byte(Pal[1]));
Groups^.FocusItem(0);
if ShowMarkers then
begin
ForLabel^.Hide;
ForSel^.Hide;
BakLabel^.Hide;
BakSel^.Hide;
MonoLabel^.Show;
MonoSel^.Show;
end;
Groups^.Select;
end;
{ -- Color list building routines -- }
function ColorItem(Name: String; Index: Byte; Next: PColorItem): PColorItem;
var
Item: PColorItem;
begin
New(Item);
Item^.Name := NewStr(Name);
Item^.Index := Index;
Item^.Next := Next;
ColorItem := Item;
end;
function ColorGroup(Name: String; Items: PColorItem; Next: PColorGroup):
PColorGroup;
var
Group: PColorGroup;
begin
New(Group);
Group^.Name := NewStr(Name);
Group^.Items := Items;
Group^.Next := Next;
ColorGroup := Group;
end;
{ ColorSel registration procedure }
procedure RegisterColorSel;
begin
RegisterType(RColorSelector);
RegisterType(RMonoSelector);
RegisterType(RColorDisplay);
RegisterType(RColorGroupList);
RegisterType(RColorItemList);
RegisterType(RColorDialog);
end;
end.