Finalize version.
[marekmrva_bc.git] / MemoryViewClass.pas
blob271fee64f810a16f826267550df6c31f003cfa0b
1 unit MemoryViewClass;
3 interface
5 uses
6 ConstantsClass, CustomViewClass, FunctionsClass, HardwareClass,
7 OperandEditClass, MemoryEditClass, PrefixTreeClass, ResourcesClass,
8 TypesClass,
9 Classes, Controls, Graphics, Grids, StdCtrls, Menus;
11 type
13 { TMemoryView }
15 TMemoryView = class(TCustomView)
16 private
17 pOperandEdit: TOperandEdit;
18 procedure pCustomKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); virtual;
19 procedure pCustomPopupAdd(Sender: TObject); virtual;
20 procedure pCustomPopupRemove(Sender: TObject); virtual;
21 procedure pOnSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); virtual;
22 procedure pOnOperand(Sender: TObject); virtual;
23 procedure pOnState(Sender: TObject); virtual;
24 public
25 constructor CreateMemoryView(AOwner: TComponent; Hw: THardware); virtual;
26 procedure ChangeMemory(Line: Integer); virtual;
27 procedure OperandAdd; virtual;
28 procedure OperandRemove(Line: Integer); virtual;
29 end;
31 implementation
33 // ************************************************************************** //
34 // * TMemoryView implementation * //
35 // ************************************************************************** //
37 procedure TMemoryView.pCustomKeyDown(Sender: TObject; var Key: Word;
38 Shift: TShiftState);
39 var
40 lselect: TGridCoord;
41 begin
42 lselect := Selection.TopLeft;
43 case Key of
44 KEY_RETURN, KEY_SPACE:
45 ChangeMemory(lselect.X);
46 KEY_INSERT:
47 OperandAdd;
48 KEY_DELETE:
49 OperandRemove(lselect.X);
50 end;
51 end;
53 procedure TMemoryView.pCustomPopupAdd(Sender: TObject);
54 var
55 lkey: Word;
56 begin
57 lkey := KEY_INSERT;
58 pCustomKeyDown(Sender, lkey, []);
59 end;
61 procedure TMemoryView.pCustomPopupRemove(Sender: TObject);
62 var
63 lkey: Word;
64 begin
65 lkey := KEY_DELETE;
66 pCustomKeyDown(Sender, lkey, []);
67 end;
69 procedure TMemoryView.pOnSelectCell(Sender: TObject; ACol, ARow: Integer;
70 var CanSelect: Boolean);
71 begin
72 if (ACol = 0) or not(ARow = 2) then CanSelect := False
73 else CanSelect := True;
74 end;
76 procedure TMemoryView.pOnOperand(Sender: TObject);
77 var
78 i: Integer;
79 ltrees: TPrefixTrees;
80 loperand: POperandRecord;
81 begin
82 for i := 1 to (ColCount - 1) do Objects[i, 0].Free;
83 ColCount := 1;
84 ltrees := Hardware.Operands.GetAllDescendants;
85 for i := 0 to (Length(ltrees) - 1) do
86 begin
87 loperand := POperandRecord(ltrees[i].Data);
88 if not(loperand^.Default = '') then
89 begin
90 ColCount := ColCount + 1;
91 Objects[ColCount - 1, 0] := TMemoryEdit.Create(Self, loperand);
92 end;
93 end;
94 pOnState(Self);
95 end;
97 procedure TMemoryView.pOnState(Sender: TObject);
98 var
99 i, j, lwidth: Integer;
100 begin
101 Cells[0, 0] := MEM_VIEW_NAME;
102 Cells[0, 1] := MEM_VIEW_TYPE;
103 Cells[0, 2] := MEM_VIEW_VALUE;
104 for i := 1 to (ColCount - 1) do
105 with TMemoryEdit(Objects[i, 0]) do
106 begin
107 Cells[i, 0] := Name;
108 for j := 0 to (Length(sOperandTypes) - 1) do
109 if (Operand.OperandType = sOperandTypes[j].OperandType) then
110 begin
111 Cells[i, 1] := sOperandTypes[j].Description;
112 Break;
113 end;
114 Cells[i, 2] := Value;
115 with Canvas do
116 begin
117 lwidth := MaxOf(TextWidth(Cells[i, 0]), TextWidth(Cells[i, 1]));
118 lwidth := MaxOf(lwidth, TextWidth(Cells[i, 2]));
119 ColWidths[i] := lwidth + TextWidth(' ');
120 end;
121 end;
122 end;
124 constructor TMemoryView.CreateMemoryView(AOwner: TComponent; Hw: THardware);
125 begin
126 inherited CreateView(AOwner, Hw);
127 ScrollBars := ssHorizontal;
128 RowCount := 3;
129 ColCount := 1;
130 pOnOperand(Self);
131 OnKeyDown := pCustomKeyDown;
132 OnOperand := pOnOperand;
133 OnSelectCell := pOnSelectCell;
134 OnState := pOnState;
135 pOperandEdit := TOperandEdit.CreateBox(AOwner);
136 PopupMenu := TPopupMenu.Create(Self);
137 with PopupMenu do
138 begin
139 Items.Add(TMenuItem.Create(PopupMenu));
140 with Items[Items.Count - 1] do
141 begin
142 Caption := MEM_VIEW_EDIT;
143 OnClick := OnDblClick;
144 Default := True;
145 end;
146 Items.Add(TMenuItem.Create(PopupMenu));
147 Items[Items.Count - 1].Caption := '-';
148 Items.Add(TMenuItem.Create(PopupMenu));
149 with Items[Items.Count - 1] do
150 begin
151 Caption := MEM_VIEW_ADD;
152 OnClick := pCustomPopupAdd;
153 end;
154 Items.Add(TMenuItem.Create(PopupMenu));
155 with Items[Items.Count - 1] do
156 begin
157 Caption := MEM_VIEW_REMOVE;
158 OnClick := pCustomPopupRemove;
159 end;
160 end;
161 pOnState(Self);
162 end;
164 procedure TMemoryView.ChangeMemory(Line: Integer);
165 begin
166 if (Line < 1) or not(Line < ColCount) then Exit;
167 with TMemoryEdit(Objects[Line, 0]) do
168 begin
169 Edit.Caption := MEM_VIEW_EDIT + ' ' + Name;
170 Change;
171 pOnState(Self);
172 end;
173 end;
175 procedure TMemoryView.OperandAdd;
176 begin
177 pOperandEdit.ShowBox(Hardware);
178 end;
180 procedure TMemoryView.OperandRemove(Line: Integer);
181 begin
182 if (Line < 1) or not(Line < ColCount) then Exit;
183 Hardware.OperandRemove(TMemoryEdit(Objects[Line, 0]).Name);
184 end;
186 end.