861 lines
24 KiB
ObjectPascal
861 lines
24 KiB
ObjectPascal
{-----------------------------------------------------------------------------
|
|
The contents of this file are subject to the Mozilla Public License
|
|
Version 1.1 (the "License"); you may not use this file except in compliance
|
|
with the License. You may obtain a copy of the License at
|
|
http://www.mozilla.org/MPL/MPL-1.1.html
|
|
|
|
Software distributed under the License is distributed on an "AS IS" basis,
|
|
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
|
|
the specific language governing rights and limitations under the License.
|
|
|
|
The Original Code is: JvgLogicsEditor.PAS, released on 2003-01-15.
|
|
|
|
The Initial Developer of the Original Code is Andrey V. Chudin, [chudin att yandex dott ru]
|
|
Portions created by Andrey V. Chudin are Copyright (C) 2003 Andrey V. Chudin.
|
|
All Rights Reserved.
|
|
|
|
Contributor(s):
|
|
Michael Beck [mbeck att bigfoot dott com].
|
|
Burov Dmitry, translation of russian text.
|
|
|
|
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
|
|
located at http://jvcl.sourceforge.net
|
|
|
|
Known Issues:
|
|
-----------------------------------------------------------------------------}
|
|
// $Id: JvgLogicsEditorForm.pas 10610 2006-05-19 13:35:08Z elahn $
|
|
|
|
unit JvgLogicsEditorForm;
|
|
|
|
{$I jvcl.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages,
|
|
SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
|
StdCtrls, ExtCtrls, ComCtrls, ToolWin, ImgList, RichEdit, Tabs,
|
|
{$IFDEF COMPILER6_UP}
|
|
DesignIntf, DesignEditors, PropertyCategories,
|
|
{$ELSE}
|
|
DsgnIntf,
|
|
{$ENDIF COMPILER6_UP}
|
|
JvgLogics, JvgGroupBox;
|
|
|
|
type
|
|
TJvgLogicsEditor = class(TComponentEditor)
|
|
procedure ExecuteVerb(Index: Integer); override;
|
|
function GetVerb(Index: Integer): string; override;
|
|
function GetVerbCount: Integer; override;
|
|
private
|
|
procedure ShowEditor(LogicProducer: TJvgLogicProducer);
|
|
end;
|
|
|
|
TJvgGroupBoxPlus = class(TJvgGroupBox)
|
|
public
|
|
Pt: TPoint;
|
|
Selected: Boolean;
|
|
LogicElement: TJvgLogicElement;
|
|
// fAsLogical: Boolean;
|
|
// constructor Create(AOwner: TComponent); override;
|
|
// destructor Destroy; override;
|
|
procedure Paint; override;
|
|
end;
|
|
|
|
TJvgShapePlus = class(TShape)
|
|
public
|
|
Pt: TPoint;
|
|
Selected: Boolean;
|
|
CommentArea: TJvgCommentArea;
|
|
procedure Paint; override;
|
|
end;
|
|
|
|
TJvgLogicsEditorMain = class(TForm)
|
|
SB: TScrollBox;
|
|
Panel1: TPanel;
|
|
iPKey: TImage;
|
|
iFKey: TImage;
|
|
Label2: TLabel;
|
|
cbMode: TComboBox;
|
|
SBar: TStatusBar;
|
|
iLink: TImage;
|
|
cbNext: TComboBox;
|
|
Label4: TLabel;
|
|
eStepName: TEdit;
|
|
Label1: TLabel;
|
|
ImageList1: TImageList;
|
|
ToolBar1: TToolBar;
|
|
ToolButton1: TToolButton;
|
|
tbNew: TToolButton;
|
|
ToolButton3: TToolButton;
|
|
ToolButton4: TToolButton;
|
|
cbNextFalse: TComboBox;
|
|
Label5: TLabel;
|
|
Image3: TImage;
|
|
Label7: TLabel;
|
|
Label8: TLabel;
|
|
Shape1: TShape;
|
|
ImageList: TImageList;
|
|
ToolButton2: TToolButton;
|
|
ToolButton5: TToolButton;
|
|
ToolButton6: TToolButton;
|
|
ToolButton7: TToolButton;
|
|
cbIgnoreSpaces: TCheckBox;
|
|
ToolButton8: TToolButton;
|
|
pLeft: TPanel;
|
|
pLog: TPanel;
|
|
Splitter1: TSplitter;
|
|
tbStop: TToolButton;
|
|
Panel2: TPanel;
|
|
Splitter2: TSplitter;
|
|
reReslt: TRichEdit;
|
|
PC: TPageControl;
|
|
tsLog: TTabSheet;
|
|
mLog: TMemo;
|
|
tsDictionary: TTabSheet;
|
|
mDictionary: TMemo;
|
|
Shape2: TShape;
|
|
Shape3: TShape;
|
|
Shape4: TShape;
|
|
Shape5: TShape;
|
|
Shape6: TShape;
|
|
Shape7: TShape;
|
|
Shape8: TShape;
|
|
Shape9: TShape;
|
|
Shape10: TShape;
|
|
Shape11: TShape;
|
|
Shape12: TShape;
|
|
Shape13: TShape;
|
|
TabSet1: TTabSet;
|
|
procedure SBEraseBkgndEvent(Sender: TObject; DC: HDC);
|
|
procedure cbNextChange(Sender: TObject);
|
|
procedure cbModeChange(Sender: TObject);
|
|
procedure tbNewClick(Sender: TObject);
|
|
procedure cbNextFalseChange(Sender: TObject);
|
|
procedure eStepNameChange(Sender: TObject);
|
|
procedure ToolButton5Click(Sender: TObject);
|
|
procedure ToolButton7Click(Sender: TObject);
|
|
procedure cbIgnoreSpacesClick(Sender: TObject);
|
|
procedure pLeftDockOver(Sender: TObject; Source: TDragDockObject;
|
|
X, Y: Integer; State: TDragState; var Accept: Boolean);
|
|
procedure pLeftUnDock(Sender: TObject; Client: TControl;
|
|
NewTarget: TWinControl; var Allow: Boolean);
|
|
procedure pLeftDockDrop(Sender: TObject; Source: TDragDockObject;
|
|
X, Y: Integer);
|
|
procedure ToolButton8Click(Sender: TObject);
|
|
procedure tbStopClick(Sender: TObject);
|
|
procedure TabSet1Change(Sender: TObject; NewTab: Integer;
|
|
var AllowChange: Boolean);
|
|
private
|
|
FActiveBox: TJvgGroupBoxPlus;
|
|
LogicProducer: TJvgLogicProducer;
|
|
Logics: TJvgLogics;
|
|
procedure MouseDown_(Sender: TObject; Button: TMouseButton; Shift:
|
|
TShiftState; X, Y: Integer);
|
|
procedure MouseMove_(Sender: TObject; Shift: TShiftState; X, Y: Integer);
|
|
procedure MouseUp_(Sender: TObject; Button: TMouseButton; Shift:
|
|
TShiftState; X, Y: Integer);
|
|
procedure DblClick_(Sender: TObject);
|
|
procedure SetActiveBox(const Value: TJvgGroupBoxPlus);
|
|
procedure UpdateView;
|
|
procedure AddBox(ALogicElement: TJvgLogicElement);
|
|
procedure AddShape(CommentArea: TJvgCommentArea);
|
|
procedure OnTraceMessage(Sender: TJvgLogics; AStepResult: Boolean;
|
|
const StepResult, ParsedResult, Msg: string);
|
|
public
|
|
function Execute(ALogicProducer: TJvgLogicProducer): Boolean;
|
|
property ActiveBox: TJvgGroupBoxPlus read FActiveBox write SetActiveBox;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
Clipbrd,
|
|
{$IFDEF USEJVCL}
|
|
JvDsgnConsts,
|
|
{$ENDIF USEJVCL}
|
|
JvgTypes, JvgUtils, JvgLogicItemEditorForm;
|
|
|
|
{$R *.dfm}
|
|
|
|
var
|
|
JvgLogicItemEditor: TJvgLogicItemEditor;
|
|
|
|
{$IFNDEF USEJVCL}
|
|
resourcestring
|
|
RsCaption = 'Caption';
|
|
RsComments = 'Comments';
|
|
RsEditComponentEllipsis = 'Edit component...';
|
|
{$ENDIF !USEJVCL}
|
|
|
|
//=== { TJvgLogicsEditorMain } ===============================================
|
|
|
|
function TJvgLogicsEditorMain.Execute(ALogicProducer: TJvgLogicProducer): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
JvgLogicItemEditor := TJvgLogicItemEditor.Create(nil);
|
|
|
|
mDictionary.Lines.Assign(ALogicProducer.Dictionary);
|
|
try
|
|
LogicProducer := ALogicProducer;
|
|
Logics := ALogicProducer.Logics;
|
|
|
|
Logics.OnTraceMessage := OnTraceMessage;
|
|
|
|
cbNext.Items.Clear;
|
|
cbNextFalse.Items.Clear;
|
|
cbNext.Items.Add('');
|
|
cbNextFalse.Items.Add('');
|
|
|
|
for I := 0 to Logics.Count - 1 do
|
|
AddBox(Logics[I]);
|
|
|
|
for I := 0 to LogicProducer.CommentAreas.Count - 1 do
|
|
AddShape(LogicProducer.CommentAreas[I]);
|
|
|
|
Result := ShowModal = mrOk;
|
|
finally
|
|
JvgLogicItemEditor.Free;
|
|
end;
|
|
// pLog.Dock(pLeft, Rect(1, 1, 10, 10));
|
|
// pLog.Dock(pLeft, Rect(1, 1, 10, 10));
|
|
// pLeft.Dock(pLog, Rect(1, 1, 1, 1));
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.AddBox(ALogicElement: TJvgLogicElement);
|
|
var
|
|
Box: TJvgGroupBoxPlus;
|
|
begin
|
|
Box := TJvgGroupBoxPlus.Create(Self);
|
|
with Box do
|
|
begin
|
|
Parent := SB;
|
|
Left := ALogicElement.Left;
|
|
Top := ALogicElement.Top;
|
|
Width := 100;
|
|
Height := 50;
|
|
Caption := ALogicElement.Caption;
|
|
Options := Options - [fgoCanCollapse];
|
|
CaptionAlignment := fcaWidth;
|
|
CaptionBorder.Inner := bvRaised;
|
|
CaptionBorder.Outer := bvLowered;
|
|
Colors.Caption := clBtnShadow;
|
|
Colors.TextActive := clBtnHighlight;
|
|
OnMouseDown := MouseDown_;
|
|
OnMouseMove := MouseMove_;
|
|
OnMouseUp := MouseUp_;
|
|
OnDblClick := DblClick_;
|
|
//Border.Inner := bvRaised;
|
|
//Border.Outer := bvNone;
|
|
Colors.Client := clWhite;
|
|
Colors.ClientActive := clWhite;
|
|
Box.LogicElement := ALogicElement;
|
|
|
|
cbNext.Items.AddObject(ALogicElement.Caption, LogicElement);
|
|
cbNextFalse.Items.AddObject(ALogicElement.Caption, LogicElement);
|
|
end;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.AddShape(CommentArea: TJvgCommentArea);
|
|
var
|
|
Shape: TJvgShapePlus;
|
|
begin
|
|
Shape := TJvgShapePlus.Create(Self);
|
|
Shape.CommentArea := CommentArea;
|
|
with Shape do
|
|
begin
|
|
Parent := SB;
|
|
Left := CommentArea.Left;
|
|
Top := CommentArea.Top;
|
|
Width := CommentArea.Width;
|
|
Height := CommentArea.Height;
|
|
Pen.Style := psDashDot;
|
|
Brush.Style := bsClear;
|
|
|
|
OnMouseDown := MouseDown_;
|
|
OnMouseMove := MouseMove_;
|
|
OnMouseUp := MouseUp_;
|
|
OnDblClick := DblClick_;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.MouseDown_(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if Sender is TJvgShapePlus then
|
|
with Sender as TJvgShapePlus do
|
|
begin
|
|
Pt.X := X;
|
|
Pt.Y := Y;
|
|
Pt := ClientToScreen(Pt);
|
|
Selected := True;
|
|
Tag := 1;
|
|
if (X >= Width - 5) and (X < Width) and (Y >= Height - 5) and (Y < Height) then
|
|
Tag := 2;
|
|
Exit;
|
|
end;
|
|
|
|
with TJvgGroupBoxPlus(Sender) do
|
|
begin
|
|
Pt.X := X;
|
|
Pt.Y := Y;
|
|
Pt := ClientToScreen(Pt);
|
|
Pt.Y := Pt.Y; // + SB.VertScrollBar.ScrollPos;
|
|
Tag := 1;
|
|
Options := Options + [fgoDelineatedText];
|
|
Colors.Caption := clBtnHighlight;
|
|
Colors.TextActive := clBlack;
|
|
Font.Style := [fsBold];
|
|
Selected := True;
|
|
ActiveBox := TJvgGroupBoxPlus(Sender);
|
|
end;
|
|
|
|
for I := 0 to SB.ControlCount - 1 do
|
|
if SB.Controls[I] is TJvgGroupBoxPlus then
|
|
with TJvgGroupBoxPlus(SB.Controls[I]) do
|
|
if ActiveBox <> TJvgGroupBoxPlus(SB.Controls[I]) then
|
|
begin
|
|
Options := Options - [fgoDelineatedText];
|
|
Colors.Caption := clBtnShadow;
|
|
Colors.TextActive := clBtnHighlight;
|
|
Font.Style := [];
|
|
Selected := False;
|
|
Repaint;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.MouseMove_(Sender: TObject; Shift: TShiftState;
|
|
X, Y: Integer);
|
|
var
|
|
NewPt: TPoint;
|
|
begin
|
|
if Sender is TJvgShapePlus then
|
|
with Sender as TJvgShapePlus do
|
|
begin
|
|
case Tag of
|
|
1:
|
|
begin
|
|
NewPt.X := X;
|
|
NewPt.Y := Y;
|
|
NewPt := ClientToScreen(NewPt);
|
|
Left := Left + NewPt.X - Pt.X;
|
|
Top := Top + NewPt.Y - Pt.Y;
|
|
CommentArea.Left := Left + SB.HorzScrollBar.ScrollPos;
|
|
CommentArea.Top := Top + SB.VertScrollBar.ScrollPos;
|
|
end;
|
|
2:
|
|
begin
|
|
NewPt.X := X;
|
|
NewPt.Y := Y;
|
|
NewPt := ClientToScreen(NewPt);
|
|
Width := Width + NewPt.X - Pt.X;
|
|
Height := Height + NewPt.Y - Pt.Y;
|
|
if Width < 50 then
|
|
Width := 50;
|
|
if Height < 50 then
|
|
Height := 50;
|
|
CommentArea.Width := Width;
|
|
CommentArea.Height := Height;
|
|
end;
|
|
end;
|
|
Pt.X := NewPt.X;
|
|
Pt.Y := NewPt.Y;
|
|
Exit;
|
|
end;
|
|
|
|
with TJvgGroupBoxPlus(Sender) do
|
|
begin
|
|
if Tag <> 0 then
|
|
begin
|
|
NewPt.X := X;
|
|
NewPt.Y := Y;
|
|
NewPt := ClientToScreen(NewPt);
|
|
NewPt.Y := NewPt.Y; // + SB.VertScrollBar.ScrollPos;
|
|
Left := Left + NewPt.X - Pt.X;
|
|
Top := Top + NewPt.Y - Pt.Y;
|
|
|
|
LogicElement.Left := Left + SB.HorzScrollBar.ScrollPos;
|
|
LogicElement.Top := Top + SB.VertScrollBar.ScrollPos;
|
|
|
|
SBar.SimpleText := IntToStr(Left) + ':' + IntToStr(Top);
|
|
|
|
UpdateView;
|
|
end;
|
|
Pt.X := NewPt.X;
|
|
Pt.Y := NewPt.Y;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.UpdateView;
|
|
var
|
|
DC: HDC;
|
|
begin
|
|
DC := GetDC(SB.Handle);
|
|
SendMessage(SB.Handle, WM_ERASEBKGND, WPARAM(DC), 0);
|
|
ReleaseDC(SB.Handle, DC);
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.MouseUp_(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
TControl(Sender).Tag := 0;
|
|
for I := 0 to SB.ControlCount - 1 do
|
|
if (SB.Controls[I] is TJvgShapePlus) then
|
|
(SB.Controls[I] as TJvgShapePlus).Paint;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.DblClick_(Sender: TObject);
|
|
var
|
|
S: string;
|
|
begin
|
|
TControl(Sender).Tag := 0;
|
|
if Sender is TJvgShapePlus then
|
|
with Sender as TJvgShapePlus do
|
|
begin
|
|
S := CommentArea.Text;
|
|
if InputQuery(RsCaption, RsComments, S) then
|
|
CommentArea.Text := S;
|
|
PostMessage(TWinControl(Parent).Handle, WM_LBUTTONUP, 1, 1);
|
|
Exit;
|
|
end;
|
|
|
|
JvgLogicItemEditor.Execute(Logics, TJvgGroupBoxPlus(Sender).LogicElement);
|
|
PostMessage(TWinControl(Sender).Handle, WM_LBUTTONUP, 1, 1);
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.SetActiveBox(const Value: TJvgGroupBoxPlus);
|
|
var
|
|
Index: Integer;
|
|
begin
|
|
FActiveBox := Value;
|
|
|
|
Index := cbNext.Items.IndexOfObject(Value.LogicElement.NextElement);
|
|
if Index <> -1 then
|
|
cbNext.ItemIndex := Index
|
|
else
|
|
cbNext.ItemIndex := 0;
|
|
|
|
Index := cbNextFalse.Items.IndexOfObject(Value.LogicElement.NextFalseElement);
|
|
if Index <> -1 then
|
|
cbNextFalse.ItemIndex := Index
|
|
else
|
|
cbNextFalse.ItemIndex := 0;
|
|
|
|
cbMode.ItemIndex := Integer(FActiveBox.LogicElement.IsFirst);
|
|
eStepName.Text := FActiveBox.LogicElement.Caption;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.OnTraceMessage(Sender: TJvgLogics;
|
|
AStepResult: Boolean; const StepResult, ParsedResult, Msg: string);
|
|
begin
|
|
mLog.Lines.Add(Msg);
|
|
if reReslt.Text = '' then
|
|
reReslt.Tag := 0;
|
|
|
|
if Length(ParsedResult) = 0 then
|
|
Exit;
|
|
Tag := 1 - Tag;
|
|
|
|
// reReslt.Lines.BeginUpdate;
|
|
|
|
reReslt.Text := reReslt.Text + ParsedResult;
|
|
|
|
reReslt.SelStart := Length(reReslt.Text) - Length(ParsedResult);
|
|
reReslt.SelLength := Length(ParsedResult);
|
|
if Tag = 0 then
|
|
reReslt.SelAttributes.Color := clRed
|
|
else
|
|
reReslt.SelAttributes.Color := clGreen;
|
|
// reReslt.SelAttributes.Color := RGB(100+Random(100), 100+Random(100), 100+Random(100));
|
|
|
|
reReslt.SelLength := 0;
|
|
// reReslt.Lines.EndUpdate;
|
|
end;
|
|
|
|
//=== { TJvgGroupBoxPlus } ===================================================
|
|
|
|
procedure TJvgGroupBoxPlus.Paint;
|
|
var
|
|
R: TRect;
|
|
S: string;
|
|
begin
|
|
inherited Paint;
|
|
// ChangeBitmapColor((Owner as TJvgLogicsEditorMain).iLink.Picture.Bitmap, GetPixel((Owner as TJvgLogicsEditorMain).iLink.Picture.Bitmap.Canvas.Handle, 0,0), IIF(LogicElement.NextElement<>nil, clGreen, clRed));
|
|
// BitBlt(Canvas.Handle, 100-14-3, 3, 14, 13, (Owner as TJvgLogicsEditorMain).iLink.Picture.Bitmap.Canvas.Handle, 0, 0, SRCCOPY);
|
|
|
|
Canvas.Font.Color := clTeal; //clBlue;
|
|
Canvas.Font.Style := [];
|
|
S := LogicElement.Expression + ' ' + LogicRuleLabels[LogicElement.Rule] +
|
|
' ' + LogicElement.Value;
|
|
R := Bounds(3, 20, Width - 6, Height - 22);
|
|
Windows.DrawText(Canvas.Handle, PChar(S), Length(S), R,
|
|
DT_WORDBREAK or DT_END_ELLIPSIS or DT_MODIFYSTRING);
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.SBEraseBkgndEvent(Sender: TObject; DC: HDC);
|
|
var
|
|
LogicElement: TJvgLogicElement;
|
|
I: Integer;
|
|
PenFalse, Pen, PenTrue, OldPen, PenGrid: HPen;
|
|
Brush: HBrush;
|
|
PrevBox, PrevFalseBox: TJvgGroupBoxPlus;
|
|
Bmp: TBitmap;
|
|
|
|
function FindBox(LogicElement: TJvgLogicElement): TJvgGroupBoxPlus;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := nil;
|
|
if LogicElement <> nil then
|
|
for I := 0 to SB.ControlCount - 1 do
|
|
if SB.Controls[I] is TJvgGroupBoxPlus then
|
|
if TJvgGroupBoxPlus(SB.Controls[I]).LogicElement = LogicElement then
|
|
begin
|
|
Result := TJvgGroupBoxPlus(SB.Controls[I]);
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
procedure Line(X, Y, X2, Y2: Integer; IsTrueLine: Boolean);
|
|
const
|
|
R = 5;
|
|
begin
|
|
if IsTrueLine then
|
|
SelectObject(DC, PenTrue)
|
|
else
|
|
SelectObject(DC, PenFalse);
|
|
MoveToEx(DC, X, Y, nil);
|
|
LineTo(DC, X2, Y2);
|
|
SelectObject(DC, Pen);
|
|
if (Abs(X2 - X) < 500) and (Abs(Y2 - Y) < 500) then
|
|
MoveToEx(DC, X, Y + 1, nil);
|
|
LineTo(DC, X2, Y2 + 1);
|
|
Ellipse(DC, X - R - 2, Y - R - 2, X + R * 2 - 2, Y + R * 2 - 2);
|
|
Ellipse(DC, X2 - R - 2, Y2 - R - 2, X2 + R * 2 - 2, Y2 + R * 2 - 2);
|
|
end;
|
|
|
|
procedure DrawGrid;
|
|
var
|
|
I: Integer;
|
|
const
|
|
cStep = 14;
|
|
begin
|
|
FillRect(DC, SB.ClientRect, Brush);
|
|
for I := 1 to SB.Width div cStep do
|
|
begin
|
|
MoveToEx(DC, I*cStep, 0, nil);
|
|
LineTo(DC, I*cStep, SB.Height);
|
|
end;
|
|
for I := 1 to SB.Height div cStep do
|
|
begin
|
|
MoveToEx(DC, 0, I*cStep, nil);
|
|
LineTo(DC, SB.Width, I*cStep);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
OldPen := 0;
|
|
PenGrid := 0;
|
|
try
|
|
Brush := CreateSolidBrush(clWhite);
|
|
Pen := CreatePen(PS_SOLID, 1, clBlack);
|
|
PenGrid := CreatePen(PS_SOLID, 1, $E0E0E0);
|
|
//PenLong := CreatePen( PS_DASHDOT, 1, $E0E0E0 );
|
|
PenTrue := CreatePen(PS_SOLID, 1, $FF9090);
|
|
PenFalse := CreatePen(PS_SOLID, 1, $009090);
|
|
OldPen := SelectObject(DC, PenGrid);
|
|
// OldBrush := SelectObject(DC, Brush);
|
|
|
|
DrawGrid;
|
|
|
|
for I := 0 to SB.ControlCount - 1 do
|
|
if SB.Controls[I] is TJvgGroupBoxPlus then
|
|
begin
|
|
LogicElement := TJvgGroupBoxPlus(SB.Controls[I]).LogicElement;
|
|
if LogicElement = nil then
|
|
Exit;
|
|
|
|
if LogicElement.IsFirst then
|
|
begin
|
|
MoveToEx(DC, 0, 0, nil);
|
|
LineTo(DC, SB.Controls[I].Left, SB.Controls[I].Top);
|
|
end;
|
|
|
|
PrevBox := FindBox(LogicElement.NextElement);
|
|
if Assigned(PrevBox) then
|
|
begin
|
|
Line(SB.Controls[I].Left + SB.Controls[I].Width, SB.Controls[I].Top,
|
|
PrevBox.Left, PrevBox.Top, True);
|
|
DeleteObject(SelectObject(DC, OldPen));
|
|
end;
|
|
|
|
PrevFalseBox := FindBox(LogicElement.NextFalseElement);
|
|
if Assigned(PrevFalseBox) then
|
|
begin
|
|
Line(SB.Controls[I].Left + SB.Controls[I].Width, SB.Controls[I].Top +
|
|
SB.Controls[I].Height, PrevFalseBox.Left, PrevFalseBox.Top, False);
|
|
DeleteObject(SelectObject(DC, OldPen));
|
|
end;
|
|
|
|
Bmp := TBitmap.Create;
|
|
if LogicElement.NextElement <> nil then
|
|
begin
|
|
ImageList.GetBitmap(0, Bmp);
|
|
BitBlt(DC, SB.Controls[I].Left + SB.Controls[I].Width - 3,
|
|
SB.Controls[I].Top, Bmp.Width, Bmp.Height, Bmp.Canvas.Handle, 0, 0,
|
|
SRCCOPY);
|
|
end;
|
|
|
|
if LogicElement.NextFalseElement <> nil then
|
|
begin
|
|
ImageList.GetBitmap(1, Bmp);
|
|
BitBlt(DC, SB.Controls[I].Left + SB.Controls[I].Width - 3,
|
|
SB.Controls[I].Top + SB.Controls[I].Height - 17, Bmp.Width,
|
|
Bmp.Height, Bmp.Canvas.Handle, 0, 0, SRCCOPY);
|
|
end;
|
|
|
|
if LogicElement.IsFirst then
|
|
begin
|
|
ImageList.GetBitmap(2, Bmp);
|
|
BitBlt(DC, SB.Controls[I].Left - 20, SB.Controls[I].Top, Bmp.Width,
|
|
Bmp.Height, Bmp.Canvas.Handle, 0, 0, SRCCOPY);
|
|
end;
|
|
|
|
Bmp.Free;
|
|
end;
|
|
finally
|
|
SelectObject(DC, Pen);
|
|
DeleteObject(SelectObject(DC, OldPen));
|
|
DeleteObject(PenTrue);
|
|
DeleteObject(PenFalse);
|
|
DeleteObject(PenGrid);
|
|
DeleteObject(Brush);
|
|
end;
|
|
// for I := 0 to SB.ControlCount-1 do
|
|
// if (SB.Controls[I] is TJvgShapePlus) then (SB.Controls[I] as TJvgShapePlus).Paint;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.cbNextChange(Sender: TObject);
|
|
begin
|
|
if FActiveBox <> nil then
|
|
begin
|
|
if FActiveBox.LogicElement <> cbNext.Items.Objects[cbNext.ItemIndex] then
|
|
FActiveBox.LogicElement.NextElement :=
|
|
TJvgLogicElement(cbNext.Items.Objects[cbNext.ItemIndex]);
|
|
UpdateView;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.cbModeChange(Sender: TObject);
|
|
begin
|
|
if FActiveBox <> nil then
|
|
FActiveBox.LogicElement.IsFirst := cbMode.ItemIndex = 1;
|
|
end;
|
|
|
|
//=== { TJvgLogicsEditor } ===================================================
|
|
|
|
procedure TJvgLogicsEditor.ExecuteVerb(Index: Integer);
|
|
begin
|
|
if Index = 0 then
|
|
ShowEditor(TJvgLogicProducer(Component));
|
|
end;
|
|
|
|
function TJvgLogicsEditor.GetVerb(Index: Integer): string;
|
|
begin
|
|
case Index of
|
|
0:
|
|
Result := RsEditComponentEllipsis;
|
|
end;
|
|
end;
|
|
|
|
function TJvgLogicsEditor.GetVerbCount: Integer;
|
|
begin
|
|
Result := 1;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditor.ShowEditor(LogicProducer: TJvgLogicProducer);
|
|
var
|
|
glLogicsEditor: TJvgLogicsEditorMain;
|
|
// Logics: TJvgLogics;
|
|
begin
|
|
// Logics := LogicProducer.Logics;
|
|
{ with Logics.Add do
|
|
begin
|
|
Left := 10; Top := 10;
|
|
IsFirst := True;
|
|
end;
|
|
|
|
with Logics.Add do
|
|
begin
|
|
Left := 200; Top := 30;
|
|
PrevElementID := Logics[0].ID;
|
|
end;
|
|
|
|
Logics[0].NextElementID := Logics[1].ID;
|
|
|
|
with Logics.Add do
|
|
begin
|
|
Left := 200; Top := 100;
|
|
end;
|
|
}
|
|
try
|
|
glLogicsEditor := TJvgLogicsEditorMain.Create(nil);
|
|
glLogicsEditor.Execute(LogicProducer);
|
|
finally
|
|
FreeAndNil(glLogicsEditor);
|
|
end;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.tbNewClick(Sender: TObject);
|
|
var
|
|
LogicElement: TJvgLogicElement;
|
|
begin
|
|
LogicElement := Logics.Add;
|
|
with LogicElement do
|
|
begin
|
|
Left := SB.Width div 2;
|
|
Top := SB.Height div 2;
|
|
AddBox(LogicElement);
|
|
end;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.cbNextFalseChange(Sender: TObject);
|
|
begin
|
|
if FActiveBox <> nil then
|
|
begin
|
|
if FActiveBox.LogicElement <> cbNextFalse.Items.Objects[cbNextFalse.ItemIndex] then
|
|
begin
|
|
FActiveBox.LogicElement.NextFalseElement :=
|
|
TJvgLogicElement(cbNextFalse.Items.Objects[cbNextFalse.ItemIndex]);
|
|
end;
|
|
UpdateView;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.eStepNameChange(Sender: TObject);
|
|
begin
|
|
if Assigned(ActiveBox) then
|
|
begin
|
|
ActiveBox.LogicElement.Caption := eStepName.Text;
|
|
ActiveBox.Caption := eStepName.Text;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TJvgLogicsEditorMain.ToolButton5Click(Sender: TObject);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
pLog.Visible := True;
|
|
|
|
mLog.Lines.Clear;
|
|
reReslt.Text := '';
|
|
|
|
Logics.Analyze;
|
|
|
|
for I := 0 to SB.ControlCount - 1 do
|
|
if SB.Controls[I] is TJvgGroupBoxPlus then
|
|
if TJvgGroupBoxPlus(SB.Controls[I]).LogicElement.IsTrue then
|
|
TJvgGroupBoxPlus(SB.Controls[I]).Colors.Caption := clGreen;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.ToolButton7Click(Sender: TObject);
|
|
var
|
|
CommentArea: TJvgCommentArea;
|
|
begin
|
|
CommentArea := LogicProducer.CommentAreas.Add;
|
|
with CommentArea do
|
|
begin
|
|
Left := SB.Width div 2;
|
|
Top := SB.Height div 2;
|
|
Width := 100;
|
|
Height := 100;
|
|
AddShape(CommentArea);
|
|
end;
|
|
end;
|
|
|
|
//=== { TJvgShapePlus } ======================================================
|
|
|
|
procedure TJvgShapePlus.Paint;
|
|
var
|
|
R: TRect;
|
|
S: string;
|
|
begin
|
|
inherited Paint;
|
|
Canvas.Font.Color := clBlue;
|
|
Canvas.Font.Style := [fsBold];
|
|
S := CommentArea.Text;
|
|
R := Bounds(3, 2, Width, Height);
|
|
Windows.DrawText(Canvas.Handle, PChar(S), Length(S), R, DT_WORDBREAK);
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.cbIgnoreSpacesClick(Sender: TObject);
|
|
begin
|
|
LogicProducer.IgnoreSpaces := cbIgnoreSpaces.Checked;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.pLeftDockOver(Sender: TObject; Source:
|
|
TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
|
|
begin
|
|
Accept := True;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.pLeftUnDock(Sender: TObject; Client: TControl;
|
|
NewTarget: TWinControl; var Allow: Boolean);
|
|
begin
|
|
(Sender as TWinControl).Height := 6;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.pLeftDockDrop(Sender: TObject; Source:
|
|
TDragDockObject; X, Y: Integer);
|
|
begin
|
|
(Sender as TWinControl).Height := 100;
|
|
// (rom) needs reevaluation. Move it out of the screen needs bigger values.
|
|
SBar.Top := 1500;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.ToolButton8Click(Sender: TObject);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if Logics.TraceItem = nil then
|
|
begin
|
|
Logics.StartAnalyze;
|
|
reReslt.Text := '';
|
|
end;
|
|
tbStop.Enabled := True;
|
|
|
|
Logics.AnalyzeStep;
|
|
|
|
for I := 0 to SB.ControlCount - 1 do
|
|
if SB.Controls[I] is TJvgGroupBoxPlus then
|
|
if TJvgGroupBoxPlus(SB.Controls[I]).LogicElement.IsTrue then
|
|
TJvgGroupBoxPlus(SB.Controls[I]).Colors.Caption := clGreen;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.tbStopClick(Sender: TObject);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Logics.TraceItem := nil;
|
|
tbStop.Enabled := False;
|
|
|
|
for I := 0 to SB.ControlCount - 1 do
|
|
if SB.Controls[I] is TJvgGroupBoxPlus then
|
|
if TJvgGroupBoxPlus(SB.Controls[I]).LogicElement.IsTrue then
|
|
TJvgGroupBoxPlus(SB.Controls[I]).Colors.Caption := clBtnShadow;
|
|
end;
|
|
|
|
procedure TJvgLogicsEditorMain.TabSet1Change(Sender: TObject; NewTab: Integer;
|
|
var AllowChange: Boolean);
|
|
begin
|
|
PC.ActivePageIndex := NewTab;
|
|
end;
|
|
|
|
end.
|