[Back to OOP SWAG index] [Back to Main SWAG index] [Original]
Program ColorTV;
uses Objects, Drivers, Views, Menus, Dialogs, App, StdInput;
const
cmButton = 101;
cmNewWin = 102;
cmNewDlg = 103;
WinCount : integer = 0; { number of current windows }
type
PApp = ^TApp;
TApp = object(TApplication)
procedure InitMenuBar; virtual;
procedure InitStatusLine; virtual;
procedure HandleEvent(var Event : TEvent); virtual;
procedure NewWindow;
procedure NewDialog;
function GetPalette : PPalette; virtual;
end;
PWin = ^TWin;
TWin = object(TWindow)
constructor Init(Bounds: TRect; WinTitle: String;
WindowNo: Word);
function GetPalette : PPalette; virtual;
end;
PInLine = ^TInLine;
TInLine = object(TInputReal)
function GetPalette : PPalette; virtual;
end;
PDlg = ^TDlg;
TDlg = object(TDialog)
function GetPalette : PPalette; virtual;
end;
{ TWin }
constructor TWin.Init(Bounds: TRect; WinTitle: String;
WindowNo: Word);
var
S : string[3];
R : TRect;
MyInputLine : PInLine;
begin
Str(WindowNo, S);
TWindow.Init(Bounds, WinTitle + ' ' + S, wnNoNumber);
GetClipRect(Bounds);
Bounds.Grow(-1,-1);
{ insert input string }
R.Assign(8, 2, 20, 3);
Insert(New(PInLine, Init(R, 12)));
{ insert button }
R.Assign(8, 5, 20, 7);
Insert(New(PButton, Init(R, '~O~k', cmButton, bfDefault)));
{ move to the top }
SelectNext(false);
end;
function TWin.GetPalette : PPalette;
{ add color indexes to TWin to allow button to be displayed in }
{ the window. notice that TButton's palette starts mapping }
{ from 10 - 15, and TWindow's palette runs from 1 - 8, there- }
{ fore add the indexes for the button on the end of TWin }
{ palettes. }
const
CWin = CBlueWindow + #0#41#42#43#44#45#64;
PWin : string[Length(CWin)] = CWin;
begin
GetPalette := @ PWin;
end;
{ TApp }
procedure TApp.InitMenuBar;
var
Menu: TRect;
begin
GetExtent(Menu);
Menu.B.Y := Menu.A.Y + 1;
MenuBar := New(PMenuBar, Init(Menu, NewMenu(
NewSubMenu('~W~indow', hcNoContext, NewMenu(
NewItem('~W~indow', '', kbF4, cmNewWin, hcNoContext,
NewItem('~D~ialog', '', kbF5, cmNewDlg, hcNoContext,
NewLine(
NewItem('~C~lose', 'Alt-F3', kbAltF3, cmClose, hcNoContext,
NewItem('E~x~it', 'Alt-X', kbAltX, cmQuit, hcNoContext,
nil)))))),
nil))));
end;
procedure TApp.InitStatusLine;
var
Line: TRect;
begin
GetExtent(Line);
Line.A.Y := Line.B.Y-1;
StatusLine := New(PStatusLine, Init(Line,
NewStatusDef(0, $FFFF,
NewStatusKey('', kbF10, cmMenu,
NewStatusKey('~Alt-X~ Exit', kbAltX, cmQuit,
NewStatusKey('~F4~ Window', kbF4, cmNewWin,
NewStatusKey('~F5~ Dialog', kbF5, cmNewDlg,
NewStatusKey('~Alt-F3~ Close', kbAltF3, cmClose,
nil))))),
nil)));
end;
procedure TApp.NewWindow;
var
Window : PWin;
Box : TRect;
begin
Inc(WinCount);
Box.Assign(0, 0, 30, 8);
Box.Move(Random(34), Random(11));
Window := New(PWin, Init(Box, 'Test Window', WinCount));
DeskTop^.Insert(Window);
end;
procedure TApp.HandleEvent(var Event: TEvent);
begin
TApplication.HandleEvent(Event);
if Event.What = evCommand then
begin
case Event.Command of
cmNewWin : NewWindow;
cmNewDlg : NewDialog;
cmButton : ;
else
Exit;
end;
ClearEvent(Event);
end;
end;
procedure TApp.NewDialog;
var
Dialog : PDlg;
R : TRect;
C : Word;
begin
R.Assign(25, 5, 55, 13);
Dialog := New(PDlg, Init(R, 'Test Dialog'));
with Dialog^ do
begin
{ message }
R.Assign(9, 2, 27, 3);
Insert(New(PStaticText, Init(R, 'Error Message')));
{ insert button }
R.Assign(10, 5, 20, 7);
Insert(New(PButton, Init(R, '~O~k', cmOK, bfDefault)));
end;
C := DeskTop^.ExecView(Dialog);
Dispose(Dialog, Done);
end;
function TApp.GetPalette : PPalette;
{ this is the palette that all other views are mapped to. }
{ the first 64 (0..63) are defined, any other colors are }
{ added from 64 on. the #$10 is for TWin for the back- }
{ ground color for the button. from $47 on maps the new }
{ color for TDlg and its views. }
const
CApp = CColor + #$10#$47#$4E#$40#$4F#$30#$3E;
PApp : string[Length(CApp)] = CApp;
begin
GetPalette := @ PApp;
end;
{ TInLine }
function TInLine.GetPalette : PPalette;
{ color indexes into TWin color palette }
const
CInLine = #4#4#3#3;
PInLine : string[Length(CInLine)] = CInLine;
begin
GetPalette := @ PInLine;
end;
{ TDlg }
function TDlg.GetPalette : PPalette;
{ when replacing colors for a view must replace the entire }
{ string. notice that any color > 63 maps to a user defined }
{ color from TApp's palette (65 = $47, 66 = $4E, etc.). }
{ i.e. }
{ index 2, the active frame maps to 65 which is color $47 }
{ (or grey on red). }
{ index 3, the frame icon maps to 66->$4E (yellow on red). }
{ index 46, the button shadow maps to 67->$40 (black on rec).}
{ index 37, the statictext maps to 68->$47 (white on red). }
{ (no reason 46 is before 38). }
{ index 41-43, button stuff 69->$30 (cyan on black). }
{ index 45, button shortcut 70->$3E (cyan on yellow). }
const
CDlg = #32#65#66#35#36#68#38#39#40#69#69#69#44#70#67#47#48#49 +
#50#51#52#53#54#55#56#57#58#59#60#61#62#63;
PDlg : string[Length(CDlg)] = CDlg;
begin
GetPalette := @ PDlg;
end;
var
MyApp : TApp;
{ main }
begin
MyApp.Init;
MyApp.Run;
MyApp.Done;
end.
[Back to OOP SWAG index] [Back to Main SWAG index] [Original]