unit Myc.Fmx.AstEditor.Handlers.Primitives; interface uses System.UITypes, System.SysUtils, Myc.Data.Value, Myc.Ast, Myc.Ast.Nodes, Myc.Fmx.AstEditor.Render, Myc.Fmx.AstEditor.Node; type TConstantNodeHandler = class(TBaseNodeHandler) public procedure BuildUI(OwnerNode: TAstViewNode); override; function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override; end; TIdentifierNodeHandler = class(TBaseNodeHandler) public procedure BuildUI(OwnerNode: TAstViewNode); override; function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override; end; TKeywordNodeHandler = class(TBaseNodeHandler) public procedure BuildUI(OwnerNode: TAstViewNode); override; function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override; end; TNopNodeHandler = class(TBaseNodeHandler) public procedure BuildUI(OwnerNode: TAstViewNode); override; function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override; end; implementation { TConstantNodeHandler } procedure TConstantNodeHandler.BuildUI(OwnerNode: TAstViewNode); var valueStr: string; isConcise: Boolean; titleLabel: TTextNode; valLabel: TTextNode; begin valueStr := FNode.Value.ToString; isConcise := ((FNode.Value.Kind = TDataValueKind.vkScalar) or (Pos(sLineBreak, valueStr) = 0)) and (Length(valueStr) < 40); if isConcise then begin OwnerNode.Frameless := True; OwnerNode.BackgroundColor := TAlphaColors.Null; OwnerNode.BorderColor := TAlphaColors.Null; OwnerNode.BorderWidth := 0; // Compact representation for scalars OwnerNode.Margins := TMarginRect.Create(1, 0, 1, 0); OwnerNode.Padding := TMarginRect.Create(0, 0, 0, 0); valLabel := OwnerNode.AddLabel(OwnerNode, valueStr); valLabel.Margins := TMarginRect.Create(1, 0, 1, 0); end else begin OwnerNode.Frameless := False; OwnerNode.Orientation := loVertical; titleLabel := OwnerNode.AddLabel(OwnerNode, 'Const'); titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold]; OwnerNode.AddLabel(OwnerNode, valueStr); end; end; function TConstantNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode; begin Result := TAst.Constant(FNode.Identity.AsConstant, FNode.StaticType); end; { TIdentifierNodeHandler } procedure TIdentifierNodeHandler.BuildUI(OwnerNode: TAstViewNode); var lbl: TTextNode; begin OwnerNode.Frameless := True; OwnerNode.BackgroundColor := TAlphaColors.Null; OwnerNode.BorderColor := TAlphaColors.Null; OwnerNode.BorderWidth := 0; // Compact representation for identifiers OwnerNode.Margins := TMarginRect.Create(1, 0, 1, 0); OwnerNode.Padding := TMarginRect.Create(0, 0, 0, 0); lbl := OwnerNode.AddLabel(OwnerNode, FNode.Name); lbl.Margins := TMarginRect.Create(1, 0, 1, 0); end; function TIdentifierNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode; begin Result := TAst.Identifier(FNode.Identity.AsNamed, FNode.Address, FNode.StaticType); end; { TKeywordNodeHandler } procedure TKeywordNodeHandler.BuildUI(OwnerNode: TAstViewNode); var lbl: TTextNode; begin OwnerNode.Frameless := True; OwnerNode.BackgroundColor := TAlphaColors.Null; OwnerNode.BorderColor := TAlphaColors.Null; OwnerNode.BorderWidth := 0; // Compact representation for keywords OwnerNode.Margins := TMarginRect.Create(1, 0, 1, 0); OwnerNode.Padding := TMarginRect.Create(0, 0, 0, 0); lbl := OwnerNode.AddLabel(OwnerNode, ':' + FNode.Value.Name); lbl.Color := TAlphaColors.Mediumvioletred; lbl.Margins := TMarginRect.Create(1, 0, 1, 0); end; function TKeywordNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode; begin Result := TAst.Keyword(FNode.Identity.AsKeyword); end; { TNopNodeHandler } procedure TNopNodeHandler.BuildUI(OwnerNode: TAstViewNode); var lbl: TTextNode; begin OwnerNode.Frameless := True; OwnerNode.Alignment := TLayoutAlignment.laCenter; OwnerNode.Orientation := TLayoutOrientation.loHorizontal; lbl := OwnerNode.AddLabel(OwnerNode, '...'); lbl.FontSettings.Font.Style := [TFontStyle.fsBold]; lbl.Margins := TMarginRect.Create(8, 4, 8, 4); end; function TNopNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode; begin Result := FNode; end; end.