Statistics
| Branch: | Tag: | Revision:

root / Client / UfrmLargeScaleCommand.pas @ 0:95bd93c28625

History | View | Annotate | Download (19.8 kB)

1
(*
2
 * CDDL HEADER START
3
 *
4
 * The contents of this file are subject to the terms of the
5
 * Common Development and Distribution License, Version 1.0 only
6
 * (the "License").  You may not use this file except in compliance
7
 * with the License.
8
 *
9
 * You can obtain a copy of the license at
10
 * http://www.opensource.org/licenses/cddl1.php.
11
 * See the License for the specific language governing permissions
12
 * and limitations under the License.
13
 *
14
 * When distributing Covered Code, include this CDDL HEADER in each
15
 * file and include the License file at
16
 * http://www.opensource.org/licenses/cddl1.php.  If applicable,
17
 * add the following below this CDDL HEADER, with the fields enclosed
18
 * by brackets "[]" replaced with your own identifying * information:
19
 *      Portions Copyright [yyyy] [name of copyright owner]
20
 *
21
 * CDDL HEADER END
22
 *
23
 *
24
 *      Portions Copyright 2007 Andreas Schneider
25
 *)
26
unit UfrmLargeScaleCommand;
27
28
{$mode objfpc}{$H+}
29
30
interface
31
32
uses
33
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, CheckLst,
34
  VirtualTrees, ExtCtrls, ImagingComponents, StdCtrls, Buttons, Spin, LCLIntf,
35
  math, UPlatformTypes, UEnhancedMemoryStream;
36
37
type
38
39
  TAreaMoveType = (amLeft, amTop, amRight, amBottom);
40
  TAreaMove = set of TAreaMoveType;
41
42
  { TfrmLargeScaleCommand }
43
44
  TfrmLargeScaleCommand = class(TForm)
45
    btnClearTerrain: TSpeedButton;
46
    btnClearIStaticsTiles: TSpeedButton;
47
    btnClearDStaticsTiles: TSpeedButton;
48
    btnDeleteTerrain: TSpeedButton;
49
    btnDeleteIStaticsTiles: TSpeedButton;
50
    btnDeleteDStaticsTiles: TSpeedButton;
51
    btnExecute: TButton;
52
    btnClose: TButton;
53
    cbCMEraseTarget: TCheckBox;
54
    gbDrawTerrainTiles: TGroupBox;
55
    gbDeleteStaticsTiles: TGroupBox;
56
    gbInserStaticsTiles: TGroupBox;
57
    gbStaticsProbability: TGroupBox;
58
    gbStaticsPlacement: TGroupBox;
59
    GroupBox1: TGroupBox;
60
    gbCMOffset: TGroupBox;
61
    Label1: TLabel;
62
    Label10: TLabel;
63
    Label2: TLabel;
64
    Label3: TLabel;
65
    Label4: TLabel;
66
    Label5: TLabel;
67
    Label6: TLabel;
68
    Label7: TLabel;
69
    Label8: TLabel;
70
    Label9: TLabel;
71
    lblDrawTerrainTilesDesc: TLabel;
72
    lblDeleteStaticsTilesDesc: TLabel;
73
    lblInsertStaticsTiles: TLabel;
74
    lblX: TLabel;
75
    lblY: TLabel;
76
    nbActions: TNotebook;
77
    pgCopyMove: TPage;
78
    pgDeleteStatics: TPage;
79
    pgInsertStatics: TPage;
80
    pgModifyAltitude: TPage;
81
    pnlControls: TPanel;
82
    pnlDrawTerrainTilesControls: TPanel;
83
    pnlAreaControls: TPanel;
84
    pnlDrawTerrainTilesControls1: TPanel;
85
    pnlDrawTerrainTilesControls2: TPanel;
86
    pnlLeft: TPanel;
87
    pbArea: TPaintBox;
88
    pgArea: TPage;
89
    pgDrawTerrain: TPage;
90
    rgCMAction: TRadioGroup;
91
    rbPlaceStaticsOnTerrain: TRadioButton;
92
    rbPlaceStaticsOnTop: TRadioButton;
93
    rbPlaceStaticsOnZ: TRadioButton;
94
    rbSetTerrainAltitude: TRadioButton;
95
    rbRelativeAltitudeChange: TRadioButton;
96
    sbArea: TScrollBox;
97
    btnAddArea: TSpeedButton;
98
    btnDeleteArea: TSpeedButton;
99
    seDeleteStaticsZ1: TSpinEdit;
100
    seDeleteStaticsZ2: TSpinEdit;
101
    seX1: TSpinEdit;
102
    seX2: TSpinEdit;
103
    seY1: TSpinEdit;
104
    seY2: TSpinEdit;
105
    btnClearArea: TSpeedButton;
106
    seTerrainAltitude1: TSpinEdit;
107
    seTerrainAltitude2: TSpinEdit;
108
    seRelativeAltitude: TSpinEdit;
109
    seStaticsProbability: TSpinEdit;
110
    seInsertStaticsZ: TSpinEdit;
111
    seCMOffsetX: TSpinEdit;
112
    seCMOffsetY: TSpinEdit;
113
    vdtTerrainTiles: TVirtualDrawTree;
114
    vdtInsertStaticsTiles: TVirtualDrawTree;
115
    vdtDeleteStaticsTiles: TVirtualDrawTree;
116
    vstArea: TVirtualStringTree;
117
    vstActions: TVirtualStringTree;
118
    procedure FormShow(Sender: TObject);
119
    procedure btnAddAreaClick(Sender: TObject);
120
    procedure btnClearDStaticsTilesClick(Sender: TObject);
121
    procedure btnClearIStaticsTilesClick(Sender: TObject);
122
    procedure btnClearTerrainClick(Sender: TObject);
123
    procedure btnCloseClick(Sender: TObject);
124
    procedure btnDeleteDStaticsTilesClick(Sender: TObject);
125
    procedure btnDeleteIStaticsTilesClick(Sender: TObject);
126
    procedure btnDeleteTerrainClick(Sender: TObject);
127
    procedure btnExecuteClick(Sender: TObject);
128
    procedure FormCreate(Sender: TObject);
129
    procedure FormDestroy(Sender: TObject);
130
    procedure pbAreaMouseDown(Sender: TObject; Button: TMouseButton;
131
      Shift: TShiftState; X, Y: Integer);
132
    procedure pbAreaMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer
133
      );
134
    procedure pbAreaPaint(Sender: TObject);
135
    procedure btnDeleteAreaClick(Sender: TObject);
136
    procedure btnClearAreaClick(Sender: TObject);
137
    procedure seX1Change(Sender: TObject);
138
    procedure vdtTerrainTilesDragDrop(Sender: TBaseVirtualTree; Source: TObject;
139
      DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState;
140
      Pt: TPoint; var Effect: Integer; Mode: TDropMode);
141
    procedure vdtTerrainTilesDragOver(Sender: TBaseVirtualTree; Source: TObject;
142
      Shift: TShiftState; State: TDragState; Pt: TPoint; Mode: TDropMode;
143
      var Effect: Integer; var Accept: Boolean);
144
    procedure vdtTerrainTilesDrawNode(Sender: TBaseVirtualTree;
145
      const PaintInfo: TVTPaintInfo);
146
    procedure vstActionsChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
147
    procedure vstActionsGetText(Sender: TBaseVirtualTree;
148
      Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
149
      var CellText: WideString);
150
    procedure vstActionsPaintText(Sender: TBaseVirtualTree;
151
      const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
152
      TextType: TVSTTextType);
153
    procedure vstAreaChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
154
    procedure vstAreaGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
155
      Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
156
  protected
157
    FLastX: Integer;
158
    FLastY: Integer;
159
    FAreaMove: TAreaMove;
160
    procedure AddNode(AActionID: Integer; ACaption: string);
161
    function FindNode(AActionID: Integer): PVirtualNode;
162
    procedure SerializeTiles(ATileList: TVirtualDrawTree;
163
      AStream: TEnhancedMemoryStream);
164
  public
165
    { public declarations }
166
  end; 
167
168
var
169
  frmLargeScaleCommand: TfrmLargeScaleCommand;
170
171
implementation
172
173
uses
174
  UGameResources, UfrmRadar, UfrmMain, UdmNetwork, UPacket, UPackets,
175
  UGUIPlatformUtils;
176
177
type
178
  PNodeInfo = ^TNodeInfo;
179
  TNodeInfo = record
180
    ActionID: Integer;
181
    Caption: string;
182
  end;
183
  PTileInfo = ^TTileInfo;
184
  TTileInfo = record
185
    ID: Word;
186
  end;
187
188
{ TfrmLargeScaleCommand }
189
190
procedure TfrmLargeScaleCommand.FormCreate(Sender: TObject);
191
begin
192
  vstActions.NodeDataSize := SizeOf(TNodeInfo);
193
  AddNode(-1, 'Target Area');
194
  AddNode(0, 'Copy/Move');
195
  AddNode(1, 'Modify altitude');
196
  AddNode(2, 'Draw terrain');
197
  AddNode(3, 'Delete statics');
198
  AddNode(4, 'Insert statics');
199
  vstActions.Selected[vstActions.GetFirst] := True;
200
  
201
  vstArea.NodeDataSize := SizeOf(TRect);
202
  
203
  pbArea.Width := frmRadarMap.Radar.Width;
204
  pbArea.Height := frmRadarMap.Radar.Height;
205
  seX1.MaxValue := ResMan.Landscape.CellWidth;
206
  seX2.MaxValue := ResMan.Landscape.CellWidth;
207
  seY1.MaxValue := ResMan.Landscape.CellHeight;
208
  seY2.MaxValue := ResMan.Landscape.CellHeight;
209
  
210
  vdtTerrainTiles.NodeDataSize := SizeOf(TTileInfo);
211
  vdtInsertStaticsTiles.NodeDataSize := SizeOf(TTileInfo);
212
  vdtDeleteStaticsTiles.NodeDataSize := SizeOf(TTileInfo);
213
  
214
  seCMOffsetX.MinValue := -ResMan.Landscape.CellWidth;
215
  seCMOffsetX.MaxValue := ResMan.Landscape.CellWidth;
216
  seCMOffsetY.MinValue := -ResMan.Landscape.CellHeight;
217
  seCMOffsetY.MaxValue := ResMan.Landscape.CellHeight;
218
  
219
  frmRadarMap.Dependencies.Add(pbArea);
220
end;
221
222
procedure TfrmLargeScaleCommand.FormDestroy(Sender: TObject);
223
begin
224
  frmRadarMap.Dependencies.Remove(pbArea);
225
end;
226
227
procedure TfrmLargeScaleCommand.pbAreaMouseDown(Sender: TObject;
228
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
229
var
230
  node, match: PVirtualNode;
231
  nodeInfo: ^TRect;
232
  p: TPoint;
233
begin
234
  FAreaMove := [];
235
  p := Point(X * 8, Y * 8);
236
  match := nil;
237
  node := vstArea.GetFirst;
238
  while node <> nil do
239
  begin
240
    nodeInfo := vstArea.GetNodeData(node);
241
    if PtInRect(nodeInfo^, p) then
242
      match := node;
243
    node := vstArea.GetNext(node);
244
  end;
245
  if match <> nil then
246
  begin
247
    nodeInfo := vstArea.GetNodeData(match);
248
    if p.x - nodeInfo^.Left <= 64 then Include(FAreaMove, amLeft);
249
    if p.y - nodeInfo^.Top <= 64 then Include(FAreaMove, amTop);
250
    if nodeInfo^.Right - p.x <= 64 then Include(FAreaMove, amRight);
251
    if nodeInfo^.Bottom - p.y <= 64 then Include(FAreaMove, amBottom);
252
    if FAreaMove = [] then
253
      FAreaMove := [amLeft, amTop, amRight, amBottom];
254
  end else
255
  begin
256
    match := vstArea.AddChild(nil);
257
    nodeInfo := vstArea.GetNodeData(match);
258
    nodeInfo^.Left := p.x;
259
    nodeInfo^.Top := p.y;
260
    nodeInfo^.Right := p.x;
261
    nodeInfo^.Bottom := p.y;
262
    FAreaMove := [amRight, amBottom];
263
  end;
264
  vstArea.ClearSelection;
265
  vstArea.Selected[match] := True;
266
  FLastX := X;
267
  FLastY := Y;
268
end;
269
270
procedure TfrmLargeScaleCommand.pbAreaMouseMove(Sender: TObject;
271
  Shift: TShiftState; X, Y: Integer);
272
var
273
  node: PVirtualNode;
274
  nodeInfo: ^TRect;
275
  offsetX, offsetY: Integer;
276
begin
277
  if (ssLeft in Shift) and (vstArea.GetFirstSelected <> nil) then
278
  begin
279
    offsetX := (X - FLastX) * 8;
280
    offsetY := (Y - FLastY) * 8;
281
    if amLeft in FAreaMove then seX1.Value := seX1.Value + offsetX;
282
    if amRight in FAreaMove then seX2.Value := seX2.Value + offsetX;
283
    if amTop in FAreaMove then seY1.Value := seY1.Value + offsetY;
284
    if amBottom in FAreaMove then seY2.Value := seY2.Value + offsetY;
285
    FLastX := X;
286
    FLastY := Y;
287
    seX1Change(nil);
288
  end;
289
end;
290
291
procedure TfrmLargeScaleCommand.btnAddAreaClick(Sender: TObject);
292
var
293
  node: PVirtualNode;
294
  nodeInfo: ^TRect;
295
begin
296
  node := vstArea.AddChild(nil);
297
  nodeInfo := vstArea.GetNodeData(node);
298
  nodeInfo^.Left := 0;
299
  nodeInfo^.Top := 0;
300
  nodeInfo^.Right := 0;
301
  nodeInfo^.Bottom := 0;
302
  vstArea.ClearSelection;
303
  vstArea.Selected[node] := True;
304
  vstArea.FocusedNode := node;
305
end;
306
307
procedure TfrmLargeScaleCommand.FormShow(Sender: TObject);
308
begin
309
  SetWindowParent(Handle, frmMain.Handle);
310
end;
311
312
procedure TfrmLargeScaleCommand.btnClearDStaticsTilesClick(Sender: TObject);
313
begin
314
  vdtDeleteStaticsTiles.Clear;
315
end;
316
317
procedure TfrmLargeScaleCommand.btnClearIStaticsTilesClick(Sender: TObject);
318
begin
319
  vdtInsertStaticsTiles.Clear;
320
end;
321
322
procedure TfrmLargeScaleCommand.btnClearTerrainClick(Sender: TObject);
323
begin
324
  vdtTerrainTiles.Clear;
325
end;
326
327
procedure TfrmLargeScaleCommand.btnCloseClick(Sender: TObject);
328
begin
329
  Close;
330
end;
331
332
procedure TfrmLargeScaleCommand.btnDeleteDStaticsTilesClick(Sender: TObject);
333
begin
334
  vdtDeleteStaticsTiles.DeleteSelectedNodes;
335
end;
336
337
procedure TfrmLargeScaleCommand.btnDeleteIStaticsTilesClick(Sender: TObject);
338
begin
339
  vdtInsertStaticsTiles.DeleteSelectedNodes;
340
end;
341
342
procedure TfrmLargeScaleCommand.btnDeleteTerrainClick(Sender: TObject);
343
begin
344
  vdtTerrainTiles.DeleteSelectedNodes;
345
end;
346
347
procedure TfrmLargeScaleCommand.btnExecuteClick(Sender: TObject);
348
var
349
  packet: TPacket;
350
  stream: TEnhancedMemoryStream;
351
  areaCount: Byte;
352
  i: Integer;
353
  node: PVirtualNode;
354
  areaInfo: ^TRect;
355
begin
356
  packet := TPacket.Create($0E, 0);
357
  stream := packet.Stream;
358
  stream.Position := stream.Size;
359
360
  //Area
361
  areaCount := Min(vstArea.RootNodeCount, 255);
362
  stream.WriteByte(areaCount);
363
  if areaCount = 0 then Exit;
364
  i := 0;
365
  node := vstArea.GetFirst;
366
  while (node <> nil) and (i < areaCount) do
367
  begin
368
    areaInfo := vstArea.GetNodeData(node);
369
    stream.WriteWord(Min(areaInfo^.Left, areaInfo^.Right));
370
    stream.WriteWord(Min(areaInfo^.Top, areaInfo^.Bottom));
371
    stream.WriteWord(Max(areaInfo^.Left, areaInfo^.Right));
372
    stream.WriteWord(Max(areaInfo^.Top, areaInfo^.Bottom));
373
    node := vstArea.GetNext(node);
374
    Inc(i);
375
  end;
376
377
  //Copy/Move
378
  node := FindNode(0);
379
  if vstActions.CheckState[node] = csCheckedNormal then
380
  begin
381
    stream.WriteBoolean(True);
382
    stream.WriteByte(rgCMAction.ItemIndex);
383
    stream.WriteInteger(seCMOffsetX.Value);
384
    stream.WriteInteger(seCMOffsetY.Value);
385
    stream.WriteBoolean(cbCMEraseTarget.Checked);
386
  end else
387
    stream.WriteBoolean(False);
388
  
389
  //Modify altitude
390
  node := FindNode(1);
391
  if vstActions.CheckState[node] = csCheckedNormal then
392
  begin
393
    stream.WriteBoolean(True);
394
    if rbSetTerrainAltitude.Checked then
395
    begin
396
      stream.WriteByte(1);
397
      stream.WriteShortInt(Min(seTerrainAltitude1.Value, seTerrainAltitude2.Value));
398
      stream.WriteShortInt(Max(seTerrainAltitude1.Value, seTerrainAltitude2.Value));
399
    end else
400
    begin
401
      stream.WriteByte(2);
402
      stream.WriteShortInt(seRelativeAltitude.Value);
403
    end;
404
  end else
405
    stream.WriteBoolean(False);
406
  
407
  //Draw terrain
408
  node := FindNode(2);
409
  if vstActions.CheckState[node] = csCheckedNormal then
410
  begin
411
    stream.WriteBoolean(True);
412
    SerializeTiles(vdtTerrainTiles, stream);
413
  end else
414
    stream.WriteBoolean(False);
415
    
416
  //Delete statics
417
  node := FindNode(3);
418
  if vstActions.CheckState[node] = csCheckedNormal then
419
  begin
420
    stream.WriteBoolean(True);
421
    SerializeTiles(vdtDeleteStaticsTiles, stream);
422
    stream.WriteShortInt(Min(seDeleteStaticsZ1.Value, seDeleteStaticsZ2.Value));
423
    stream.WriteShortInt(Max(seDeleteStaticsZ1.Value, seDeleteStaticsZ2.Value));
424
  end else
425
    stream.WriteBoolean(False);
426
    
427
  //Insert statics
428
  node := FindNode(4);
429
  if vstActions.CheckState[node] = csCheckedNormal then
430
  begin
431
    stream.WriteBoolean(True);
432
    SerializeTiles(vdtInsertStaticsTiles, stream);
433
    stream.WriteByte(seStaticsProbability.Value);
434
    if rbPlaceStaticsOnZ.Checked then
435
    begin
436
      stream.WriteByte(3);
437
      stream.WriteShortInt(seInsertStaticsZ.Value);
438
    end else if rbPlaceStaticsOnTerrain.Checked then
439
      stream.WriteByte(1)
440
    else
441
      stream.WriteByte(2);
442
  end else
443
    stream.WriteBoolean(False);
444
  
445
  dmNetwork.Send(TCompressedPacket.Create(packet));
446
  Close;
447
end;
448
449
procedure TfrmLargeScaleCommand.pbAreaPaint(Sender: TObject);
450
var
451
  i: Integer;
452
  node: PVirtualNode;
453
  nodeInfo: ^TRect;
454
begin
455
  DisplayImage(pbArea.Canvas, 0, 0, frmRadarMap.Radar);
456
  pbArea.Canvas.Pen.Color := clRed;
457
  pbArea.Canvas.Brush.Color := clMaroon;
458
  pbArea.Canvas.Brush.Style := bsFDiagonal;
459
  node := vstArea.GetFirst;
460
  while node <> nil do
461
  begin
462
    if vstArea.Selected[node] then
463
    begin
464
      pbArea.Canvas.Pen.Width := 2;
465
      pbArea.Canvas.Pen.Style := psSolid;
466
      //pbArea.Canvas.Brush.Color := clRed;
467
    end else
468
    begin
469
      pbArea.Canvas.Pen.Width := 1;
470
      pbArea.Canvas.Pen.Style := psDot;
471
      //pbArea.Canvas.Brush.Color := clMaroon;
472
    end;
473
    nodeInfo := vstArea.GetNodeData(node);
474
    pbArea.Canvas.Rectangle(nodeInfo^.Left div 8, nodeInfo^.Top div 8,
475
      nodeInfo^.Right div 8 + 1, nodeInfo^.Bottom div 8 + 1);
476
    node := vstArea.GetNext(node);
477
  end;
478
end;
479
480
procedure TfrmLargeScaleCommand.btnDeleteAreaClick(Sender: TObject);
481
begin
482
  vstArea.DeleteSelectedNodes;
483
  vstAreaChange(vstArea, nil);
484
end;
485
486
procedure TfrmLargeScaleCommand.btnClearAreaClick(Sender: TObject);
487
begin
488
  vstArea.Clear;
489
  vstAreaChange(vstArea, nil);
490
end;
491
492
procedure TfrmLargeScaleCommand.seX1Change(Sender: TObject);
493
var
494
  node: PVirtualNode;
495
  nodeInfo: ^TRect;
496
begin
497
  node := vstArea.GetFirstSelected;
498
  if node <> nil then
499
  begin
500
    nodeInfo := vstArea.GetNodeData(node);
501
    nodeInfo^.Left := seX1.Value;
502
    nodeInfo^.Right := seX2.Value;
503
    nodeInfo^.Top := seY1.Value;
504
    nodeInfo^.Bottom := seY2.Value;
505
    vstArea.InvalidateNode(node);
506
    pbArea.Repaint;
507
  end;
508
end;
509
510
procedure TfrmLargeScaleCommand.vdtTerrainTilesDragDrop(Sender: TBaseVirtualTree;
511
  Source: TObject; DataObject: IDataObject; Formats: TFormatArray;
512
  Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
513
var
514
  sourceTree: TVirtualDrawTree;
515
  selected, node: PVirtualNode;
516
  sourceTileInfo, targetTileInfo: PTileInfo;
517
begin
518
  sourceTree := Source as TVirtualDrawTree;
519
  if (sourceTree <> Sender) and (sourceTree <> nil) and
520
    (sourceTree.Tag = 1) then
521
  begin
522
    Sender.BeginUpdate;
523
    selected := sourceTree.GetFirstSelected;
524
    while selected <> nil do
525
    begin
526
      sourceTileInfo := sourceTree.GetNodeData(selected);
527
      if ((Sender = vdtTerrainTiles) and (sourceTileInfo^.ID < $4000)) or
528
         ((Sender = vdtInsertStaticsTiles) and (sourceTileInfo^.ID > $3FFF)) or
529
         ((Sender = vdtDeleteStaticsTiles) and (sourceTileInfo^.ID > $3FFF)) then
530
      begin
531
        node := Sender.AddChild(nil);
532
        targetTileInfo := Sender.GetNodeData(node);
533
        targetTileInfo^.ID := sourceTileInfo^.ID;
534
      end;
535
      selected := sourceTree.GetNextSelected(selected);
536
    end;
537
    Sender.EndUpdate;
538
  end;
539
end;
540
541
procedure TfrmLargeScaleCommand.vdtTerrainTilesDragOver(Sender: TBaseVirtualTree;
542
  Source: TObject; Shift: TShiftState; State: TDragState; Pt: TPoint;
543
  Mode: TDropMode; var Effect: Integer; var Accept: Boolean);
544
begin
545
  if (Source <> Sender) and (Source is TVirtualDrawTree) and
546
    (TVirtualDrawTree(Source).Tag = 1) then
547
  begin
548
    Accept := True;
549
  end;
550
end;
551
552
procedure TfrmLargeScaleCommand.vdtTerrainTilesDrawNode(
553
  Sender: TBaseVirtualTree; const PaintInfo: TVTPaintInfo);
554
begin
555
  frmMain.vdtTilesDrawNode(Sender, PaintInfo);
556
end;
557
558
procedure TfrmLargeScaleCommand.vstActionsChange(Sender: TBaseVirtualTree;
559
  Node: PVirtualNode);
560
var
561
  nodeInfo: PNodeInfo;
562
begin
563
  if Sender.Selected[Node] then
564
  begin
565
    nodeInfo := Sender.GetNodeData(Node);
566
    nbActions.PageIndex := nodeInfo^.ActionID + 1;
567
  end;
568
end;
569
570
procedure TfrmLargeScaleCommand.vstActionsGetText(
571
  Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
572
  TextType: TVSTTextType; var CellText: WideString);
573
var
574
  nodeInfo: PNodeInfo;
575
begin
576
  nodeInfo := Sender.GetNodeData(Node);
577
  CellText := nodeInfo^.Caption;
578
end;
579
580
procedure TfrmLargeScaleCommand.vstActionsPaintText(Sender: TBaseVirtualTree;
581
  const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
582
  TextType: TVSTTextType);
583
begin
584
  if Sender.Selected[Node] then
585
    TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsBold];
586
end;
587
588
procedure TfrmLargeScaleCommand.vstAreaChange(Sender: TBaseVirtualTree;
589
  Node: PVirtualNode);
590
var
591
  nodeInfo: ^TRect;
592
  selected: Boolean;
593
begin
594
  selected := (Node <> nil) and Sender.Selected[Node];
595
  btnDeleteArea.Enabled := selected;
596
  lblX.Enabled := selected;
597
  lblY.Enabled := selected;
598
  seX1.Enabled := selected;
599
  seX2.Enabled := selected;
600
  seY1.Enabled := selected;
601
  seY2.Enabled := selected;
602
  if selected then
603
  begin
604
    nodeInfo := Sender.GetNodeData(Node);
605
    seX1.Value := nodeInfo^.Left;
606
    seX2.Value := nodeInfo^.Right;
607
    seY1.Value := nodeInfo^.Top;
608
    seY2.Value := nodeInfo^.Bottom;
609
  end;
610
  pbArea.Repaint;
611
end;
612
613
procedure TfrmLargeScaleCommand.vstAreaGetText(Sender: TBaseVirtualTree;
614
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
615
  var CellText: WideString);
616
var
617
  nodeInfo: ^TRect;
618
begin
619
  nodeInfo := Sender.GetNodeData(Node);
620
  CellText := Format('(%d, %d), (%d, %d)', [nodeInfo^.Left, nodeInfo^.Top,
621
    nodeInfo^.Right, nodeInfo^.Bottom]);
622
end;
623
624
procedure TfrmLargeScaleCommand.AddNode(AActionID: Integer; ACaption: string);
625
var
626
  node: PVirtualNode;
627
  nodeInfo: PNodeInfo;
628
begin
629
  node := vstActions.AddChild(nil);
630
  nodeInfo := vstActions.GetNodeData(node);
631
  nodeInfo^.ActionID := AActionID;
632
  nodeInfo^.Caption := ACaption;
633
  if AActionID > -1 then
634
    vstActions.CheckType[node] := ctCheckBox;
635
end;
636
637
function TfrmLargeScaleCommand.FindNode(AActionID: Integer): PVirtualNode;
638
var
639
  node: PVirtualNode;
640
  nodeInfo: PNodeInfo;
641
begin
642
  Result := nil;
643
  node := vstActions.GetFirst;
644
  while (node <> nil) and (Result = nil) do
645
  begin
646
    nodeInfo := vstActions.GetNodeData(node);
647
    if nodeInfo^.ActionID = AActionID then
648
      Result := node;
649
    node := vstActions.GetNext(node);
650
  end;
651
end;
652
653
procedure TfrmLargeScaleCommand.SerializeTiles(ATileList: TVirtualDrawTree;
654
  AStream: TEnhancedMemoryStream);
655
var
656
  node: PVirtualNode;
657
  tileInfo: PTileInfo;
658
begin
659
  AStream.WriteWord(ATileList.RootNodeCount);
660
  node := ATileList.GetFirst;
661
  while node <> nil do
662
  begin
663
    tileInfo := ATileList.GetNodeData(node);
664
    AStream.WriteWord(tileInfo^.ID);
665
    node := ATileList.GetNext(node);
666
  end;
667
end;
668
669
initialization
670
  {$I UfrmLargeScaleCommand.lrs}
671
672
end.
673