diff --git a/docs/advanced-filemaker-scripting-syntax.md b/docs/advanced-filemaker-scripting-syntax.md
index 8d1ba935..1353d46d 100644
--- a/docs/advanced-filemaker-scripting-syntax.md
+++ b/docs/advanced-filemaker-scripting-syntax.md
@@ -20,7 +20,7 @@ ever reads our own extended output.
## Core invariant
-> `ToDisplayLine()` and `FromDisplayParams()` together are lossless for
+> `ToDisplayLine()` and `PopulateFromDisplay()` together are lossless for
> every piece of state the POCO carries. XML state that is dropped is
> dropped because it carries no information, not because the display
> can't express it.
@@ -177,6 +177,6 @@ per-step extension. Covered here for completeness.
- `ScriptLineParser.ParseLine`
(`src/SharpFM.Model/Scripting/ScriptLineParser.cs`) — disabled-step
prefix and bracket tokenization.
-- `PerformScriptStep.FromDisplayParams`,
- `GoToLayoutStep.FromDisplayParams` — Form 1 regex parsers for named
+- `PerformScriptStep.PopulateFromDisplay`,
+ `GoToLayoutStep.PopulateFromDisplay` — Form 1 regex parsers for named
refs with `(#id)` suffixes.
diff --git a/src/SharpFM.Model/Scripting/Registry/StepMetadata.cs b/src/SharpFM.Model/Scripting/Registry/StepMetadata.cs
index fc2c4200..329423d1 100644
--- a/src/SharpFM.Model/Scripting/Registry/StepMetadata.cs
+++ b/src/SharpFM.Model/Scripting/Registry/StepMetadata.cs
@@ -1,6 +1,4 @@
-using System;
using System.Collections.Generic;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Registry;
@@ -12,12 +10,11 @@ namespace SharpFM.Model.Scripting.Registry;
/// discovers them via reflection at first access.
///
///
-/// The factory delegates (,
-/// ) live on the metadata so the registry can
-/// bridge them into the legacy StepXmlFactory and
-/// StepDisplayFactory surfaces without touching the POCO's
-/// declaration site. Once the legacy surfaces are retired the delegates
-/// become the sole construction path.
+/// Construction is not described here: always
+/// constructs a blank instance and calls its (possibly overridden)
+/// / .
+/// A step opts into hand-written parsing by overriding those methods, not
+/// by describing it on this record.
///
///
public sealed record StepMetadata
@@ -57,18 +54,4 @@ public sealed record StepMetadata
/// Behavioural intelligence — tooltip / lint source.
public StepNotes? Notes { get; init; }
-
- ///
- /// Delegate that constructs a POCO instance from a source
- /// <Step> element. Usually assigned via method-group
- /// reference to the POCO's static FromXml method.
- ///
- public Func? FromXml { get; init; }
-
- ///
- /// Delegate that constructs a POCO instance from parsed display-text
- /// tokens. Usually assigned via method-group reference to the POCO's
- /// static FromDisplayParams method.
- ///
- public Func? FromDisplay { get; init; }
}
diff --git a/src/SharpFM.Model/Scripting/Registry/StepRegistry.cs b/src/SharpFM.Model/Scripting/Registry/StepRegistry.cs
index a9921a66..9e7c0985 100644
--- a/src/SharpFM.Model/Scripting/Registry/StepRegistry.cs
+++ b/src/SharpFM.Model/Scripting/Registry/StepRegistry.cs
@@ -119,13 +119,26 @@ private static void Scan()
if (metadata.Id != 0)
_byId[metadata.Id] = metadata;
- // Bridge into legacy factories so callers that still use
- // StepXmlFactory / StepDisplayFactory pick up POCO-backed
- // construction without each POCO needing a ModuleInitializer.
- if (metadata.FromXml is { } fromXml)
- StepXmlFactory.Register(metadata.Name, fromXml);
- if (metadata.FromDisplay is { } fromDisplay)
- StepDisplayFactory.Register(metadata.Name, fromDisplay);
+ // Bridge into StepXmlFactory / StepDisplayFactory so dispatch finds
+ // the typed POCO without each POCO needing a ModuleInitializer.
+ // Every step is registered the same way — customization happens
+ // through virtual dispatch on the constructed instance
+ // (ScriptStep.PopulateFromXml / PopulateFromDisplay), not a
+ // per-step delegate lookup.
+ StepXmlFactory.Register(metadata.Name, el =>
+ {
+ var instance = (ScriptStep)Activator.CreateInstance(type, nonPublic: true)!;
+ instance.Enabled = el.Attribute("enable")?.Value != "False";
+ instance.PopulateFromXml(el);
+ return instance;
+ });
+ StepDisplayFactory.Register(metadata.Name, (enabled, hrParams) =>
+ {
+ var instance = (ScriptStep)Activator.CreateInstance(type, nonPublic: true)!;
+ instance.Enabled = enabled;
+ instance.PopulateFromDisplay(hrParams);
+ return instance;
+ });
}
// Sort for deterministic All iteration.
diff --git a/src/SharpFM.Model/Scripting/ScriptStep.cs b/src/SharpFM.Model/Scripting/ScriptStep.cs
index 05108dc4..fc4a2269 100644
--- a/src/SharpFM.Model/Scripting/ScriptStep.cs
+++ b/src/SharpFM.Model/Scripting/ScriptStep.cs
@@ -30,6 +30,18 @@ protected ScriptStep(bool enabled)
public abstract XElement ToXml();
public abstract string ToDisplayLine();
+ ///
+ /// Populates this instance from a source <Step> element.
+ /// is already set by the caller before this runs.
+ ///
+ protected internal abstract void PopulateFromXml(XElement step);
+
+ ///
+ /// Populates this instance from parsed display-text tokens.
+ /// is already set by the caller before this runs.
+ ///
+ protected internal abstract void PopulateFromDisplay(string[] hrParams);
+
public virtual List Validate(int lineIndex) => new();
///
diff --git a/src/SharpFM.Model/Scripting/ScriptStepOfT.cs b/src/SharpFM.Model/Scripting/ScriptStepOfT.cs
new file mode 100644
index 00000000..89fd1a59
--- /dev/null
+++ b/src/SharpFM.Model/Scripting/ScriptStepOfT.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Xml.Linq;
+using SharpFM.Model.Scripting.Registry;
+using SharpFM.Model.Scripting.Serialization;
+
+namespace SharpFM.Model.Scripting;
+
+///
+/// Self-typed base for shape-driven step POCOs (the curiously recurring
+/// pattern, as in ). Supplies the
+/// shape-engine serializers once — TSelf.Metadata resolves through
+/// the static-abstract constraint. A step
+/// overrides ,
+/// , ,
+/// or only where shape-driven behavior isn't sufficient;
+/// unrecognized state falls through to these generic defaults.
+///
+public abstract class ScriptStep : ScriptStep
+ where TSelf : ScriptStep, IStepFactory
+{
+ protected ScriptStep(bool enabled) : base(enabled) { }
+
+ public override XElement ToXml() => StepXmlRenderer.Render(this, TSelf.Metadata);
+
+ public override string ToDisplayLine() => StepDisplayRenderer.Render(this, TSelf.Metadata);
+
+ protected internal override void PopulateFromXml(XElement step) =>
+ StepXmlParser.Populate(this, step, TSelf.Metadata);
+
+ protected internal override void PopulateFromDisplay(string[] hrParams) =>
+ StepDisplayParser.Populate(this, hrParams, TSelf.Metadata);
+
+ /// Typed counterpart of the dispatch
+ /// for callers that already know the step kind.
+ public static TSelf Parse(XElement step)
+ {
+ var instance = (TSelf)Activator.CreateInstance(typeof(TSelf), nonPublic: true)!;
+ instance.Enabled = step.Attribute("enable")?.Value != "False";
+ instance.PopulateFromXml(step);
+ return instance;
+ }
+}
diff --git a/src/SharpFM.Model/Scripting/Serialization/StepDisplayParser.cs b/src/SharpFM.Model/Scripting/Serialization/StepDisplayParser.cs
index d01c1d5d..6f1f4506 100644
--- a/src/SharpFM.Model/Scripting/Serialization/StepDisplayParser.cs
+++ b/src/SharpFM.Model/Scripting/Serialization/StepDisplayParser.cs
@@ -33,7 +33,17 @@ public static ScriptStep Parse(Type pocoType, bool enabled, string[] hrParams, S
throw new InvalidOperationException(
$"{pocoType.Name} needs a parameterless constructor for shape-driven display parsing.");
instance.Enabled = enabled;
+ Populate(instance, hrParams, meta);
+ return instance;
+ }
+ ///
+ /// Populates an already-constructed instance's shape-bound properties
+ /// from parsed display-text tokens. is
+ /// not touched here — callers set it before invoking this.
+ ///
+ public static void Populate(ScriptStep instance, string[] hrParams, StepMetadata meta)
+ {
var slots = ShapeHrView.HrNodes(meta.Shape).Where(n => n is not HrOnly).ToList();
var used = new bool[slots.Count];
@@ -75,8 +85,6 @@ public static ScriptStep Parse(Type pocoType, bool enabled, string[] hrParams, S
bound = true;
}
}
-
- return instance;
}
private static void Assign(object target, ShapeNode node, string value)
diff --git a/src/SharpFM.Model/Scripting/Serialization/StepXmlParser.cs b/src/SharpFM.Model/Scripting/Serialization/StepXmlParser.cs
index cdbdc48a..55d401e4 100644
--- a/src/SharpFM.Model/Scripting/Serialization/StepXmlParser.cs
+++ b/src/SharpFM.Model/Scripting/Serialization/StepXmlParser.cs
@@ -29,11 +29,21 @@ public static ScriptStep Parse(Type pocoType, XElement step, StepMetadata meta)
$"{pocoType.Name} needs a parameterless constructor for shape-driven parsing.");
instance.Enabled = step.Attribute("enable")?.Value != "False";
+ Populate(instance, step, meta);
+ return instance;
+ }
+
+ ///
+ /// Populates an already-constructed instance's shape-bound properties
+ /// from a source <Step> element.
+ /// is not touched here — callers set it before invoking this.
+ ///
+ public static void Populate(ScriptStep instance, XElement step, StepMetadata meta)
+ {
foreach (var node in meta.Shape)
- Populate(instance, step, node);
+ PopulateNode(instance, step, node);
CapturePassthrough(instance, step, meta.Shape);
- return instance;
}
///
@@ -58,7 +68,7 @@ private static void CapturePassthrough(object target, XElement parent, IReadOnly
: extras);
}
- private static void Populate(object target, XElement step, ShapeNode node)
+ private static void PopulateNode(object target, XElement step, ShapeNode node)
{
switch (node)
{
@@ -177,7 +187,7 @@ private static void Populate(object target, XElement step, ShapeNode node)
if (wrapper is not null)
{
foreach (var child in w.Children)
- Populate(target, wrapper, child);
+ PopulateNode(target, wrapper, child);
CapturePassthrough(target, wrapper, w.Children);
}
return;
@@ -202,7 +212,7 @@ private static void Populate(object target, XElement step, ShapeNode node)
// its init-only positional properties.
var value = CreateBlank(match.WhenType);
foreach (var child in match.Children)
- Populate(value, step, child);
+ PopulateNode(value, step, child);
Set(target, prop, value);
return;
}
diff --git a/src/SharpFM.Model/Scripting/Steps/AVPlayerPlayStep.cs b/src/SharpFM.Model/Scripting/Steps/AVPlayerPlayStep.cs
index 82061c56..ae05c0a3 100644
--- a/src/SharpFM.Model/Scripting/Steps/AVPlayerPlayStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/AVPlayerPlayStep.cs
@@ -1,15 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class AVPlayerPlayStep : ScriptStep, IStepFactory
+public sealed class AVPlayerPlayStep : ScriptStep, IStepFactory
{
public const int XmlId = 177;
public const string XmlName = "AVPlayer Play";
@@ -84,17 +82,12 @@ public AVPlayerPlayStep(
private static string PresentationHr(string x) => _PresentationToHr.TryGetValue(x, out var h) ? h : x;
private static string PresentationXml(string h) => _PresentationFromHr.TryGetValue(h, out var x) ? x : h;
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: Hide Controls / Disable Interaction map the wire's
// "True"/absent values to On/Off, a translation display metadata cannot
// express without widening the nodes' wire ValidValues.
public override string ToDisplayLine() =>
"AVPlayer Play [ " + SourceHr(Source) + " ; " + "Repetition: " + (Repetition?.Text ?? "") + " ; " + "Presentation: " + PresentationHr(Presentation) + " ; " + "Position: " + (Position?.Text ?? "") + " ; " + "Start Offset: " + (StartOffset?.Text ?? "") + " ; " + "End Offset: " + (EndOffset?.Text ?? "") + " ; " + "Hide Controls: " + (HideControls == "True" ? "On" : "Off") + " ; " + "Disable Interaction: " + (DisableInteraction == "True" ? "On" : "Off") + " ]";
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
///
/// Display edits are anchor-preserved when a toggle is explicitly stored
/// as False: the display renders both the absent and the explicit-False
@@ -103,7 +96,7 @@ public override string ToDisplayLine() =>
public override bool IsFullyEditable =>
HideControls != "False" && DisableInteraction != "False";
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
var tokens = hrParams.Select(h => h.Trim()).ToArray();
// The leading unlabeled token is the source enum.
@@ -126,7 +119,14 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
foreach (var tok in tokens) { if (tok.StartsWith("Hide Controls:", StringComparison.OrdinalIgnoreCase)) { var v = tok.Substring(14).Trim(); hideControls_v = v.Equals("On", StringComparison.OrdinalIgnoreCase) ? "True" : ""; break; } }
string disableInteraction_v = "";
foreach (var tok in tokens) { if (tok.StartsWith("Disable Interaction:", StringComparison.OrdinalIgnoreCase)) { var v = tok.Substring(20).Trim(); disableInteraction_v = v.Equals("On", StringComparison.OrdinalIgnoreCase) ? "True" : ""; break; } }
- return new AVPlayerPlayStep(source_v, repetition_v, presentation_v, position_v, startOffset_v, endOffset_v, hideControls_v, disableInteraction_v, enabled);
+ Source = source_v;
+ Repetition = repetition_v;
+ Presentation = presentation_v;
+ Position = position_v;
+ StartOffset = startOffset_v;
+ EndOffset = endOffset_v;
+ HideControls = hideControls_v;
+ DisableInteraction = disableInteraction_v;
}
public static StepMetadata Metadata { get; } = new()
@@ -150,7 +150,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
new EnumValueChild("HideControls") { PocoProperty = "HideControls", HrLabel = "Hide Controls", Optional = true, DisplayValues = ["On", "Off"] },
new EnumValueChild("DisableInteraction") { PocoProperty = "DisableInteraction", HrLabel = "Disable Interaction", Optional = true, DisplayValues = ["On", "Off"] },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/AVPlayerSetOptionsStep.cs b/src/SharpFM.Model/Scripting/Steps/AVPlayerSetOptionsStep.cs
index 7998481d..d277d643 100644
--- a/src/SharpFM.Model/Scripting/Steps/AVPlayerSetOptionsStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/AVPlayerSetOptionsStep.cs
@@ -1,15 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class AVPlayerSetOptionsStep : ScriptStep, IStepFactory
+public sealed class AVPlayerSetOptionsStep : ScriptStep, IStepFactory
{
public const int XmlId = 179;
public const string XmlName = "AVPlayer Set Options";
@@ -114,16 +112,11 @@ public AVPlayerSetOptionsStep(
private static string SequenceHr(string x) => _SequenceToHr.TryGetValue(x, out var h) ? h : x;
private static string SequenceXml(string h) => _SequenceFromHr.TryGetValue(h, out var x) ? x : h;
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: option toggles map the wire's "True"/absent values to
// On/Off, a translation display metadata cannot express.
public override string ToDisplayLine() =>
"AVPlayer Set Options [ " + "Presentation: " + PresentationHr(Presentation) + " ; " + "Disable Interaction: " + (DisableInteraction == "True" ? "On" : "Off") + " ; " + "Hide Controls: " + (HideControls == "True" ? "On" : "Off") + " ; " + "Disable External Controls: " + (DisableExternalControls == "True" ? "On" : "Off") + " ; " + "Pause in Background: " + (PauseInBackground == "True" ? "On" : "Off") + " ; " + "Position: " + (Position?.Text ?? "") + " ; " + "Start Offset: " + (StartOffset?.Text ?? "") + " ; " + "End Offset: " + (EndOffset?.Text ?? "") + " ; " + "Volume: " + (Volume?.Text ?? "") + " ; " + "Zoom: " + ZoomHr(Zoom) + " ; " + "Sequence: " + SequenceHr(Sequence) + " ]";
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
///
/// Display edits are anchor-preserved when a toggle is explicitly stored
/// as False: the display renders both the absent and the explicit-False
@@ -133,7 +126,7 @@ public override string ToDisplayLine() =>
DisableInteraction != "False" && HideControls != "False"
&& DisableExternalControls != "False" && PauseInBackground != "False";
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
var tokens = hrParams.Select(h => h.Trim()).ToArray();
string presentation_v = "Start Full Screen";
@@ -160,7 +153,17 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
foreach (var tok in tokens) { if (tok.StartsWith("Zoom:", StringComparison.OrdinalIgnoreCase)) { var v = tok.Substring(5).Trim(); zoom_v = ZoomXml(v); break; } }
string sequence_v = "None";
foreach (var tok in tokens) { if (tok.StartsWith("Sequence:", StringComparison.OrdinalIgnoreCase)) { var v = tok.Substring(9).Trim(); sequence_v = SequenceXml(v); break; } }
- return new AVPlayerSetOptionsStep(presentation_v, disableInteraction_v, hideControls_v, disableExternalControls_v, pauseInBackground_v, position_v, startOffset_v, endOffset_v, volume_v, zoom_v, sequence_v, enabled);
+ Presentation = presentation_v;
+ DisableInteraction = disableInteraction_v;
+ HideControls = hideControls_v;
+ DisableExternalControls = disableExternalControls_v;
+ PauseInBackground = pauseInBackground_v;
+ Position = position_v;
+ StartOffset = startOffset_v;
+ EndOffset = endOffset_v;
+ Volume = volume_v;
+ Zoom = zoom_v;
+ Sequence = sequence_v;
}
public static StepMetadata Metadata { get; } = new()
@@ -186,7 +189,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
new EnumValueChild("Zoom") { PocoProperty = "Zoom", HrLabel = "Zoom", Optional = true, DisplayValues = ["Fit", "Fill", "Stretch", "Fit Only", "Fill Only", "Stretch Only"] },
new EnumValueChild("Sequence") { PocoProperty = "Sequence", HrLabel = "Sequence", Optional = true, DisplayValues = ["None", "Next", "Previous"] },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/AVPlayerSetPlaybackStateStep.cs b/src/SharpFM.Model/Scripting/Steps/AVPlayerSetPlaybackStateStep.cs
index 1d87d87a..c766f2c5 100644
--- a/src/SharpFM.Model/Scripting/Steps/AVPlayerSetPlaybackStateStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/AVPlayerSetPlaybackStateStep.cs
@@ -1,8 +1,6 @@
using System;
using System.Collections.Generic;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -13,7 +11,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// enum child. XML values and human-readable display values are mapped
/// through the static HR tables; round-trip preserves the XML value.
///
-public sealed class AVPlayerSetPlaybackStateStep : ScriptStep, IStepFactory
+public sealed class AVPlayerSetPlaybackStateStep : ScriptStep, IStepFactory
{
public const int XmlId = 178;
public const string XmlName = "AVPlayer Set Playback State";
@@ -29,16 +27,6 @@ public AVPlayerSetPlaybackStateStep(string playbackState = "Stopped", bool enabl
PlaybackState = playbackState;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -50,7 +38,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new EnumValueChild("PlaybackState") { PocoProperty = "PlaybackState", DefaultValue = "Stopped", ValidValues = ["Stopped", "Paused", "Playing"] },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/AddAccountStep.cs b/src/SharpFM.Model/Scripting/Steps/AddAccountStep.cs
index 1ac442bc..a68e93a9 100644
--- a/src/SharpFM.Model/Scripting/Steps/AddAccountStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/AddAccountStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
@@ -12,7 +10,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <AddAccount> wrapper holding the text <AccountType>
/// and the optional account name / password / privilege-set fields.
///
-public sealed class AddAccountStep : ScriptStep, IStepFactory
+public sealed class AddAccountStep : ScriptStep, IStepFactory
{
public const int XmlId = 134;
public const string XmlName = "Add Account";
@@ -41,16 +39,6 @@ public AddAccountStep(
ExpirePassword = expirePassword;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -70,7 +58,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new NamedTextChild("PrivilegeSet") { PocoProperty = "PrivilegeSet", HrLabel = "Privilege Set", Optional = true, Display = DisplayMode.Native, DisplayEmptyAs = "" },
]),
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/AdjustWindowStep.cs b/src/SharpFM.Model/Scripting/Steps/AdjustWindowStep.cs
index cecc82f0..f91c1635 100644
--- a/src/SharpFM.Model/Scripting/Steps/AdjustWindowStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/AdjustWindowStep.cs
@@ -1,8 +1,6 @@
using System;
using System.Collections.Generic;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -13,7 +11,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// enum child. XML values and human-readable display values are mapped
/// through the static HR tables; round-trip preserves the XML value.
///
-public sealed class AdjustWindowStep : ScriptStep, IStepFactory
+public sealed class AdjustWindowStep : ScriptStep, IStepFactory
{
public const int XmlId = 31;
public const string XmlName = "Adjust Window";
@@ -29,16 +27,6 @@ public AdjustWindowStep(string windowState = "ResizeToFit", bool enabled = true)
WindowState = windowState;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -50,7 +38,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new EnumValueChild("WindowState") { PocoProperty = "WindowState", DefaultValue = "ResizeToFit", ValidValues = ["Resize to Fit", "Maximize", "Minimize", "Restore", "Hide"] },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/AllowFormattingBarStep.cs b/src/SharpFM.Model/Scripting/Steps/AllowFormattingBarStep.cs
index d1678329..3640a83e 100644
--- a/src/SharpFM.Model/Scripting/Steps/AllowFormattingBarStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/AllowFormattingBarStep.cs
@@ -1,7 +1,5 @@
using System;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -11,7 +9,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name) plus a single
/// <Set state="True|False"/> child. All round-tripped.
///
-public sealed class AllowFormattingBarStep : ScriptStep, IStepFactory
+public sealed class AllowFormattingBarStep : ScriptStep, IStepFactory
{
public const int XmlId = 115;
public const string XmlName = "Allow Formatting Bar";
@@ -27,16 +25,6 @@ public AllowFormattingBarStep(bool set = false, bool enabled = true)
Set = set;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -44,7 +32,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
Category = "miscellaneous",
HelpUrl = "https://help.claris.com/en/pro-help/content/allow-formatting-bar.html",
Shape = [new BoolStateChild("Set")],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/AllowUserAbortStep.cs b/src/SharpFM.Model/Scripting/Steps/AllowUserAbortStep.cs
index 2b32618e..37faa9a9 100644
--- a/src/SharpFM.Model/Scripting/Steps/AllowUserAbortStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/AllowUserAbortStep.cs
@@ -1,7 +1,5 @@
using System;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -11,7 +9,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name) plus a single
/// <Set state="True|False"/> child. All round-tripped.
///
-public sealed class AllowUserAbortStep : ScriptStep, IStepFactory
+public sealed class AllowUserAbortStep : ScriptStep, IStepFactory
{
public const int XmlId = 85;
public const string XmlName = "Allow User Abort";
@@ -27,23 +25,11 @@ public AllowUserAbortStep(bool set = false, bool enabled = true)
Set = set;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "control",
Shape = [new BoolStateChild("Set")],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/AppendPdfStep.cs b/src/SharpFM.Model/Scripting/Steps/AppendPdfStep.cs
index ccfd5a9b..c69a5dde 100644
--- a/src/SharpFM.Model/Scripting/Steps/AppendPdfStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/AppendPdfStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
@@ -12,7 +10,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <UniversalPathList>, and the <AppendPDFFile>
/// wrapper carries the save type plus an optional open-password calculation.
///
-public sealed class AppendPdfStep : ScriptStep, IStepFactory
+public sealed class AppendPdfStep : ScriptStep, IStepFactory
{
public const int XmlId = 244;
public const string XmlName = "Append PDF";
@@ -38,13 +36,6 @@ public AppendPdfStep(
OpenPassword = openPassword;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
///
/// Display edits are anchor-preserved when state the display line cannot
/// carry is present: an open-password calculation or a non-default save
@@ -54,7 +45,7 @@ public AppendPdfStep(
// Hand-written: couples the hidden Option wire flag to path presence,
// which the shape parser cannot express.
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
string path = "";
foreach (var tok in hrParams)
@@ -62,7 +53,10 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
var t = tok.Trim();
if (!string.IsNullOrWhiteSpace(t)) { path = t; break; }
}
- return new AppendPdfStep(!string.IsNullOrEmpty(path), path, "File", null, enabled);
+ SpecifyFile = !string.IsNullOrEmpty(path);
+ Path = path;
+ SaveType = "File";
+ OpenPassword = null;
}
public static StepMetadata Metadata { get; } = new()
@@ -87,7 +81,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
// slot, mirroring the legacy AppendPDFFile param.
new HrOnly("AppendPDFFile"),
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ArrangeAllWindowsStep.cs b/src/SharpFM.Model/Scripting/Steps/ArrangeAllWindowsStep.cs
index acf9683d..133ae73c 100644
--- a/src/SharpFM.Model/Scripting/Steps/ArrangeAllWindowsStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ArrangeAllWindowsStep.cs
@@ -1,8 +1,6 @@
using System;
using System.Collections.Generic;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -13,7 +11,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// enum child. XML values and human-readable display values are mapped
/// through the static HR tables; round-trip preserves the XML value.
///
-public sealed class ArrangeAllWindowsStep : ScriptStep, IStepFactory
+public sealed class ArrangeAllWindowsStep : ScriptStep, IStepFactory
{
public const int XmlId = 120;
public const string XmlName = "Arrange All Windows";
@@ -29,16 +27,6 @@ public ArrangeAllWindowsStep(string windowArrangement = "Cascade Window", bool e
WindowArrangement = windowArrangement;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -50,7 +38,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new EnumValueChild("WindowArrangement") { PocoProperty = "WindowArrangement", DefaultValue = "Cascade Window", ValidValues = ["Tile Horizontally", "Tile Vertically", "Cascade Window", "Bring All To Front"] },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/BeepStep.cs b/src/SharpFM.Model/Scripting/Steps/BeepStep.cs
index 35963886..dd899e30 100644
--- a/src/SharpFM.Model/Scripting/Steps/BeepStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/BeepStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -15,7 +13,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// exist in FM Pro's clipboard output. No advanced-syntax extensions are
/// required; the step's display text is literally its name.
///
-public sealed class BeepStep : ScriptStep, IStepFactory
+public sealed class BeepStep : ScriptStep, IStepFactory
{
public const int XmlId = 93;
public const string XmlName = "Beep";
@@ -24,23 +22,11 @@ private BeepStep() : base(false) { }
public BeepStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "miscellaneous",
HelpUrl = "https://help.claris.com/en/pro-help/content/beep.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/CancelPdfStep.cs b/src/SharpFM.Model/Scripting/Steps/CancelPdfStep.cs
index 5d55a9ea..03ab8482 100644
--- a/src/SharpFM.Model/Scripting/Steps/CancelPdfStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CancelPdfStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -8,7 +6,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// Cancel PDF aborts an in-progress multi-step PDF assembly. It carries no
/// parameters — the canonical form is an empty <Step> element.
///
-public sealed class CancelPdfStep : ScriptStep, IStepFactory
+public sealed class CancelPdfStep : ScriptStep, IStepFactory
{
public const int XmlId = 247;
public const string XmlName = "Cancel PDF";
@@ -17,23 +15,11 @@ private CancelPdfStep() : base(false) { }
public CancelPdfStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "files",
HelpUrl = "https://help.claris.com/en/pro-help/content/cancel-pdf.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ChangePasswordStep.cs b/src/SharpFM.Model/Scripting/Steps/ChangePasswordStep.cs
index 3d5d6543..d49f27e5 100644
--- a/src/SharpFM.Model/Scripting/Steps/ChangePasswordStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ChangePasswordStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class ChangePasswordStep : ScriptStep, IStepFactory
+public sealed class ChangePasswordStep : ScriptStep, IStepFactory
{
public const int XmlId = 83;
public const string XmlName = "Change Password";
@@ -37,16 +35,6 @@ public ChangePasswordStep(
WithDialog = withDialog;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -62,7 +50,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new NamedCalcChild("NewPassword") { PocoProperty = "Password", HrLabel = "Password", Optional = true, DisplayEmptyAs = "" },
new BoolStateChild("NoInteract") { PocoProperty = "NoInteract", HrLabel = "With dialog", DisplayInverted = true },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/CheckFoundSetStep.cs b/src/SharpFM.Model/Scripting/Steps/CheckFoundSetStep.cs
index d26e65f5..bdd842b3 100644
--- a/src/SharpFM.Model/Scripting/Steps/CheckFoundSetStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CheckFoundSetStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -9,7 +7,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name). All round-tripped exactly.
/// No child elements in FM Pro's clipboard output; no hidden state.
///
-public sealed class CheckFoundSetStep : ScriptStep, IStepFactory
+public sealed class CheckFoundSetStep : ScriptStep, IStepFactory
{
public const int XmlId = 20;
public const string XmlName = "Check Found Set";
@@ -18,23 +16,11 @@ private CheckFoundSetStep() : base(false) { }
public CheckFoundSetStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "spelling",
HelpUrl = "https://help.claris.com/en/pro-help/content/check-found-set.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/CheckRecordStep.cs b/src/SharpFM.Model/Scripting/Steps/CheckRecordStep.cs
index bac761a6..b7d048f4 100644
--- a/src/SharpFM.Model/Scripting/Steps/CheckRecordStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CheckRecordStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -9,7 +7,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name). All round-tripped exactly.
/// No child elements in FM Pro's clipboard output; no hidden state.
///
-public sealed class CheckRecordStep : ScriptStep, IStepFactory
+public sealed class CheckRecordStep : ScriptStep, IStepFactory
{
public const int XmlId = 19;
public const string XmlName = "Check Record";
@@ -18,23 +16,11 @@ private CheckRecordStep() : base(false) { }
public CheckRecordStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "spelling",
HelpUrl = "https://help.claris.com/en/pro-help/content/check-record.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/CheckSelectionStep.cs b/src/SharpFM.Model/Scripting/Steps/CheckSelectionStep.cs
index 876a35c0..ff4f595a 100644
--- a/src/SharpFM.Model/Scripting/Steps/CheckSelectionStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CheckSelectionStep.cs
@@ -1,14 +1,12 @@
using System;
using System.Linq;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class CheckSelectionStep : ScriptStep, IStepFactory
+public sealed class CheckSelectionStep : ScriptStep, IStepFactory
{
public const int XmlId = 18;
public const string XmlName = "Check Selection";
@@ -28,16 +26,6 @@ public CheckSelectionStep(
Target = target;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -51,7 +39,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new BoolStateChild("SelectAll") { PocoProperty = "Select", HrLabel = "Select", ValidValues = ["On", "Off"], DefaultValue = "True" },
new FieldChild("Field") { PocoProperty = "Target", Optional = true, DisplayEmptyAs = "" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ClearStep.cs b/src/SharpFM.Model/Scripting/Steps/ClearStep.cs
index 9aace375..db0f6b56 100644
--- a/src/SharpFM.Model/Scripting/Steps/ClearStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ClearStep.cs
@@ -1,14 +1,12 @@
using System;
using System.Linq;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class ClearStep : ScriptStep, IStepFactory
+public sealed class ClearStep : ScriptStep, IStepFactory
{
public const int XmlId = 49;
public const string XmlName = "Clear";
@@ -28,16 +26,6 @@ public ClearStep(
Target = target;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -51,7 +39,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new BoolStateChild("SelectAll") { PocoProperty = "Select", HrLabel = "Select", ValidValues = ["On", "Off"], DefaultValue = "True" },
new FieldChild("Field") { PocoProperty = "Target", Optional = true, DisplayEmptyAs = "" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/CloseDataFileStep.cs b/src/SharpFM.Model/Scripting/Steps/CloseDataFileStep.cs
index 41b96df5..82aba7e0 100644
--- a/src/SharpFM.Model/Scripting/Steps/CloseDataFileStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CloseDataFileStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class CloseDataFileStep : ScriptStep, IStepFactory
+public sealed class CloseDataFileStep : ScriptStep, IStepFactory
{
public const int XmlId = 196;
public const string XmlName = "Close Data File";
@@ -23,16 +21,6 @@ public CloseDataFileStep(
FileID = fileID;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -44,7 +32,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new BareCalcChild { PocoProperty = "FileID", HrLabel = "File ID", Optional = true, DisplayEmptyAs = "" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/CloseFileStep.cs b/src/SharpFM.Model/Scripting/Steps/CloseFileStep.cs
index 84d7e9cc..1aa3a3ee 100644
--- a/src/SharpFM.Model/Scripting/Steps/CloseFileStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CloseFileStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class CloseFileStep : ScriptStep, IStepFactory
+public sealed class CloseFileStep : ScriptStep, IStepFactory
{
public const int XmlId = 34;
public const string XmlName = "Close File";
@@ -21,8 +19,6 @@ public CloseFileStep(FileReference? file = null, bool enabled = true)
File = file;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: the token comes from the FileReference value type
// (absence means "Current File"), which the shape-driven renderer
// cannot surface.
@@ -31,10 +27,7 @@ File is null
? "Close File [ Current File ]"
: $"Close File [ {File.ToDisplayString()} ]";
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
FileReference? file = null;
foreach (var tok in hrParams)
@@ -44,7 +37,7 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
file = FileReference.FromDisplayToken(t);
break;
}
- return new CloseFileStep(file, enabled);
+ File = file;
}
public static StepMetadata Metadata { get; } = new()
@@ -56,7 +49,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
// FileReference is emitted only when a specific file is configured;
// its absence means "Current File".
Shape = [new ValueTypeChild("FileReference") { PocoProperty = "File", Optional = true }],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ClosePdfStep.cs b/src/SharpFM.Model/Scripting/Steps/ClosePdfStep.cs
index 8bf29418..95050859 100644
--- a/src/SharpFM.Model/Scripting/Steps/ClosePdfStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ClosePdfStep.cs
@@ -1,7 +1,5 @@
using System.Collections.Generic;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -12,7 +10,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// an optional output path, and a <ClosePDFFile> wrapper holding
/// the save type.
///
-public sealed class ClosePdfStep : ScriptStep, IStepFactory
+public sealed class ClosePdfStep : ScriptStep, IStepFactory
{
public const int XmlId = 245;
public const string XmlName = "Close PDF";
@@ -41,8 +39,6 @@ public ClosePdfStep(
SaveType = saveType;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: AutoOpen/CreateEmail render as conditional bare tokens,
// a form a BoolStateChild cannot produce (it always renders On/Off).
public override string ToDisplayLine()
@@ -56,10 +52,7 @@ public override string ToDisplayLine()
: $"Close PDF [ {string.Join(" ; ", parts)} ]";
}
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
bool autoOpen = false, createEmail = false;
string path = "";
@@ -71,7 +64,11 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
else if (t.Equals("Create email", System.StringComparison.OrdinalIgnoreCase)) createEmail = true;
else if (!pathSeen && !string.IsNullOrWhiteSpace(t)) { path = t; pathSeen = true; }
}
- return new ClosePdfStep(false, autoOpen, createEmail, path, "File", enabled);
+ CreateDirectories = false;
+ AutoOpen = autoOpen;
+ CreateEmail = createEmail;
+ Path = path;
+ SaveType = "File";
}
public static StepMetadata Metadata { get; } = new()
@@ -97,7 +94,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
// mirroring the legacy ClosePDFFile param.
new HrOnly("ClosePDFFile"),
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ClosePopoverStep.cs b/src/SharpFM.Model/Scripting/Steps/ClosePopoverStep.cs
index bb5873da..ec682eca 100644
--- a/src/SharpFM.Model/Scripting/Steps/ClosePopoverStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ClosePopoverStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -9,7 +7,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name). All round-tripped exactly.
/// No child elements in FM Pro's clipboard output; no hidden state.
///
-public sealed class ClosePopoverStep : ScriptStep, IStepFactory
+public sealed class ClosePopoverStep : ScriptStep, IStepFactory
{
public const int XmlId = 169;
public const string XmlName = "Close Popover";
@@ -18,23 +16,11 @@ private ClosePopoverStep() : base(false) { }
public ClosePopoverStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "navigation",
HelpUrl = "https://help.claris.com/en/pro-help/content/close-popover.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/CloseWindowStep.cs b/src/SharpFM.Model/Scripting/Steps/CloseWindowStep.cs
index 87750a23..4666641a 100644
--- a/src/SharpFM.Model/Scripting/Steps/CloseWindowStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CloseWindowStep.cs
@@ -1,15 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class CloseWindowStep : ScriptStep, IStepFactory
+public sealed class CloseWindowStep : ScriptStep, IStepFactory
{
public const int XmlId = 121;
public const string XmlName = "Close Window";
@@ -45,17 +43,12 @@ public CloseWindowStep(
private static string WindowHr(string x) => _WindowToHr.TryGetValue(x, out var h) ? h : x;
private static string WindowXml(string h) => _WindowFromHr.TryGetValue(h, out var x) ? x : h;
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: variant window-target grammar (Current/ByName) the shape
// renderer cannot produce.
public override string ToDisplayLine() =>
"Close Window [ " + (LimitToWindowsOfCurrentFile ? "On" : "Off") + " ; " + WindowHr(Window) + " ; " + Calculation.Text + " ]";
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
// Positional display grammar: [ On/Off ; Window ; name-calc ]. A
// trailing empty calc token is dropped by the param splitter.
@@ -66,7 +59,9 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
Calculation? calculation_v = tokens.Length > 2 && tokens[2].Length > 0
? new Calculation(tokens[2])
: null;
- return new CloseWindowStep(limitToWindowsOfCurrentFile_v, window_v, calculation_v, enabled);
+ LimitToWindowsOfCurrentFile = limitToWindowsOfCurrentFile_v;
+ Window = window_v;
+ Calculation = calculation_v ?? new Calculation("");
}
public static StepMetadata Metadata { get; } = new()
@@ -83,7 +78,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
new EnumValueChild("Window") { PocoProperty = "Window", DefaultValue = "ByName", DisplayValues = ["ByName", "Current"], Display = DisplayMode.Native },
new NamedCalcChild("Name") { PocoProperty = "Calculation", Optional = true, Display = DisplayMode.Native },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/CommentStep.cs b/src/SharpFM.Model/Scripting/Steps/CommentStep.cs
index 4126ad01..2303664c 100644
--- a/src/SharpFM.Model/Scripting/Steps/CommentStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CommentStep.cs
@@ -1,6 +1,5 @@
using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -11,7 +10,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// visible ⏎ (U+23CE) return glyph so the comment stays on a
/// single editor line. The glyph is reversed to a real newline on parse.
///
-public sealed class CommentStep : ScriptStep, IStepFactory
+public sealed class CommentStep : ScriptStep, IStepFactory
{
public const int XmlId = 89;
public const string XmlName = "# (comment)";
@@ -23,30 +22,27 @@ public sealed class CommentStep : ScriptStep, IStepFactory
public string Text { get; set; }
+ private CommentStep() : base(false) { Text = ""; }
+
public CommentStep(bool enabled, string text)
: base(enabled)
{
Text = text;
}
- // Hand-written rather than StepXmlParser: the reader must normalize the
- // clipboard's CR/CRLF newlines to LF, a text transform the shape engine
- // does not express.
- public static new ScriptStep FromXml(XElement step)
+ // Hand-written: normalizes the clipboard's CR/CRLF newlines to LF, a
+ // text transform the shape engine does not express.
+ protected internal override void PopulateFromXml(XElement step)
{
- var enabled = step.Attribute("enable")?.Value != "False";
// Normalize all line endings to \n. FM Pro's clipboard XML uses
//
(CR) as its canonical newline; those must not leak into
// the display document because AvaloniaEdit would treat them as
// visual line breaks, desynchronizing the editor's line numbers
// from MultiLineStatementRanges (which splits on \n only).
var raw = step.Element("Text")?.Value ?? "";
- var text = NormalizeNewlines(raw);
- return new CommentStep(enabled, text);
+ Text = NormalizeNewlines(raw);
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: the comment grammar (# prefix, no brackets) is outside
// the shared "Name [ tokens ]" display form.
public override string ToDisplayLine() =>
@@ -57,14 +53,13 @@ public override string ToDisplayLine() =>
? string.Empty
: "# " + Text.Replace("\n", ReturnGlyph.ToString());
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
// ScriptLineParser routes a comment through as a single hrParam
// containing everything after the '#' (TrimStart'd). Restore any
// ⏎ glyphs back to real newlines before storing.
var raw = hrParams.Length > 0 ? hrParams[0] : "";
- var text = raw.Replace(ReturnGlyph.ToString(), "\n");
- return new CommentStep(enabled, text);
+ Text = raw.Replace(ReturnGlyph.ToString(), "\n");
}
public static StepMetadata Metadata { get; } = new()
@@ -78,8 +73,6 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
[
new NamedTextChild("Text") { Optional = true },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
// CR/LF/CRLF → LF. Critical because any raw CR leaking into the
diff --git a/src/SharpFM.Model/Scripting/Steps/CommitRecordsRequestsStep.cs b/src/SharpFM.Model/Scripting/Steps/CommitRecordsRequestsStep.cs
index 42dfac52..013f39d4 100644
--- a/src/SharpFM.Model/Scripting/Steps/CommitRecordsRequestsStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CommitRecordsRequestsStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -11,7 +9,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// to state="False"). Two additional flags skip data-entry
/// validation and force-commit through external SQL lock conflicts.
///
-public sealed class CommitRecordsRequestsStep : ScriptStep, IStepFactory
+public sealed class CommitRecordsRequestsStep : ScriptStep, IStepFactory
{
public const int XmlId = 75;
public const string XmlName = "Commit Records/Requests";
@@ -40,16 +38,6 @@ public CommitRecordsRequestsStep(
ForceCommit = forceCommit;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -62,7 +50,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new BoolStateChild("Option") { PocoProperty = "SkipDataEntryValidation", HrLabel = "Skip data entry validation" },
new BoolStateChild("ESSForceCommit") { PocoProperty = "ForceCommit", HrLabel = "Force commit" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/CommitTransactionStep.cs b/src/SharpFM.Model/Scripting/Steps/CommitTransactionStep.cs
index eb1bd032..fdd2a3e0 100644
--- a/src/SharpFM.Model/Scripting/Steps/CommitTransactionStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CommitTransactionStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -9,7 +7,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name). All round-tripped exactly.
/// No child elements in FM Pro's clipboard output; no hidden state.
///
-public sealed class CommitTransactionStep : ScriptStep, IStepFactory
+public sealed class CommitTransactionStep : ScriptStep, IStepFactory
{
public const int XmlId = 206;
public const string XmlName = "Commit Transaction";
@@ -18,23 +16,11 @@ private CommitTransactionStep() : base(false) { }
public CommitTransactionStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "control",
HelpUrl = "https://help.claris.com/en/pro-help/content/commit-transaction.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ConfigureAIAccountStep.cs b/src/SharpFM.Model/Scripting/Steps/ConfigureAIAccountStep.cs
index 5cb134da..1200710e 100644
--- a/src/SharpFM.Model/Scripting/Steps/ConfigureAIAccountStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ConfigureAIAccountStep.cs
@@ -1,9 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
@@ -16,7 +14,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// endpoint and API key. is nullable so an
/// absent flag stays distinct from a present "False".
///
-public sealed class ConfigureAIAccountStep : ScriptStep, IStepFactory
+public sealed class ConfigureAIAccountStep : ScriptStep, IStepFactory
{
public const int XmlId = 212;
public const string XmlName = "Configure AI Account";
@@ -62,17 +60,12 @@ public ConfigureAIAccountStep(
private static string ModelProviderHr(string x) => _ModelProviderToHr.TryGetValue(x, out var h) ? h : x;
private static string ModelProviderXml(string h) => _ModelProviderFromHr.TryGetValue(h, out var x) ? x : h;
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: FileMaker's token order (Account Name before Model
// Provider, SSL flag fourth) diverges from the canonical XML order, and
// the nullable SSL flag renders absent and explicit-False identically.
public override string ToDisplayLine() =>
"Configure AI Account [ " + "Account Name: " + AccountName.Text + " ; " + "Model Provider: " + ModelProviderHr(ModelProvider) + " ; " + "Endpoint: " + Endpoint.Text + " ; " + "Verify SSL Certificates: " + (VerifySSLCertificates == true ? "On" : "Off") + " ; " + "API key: " + APIKey.Text + " ]";
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
///
/// Display edits are anchor-preserved when the SSL flag is explicitly
/// stored as False: the display renders both the absent and the
@@ -80,7 +73,7 @@ public override string ToDisplayLine() =>
///
public override bool IsFullyEditable => VerifySSLCertificates != false;
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
var tokens = hrParams.Select(h => h.Trim()).ToArray();
Calculation? accountName_v = null;
@@ -95,7 +88,11 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
foreach (var tok in tokens) { if (tok.StartsWith("Verify SSL Certificates:", StringComparison.OrdinalIgnoreCase)) { var v = tok.Substring(24).Trim(); verifySSLCertificates_v = v.Equals("On", StringComparison.OrdinalIgnoreCase) ? true : null; break; } }
Calculation? aPIKey_v = null;
foreach (var tok in tokens) { if (tok.StartsWith("API key:", StringComparison.OrdinalIgnoreCase)) { aPIKey_v = new Calculation(tok.Substring(8).Trim()); break; } }
- return new ConfigureAIAccountStep(accountName_v, modelProvider_v, endpoint_v, verifySSLCertificates_v, aPIKey_v, enabled);
+ AccountName = accountName_v ?? new Calculation("");
+ ModelProvider = modelProvider_v;
+ Endpoint = endpoint_v ?? new Calculation("");
+ VerifySSLCertificates = verifySSLCertificates_v;
+ APIKey = aPIKey_v ?? new Calculation("");
}
public static StepMetadata Metadata { get; } = new()
@@ -116,7 +113,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
new NamedCalcChild("AccessAPIKey") { PocoProperty = "APIKey", HrLabel = "API key", Optional = true, Display = DisplayMode.Augmented },
]),
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ConfigureLocalNotificationStep.cs b/src/SharpFM.Model/Scripting/Steps/ConfigureLocalNotificationStep.cs
index 229d25bd..1c9499c5 100644
--- a/src/SharpFM.Model/Scripting/Steps/ConfigureLocalNotificationStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ConfigureLocalNotificationStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
@@ -12,7 +10,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// versions. The POCO preserves the full child set via
/// for lossless round-trip.
///
-public sealed class ConfigureLocalNotificationStep : ScriptStep, IStepFactory
+public sealed class ConfigureLocalNotificationStep : ScriptStep, IStepFactory
{
public const int XmlId = 187;
public const string XmlName = "Configure Local Notification";
@@ -30,22 +28,12 @@ public ConfigureLocalNotificationStep(StepChildBag? children = null, bool enable
Children = children ?? new StepChildBag();
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
///
/// Display edits are anchor-preserved when a configured child subtree is
/// present — the display line carries only the step name.
///
public override bool IsFullyEditable => Children.Children.Count == 0;
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -55,7 +43,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new Passthrough { PocoProperty = "Children" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ConfigureMachineLearningModelStep.cs b/src/SharpFM.Model/Scripting/Steps/ConfigureMachineLearningModelStep.cs
index adf1771f..177cf2d2 100644
--- a/src/SharpFM.Model/Scripting/Steps/ConfigureMachineLearningModelStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ConfigureMachineLearningModelStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class ConfigureMachineLearningModelStep : ScriptStep, IStepFactory
+public sealed class ConfigureMachineLearningModelStep : ScriptStep, IStepFactory
{
public const int XmlId = 202;
public const string XmlName = "Configure Machine Learning Model";
@@ -24,22 +22,12 @@ public ConfigureMachineLearningModelStep(StepChildBag? children = null, bool ena
Children = children ?? new StepChildBag();
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
///
/// Display edits are anchor-preserved when a configured child subtree is
/// present — the display line carries only the step name.
///
public override bool IsFullyEditable => Children.Children.Count == 0;
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -49,7 +37,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new Passthrough { PocoProperty = "Children" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ConfigureNfcReadingStep.cs b/src/SharpFM.Model/Scripting/Steps/ConfigureNfcReadingStep.cs
index b9595d05..87b18e0d 100644
--- a/src/SharpFM.Model/Scripting/Steps/ConfigureNfcReadingStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ConfigureNfcReadingStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class ConfigureNfcReadingStep : ScriptStep, IStepFactory
+public sealed class ConfigureNfcReadingStep : ScriptStep, IStepFactory
{
public const int XmlId = 201;
public const string XmlName = "Configure NFC Reading";
@@ -24,22 +22,12 @@ public ConfigureNfcReadingStep(StepChildBag? children = null, bool enabled = tru
Children = children ?? new StepChildBag();
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
///
/// Display edits are anchor-preserved when a configured child subtree is
/// present — the display line carries only the step name.
///
public override bool IsFullyEditable => Children.Children.Count == 0;
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -49,7 +37,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new Passthrough { PocoProperty = "Children" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ConfigurePromptTemplateStep.cs b/src/SharpFM.Model/Scripting/Steps/ConfigurePromptTemplateStep.cs
index 926f158c..ffa35856 100644
--- a/src/SharpFM.Model/Scripting/Steps/ConfigurePromptTemplateStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ConfigurePromptTemplateStep.cs
@@ -1,15 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class ConfigurePromptTemplateStep : ScriptStep, IStepFactory
+public sealed class ConfigurePromptTemplateStep : ScriptStep, IStepFactory
{
public const int XmlId = 226;
public const string XmlName = "Configure Prompt Template";
@@ -79,17 +77,12 @@ public ConfigurePromptTemplateStep(
private static string TemplateTypeHr(string x) => _TemplateTypeToHr.TryGetValue(x, out var h) ? h : x;
private static string TemplateTypeXml(string h) => _TemplateTypeFromHr.TryGetValue(h, out var x) ? x : h;
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: trailing bare On/Off token and token order diverging from
// the canonical XML order.
public override string ToDisplayLine() =>
"Configure Prompt Template [ " + "Template Name: " + TemplateName.Text + " ; " + "Model Provider: " + ModelProviderHr(ModelProvider) + " ; " + "Template Type: " + TemplateTypeHr(TemplateType) + " ; " + "SQL Prompt: " + SQLPrompt.Text + " ; " + "Natural Language Prompt: " + NaturalLanguagePrompt.Text + " ; " + "Find Request Prompt: " + FindRequestPrompt.Text + " ; " + "RAG Prompt: " + RAGPrompt.Text + " ; " + (Option ? "On" : "Off") + " ]";
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
var tokens = hrParams.Select(h => h.Trim()).ToArray();
Calculation? templateName_v = null;
@@ -107,7 +100,14 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
Calculation? rAGPrompt_v = null;
foreach (var tok in tokens) { if (tok.StartsWith("RAG Prompt:", StringComparison.OrdinalIgnoreCase)) { rAGPrompt_v = new Calculation(tok.Substring(11).Trim()); break; } }
bool option_v = false;
- return new ConfigurePromptTemplateStep(templateName_v, modelProvider_v, templateType_v, sQLPrompt_v, naturalLanguagePrompt_v, findRequestPrompt_v, rAGPrompt_v, option_v, enabled);
+ TemplateName = templateName_v ?? new Calculation("");
+ ModelProvider = modelProvider_v;
+ TemplateType = templateType_v;
+ SQLPrompt = sQLPrompt_v ?? new Calculation("");
+ NaturalLanguagePrompt = naturalLanguagePrompt_v ?? new Calculation("");
+ FindRequestPrompt = findRequestPrompt_v ?? new Calculation("");
+ RAGPrompt = rAGPrompt_v ?? new Calculation("");
+ Option = option_v;
}
public static StepMetadata Metadata { get; } = new()
@@ -133,7 +133,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
new HrOnly("FindRequestPrompt") { HrLabel = "Find Request Prompt" },
new HrOnly("RAGPrompt") { HrLabel = "RAG Prompt" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ConfigureRAGAccountStep.cs b/src/SharpFM.Model/Scripting/Steps/ConfigureRAGAccountStep.cs
index 2cd72d66..209fd9d2 100644
--- a/src/SharpFM.Model/Scripting/Steps/ConfigureRAGAccountStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ConfigureRAGAccountStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
@@ -13,7 +11,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// configured and is emitted empty when not. The step name carries a trailing
/// space, preserved verbatim.
///
-public sealed class ConfigureRAGAccountStep : ScriptStep, IStepFactory
+public sealed class ConfigureRAGAccountStep : ScriptStep, IStepFactory
{
public const int XmlId = 227;
public const string XmlName = "Configure RAG Account ";
@@ -39,16 +37,6 @@ public ConfigureRAGAccountStep(
VerifySSLCertificates = verifySSLCertificates;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -66,7 +54,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new NamedCalcChild("AccessAPIKey") { PocoProperty = "APIKey", HrLabel = "API key", Optional = true, Display = DisplayMode.Native, DisplayEmptyAs = "" },
]),
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ConfigureRegionMonitorScriptStep.cs b/src/SharpFM.Model/Scripting/Steps/ConfigureRegionMonitorScriptStep.cs
index 9858b6d0..319493fb 100644
--- a/src/SharpFM.Model/Scripting/Steps/ConfigureRegionMonitorScriptStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ConfigureRegionMonitorScriptStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class ConfigureRegionMonitorScriptStep : ScriptStep, IStepFactory
+public sealed class ConfigureRegionMonitorScriptStep : ScriptStep, IStepFactory
{
public const int XmlId = 185;
public const string XmlName = "Configure Region Monitor Script";
@@ -24,22 +22,12 @@ public ConfigureRegionMonitorScriptStep(StepChildBag? children = null, bool enab
Children = children ?? new StepChildBag();
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
///
/// Display edits are anchor-preserved when a configured child subtree is
/// present — the display line carries only the step name.
///
public override bool IsFullyEditable => Children.Children.Count == 0;
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -49,7 +37,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new Passthrough { PocoProperty = "Children" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ConfigureRegressionModelStep.cs b/src/SharpFM.Model/Scripting/Steps/ConfigureRegressionModelStep.cs
index aa16f325..255f350a 100644
--- a/src/SharpFM.Model/Scripting/Steps/ConfigureRegressionModelStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ConfigureRegressionModelStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class ConfigureRegressionModelStep : ScriptStep, IStepFactory
+public sealed class ConfigureRegressionModelStep : ScriptStep, IStepFactory
{
public const int XmlId = 222;
public const string XmlName = "Configure Regression Model";
@@ -24,22 +22,12 @@ public ConfigureRegressionModelStep(StepChildBag? children = null, bool enabled
Children = children ?? new StepChildBag();
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
///
/// Display edits are anchor-preserved when a configured child subtree is
/// present — the display line carries only the step name.
///
public override bool IsFullyEditable => Children.Children.Count == 0;
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -49,7 +37,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new Passthrough { PocoProperty = "Children" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ConstrainFoundSetStep.cs b/src/SharpFM.Model/Scripting/Steps/ConstrainFoundSetStep.cs
index 6751c0fd..1fb4cd89 100644
--- a/src/SharpFM.Model/Scripting/Steps/ConstrainFoundSetStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ConstrainFoundSetStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class ConstrainFoundSetStep : ScriptStep, IStepFactory
+public sealed class ConstrainFoundSetStep : ScriptStep, IStepFactory
{
public const int XmlId = 126;
public const string XmlName = "Constrain Found Set";
@@ -29,13 +27,6 @@ public ConstrainFoundSetStep(
Query = query;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
///
/// Display edits are anchor-preserved when state the display line cannot
/// carry is present: a stored <Query> request list, or an
@@ -44,9 +35,6 @@ public ConstrainFoundSetStep(
///
public override bool IsFullyEditable => !WithoutIndexes && Query is null;
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -61,7 +49,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new BoolStateChild("Restore") { PocoProperty = "RestoreStoredRequests", HrLabel = "Restore" },
new ValueTypeChild("Query") { PocoProperty = "Query", Optional = true },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ControlFlowSteps.cs b/src/SharpFM.Model/Scripting/Steps/ControlFlowSteps.cs
index 0e8fbd2f..5eeced93 100644
--- a/src/SharpFM.Model/Scripting/Steps/ControlFlowSteps.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ControlFlowSteps.cs
@@ -1,4 +1,3 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
@@ -22,7 +21,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// skill's round-trip testing against FM Pro 2025/2026 supersedes that.)
///
///
-public sealed class IfStep : ScriptStep, IStepFactory
+public sealed class IfStep : ScriptStep, IStepFactory
{
public const int XmlId = 68;
public const string XmlName = "If";
@@ -40,16 +39,6 @@ public IfStep(bool enabled, Calculation condition)
Condition = condition;
}
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -69,12 +58,10 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new BareCalcChild { PocoProperty = "Condition", Required = true, Display = DisplayMode.Native, DisplayEmptyAs = "" },
],
Notes = new StepNotes { Constraints = "Requires a matching End If step." },
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
-public sealed class ElseIfStep : ScriptStep, IStepFactory
+public sealed class ElseIfStep : ScriptStep, IStepFactory
{
public const int XmlId = 125;
public const string XmlName = "Else If";
@@ -92,16 +79,6 @@ public ElseIfStep(bool enabled, Calculation condition)
Condition = condition;
}
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -120,12 +97,10 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new BoolStateChild("Restore") { PocoProperty = "Restore", Display = DisplayMode.Hidden },
new BareCalcChild { PocoProperty = "Condition", Required = true, Display = DisplayMode.Native, DisplayEmptyAs = "" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
-public sealed class ElseStep : ScriptStep, IStepFactory
+public sealed class ElseStep : ScriptStep, IStepFactory
{
public const int XmlId = 69;
public const string XmlName = "Else";
@@ -138,16 +113,6 @@ private ElseStep() : base(false) { }
public ElseStep(bool enabled)
: base(enabled) { }
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -162,12 +127,10 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
},
// Canonical §8.1: .
Shape = [new BoolStateChild("Restore") { PocoProperty = "Restore", Display = DisplayMode.Hidden }],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
-public sealed class EndIfStep : ScriptStep, IStepFactory
+public sealed class EndIfStep : ScriptStep, IStepFactory
{
public const int XmlId = 70;
public const string XmlName = "End If";
@@ -177,16 +140,6 @@ private EndIfStep() : base(false) { }
public EndIfStep(bool enabled)
: base(enabled) { }
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -199,12 +152,10 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
Role = BlockPairRole.Close,
Partners = ["If"],
},
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
-public sealed class LoopStep : ScriptStep, IStepFactory
+public sealed class LoopStep : ScriptStep, IStepFactory
{
public const int XmlId = 71;
public const string XmlName = "Loop";
@@ -220,16 +171,6 @@ private LoopStep() : base(false) { }
public LoopStep(bool enabled)
: base(enabled) { }
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -248,12 +189,10 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new BoolStateChild("Restore") { PocoProperty = "Restore", Display = DisplayMode.Hidden },
new EnumValueChild("FlushType") { PocoProperty = "FlushType", DefaultValue = "Always", Display = DisplayMode.Hidden },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
-public sealed class EndLoopStep : ScriptStep, IStepFactory
+public sealed class EndLoopStep : ScriptStep, IStepFactory
{
public const int XmlId = 73;
public const string XmlName = "End Loop";
@@ -263,16 +202,6 @@ private EndLoopStep() : base(false) { }
public EndLoopStep(bool enabled)
: base(enabled) { }
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -285,12 +214,10 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
Role = BlockPairRole.Close,
Partners = ["Loop"],
},
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
-public sealed class ExitLoopIfStep : ScriptStep, IStepFactory
+public sealed class ExitLoopIfStep : ScriptStep, IStepFactory
{
public const int XmlId = 72;
public const string XmlName = "Exit Loop If";
@@ -305,16 +232,6 @@ public ExitLoopIfStep(bool enabled, Calculation condition)
Condition = condition;
}
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -329,7 +246,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
},
// Canonical §8.1: bare only — no on Exit Loop If.
Shape = [new BareCalcChild { PocoProperty = "Condition", Required = true, Display = DisplayMode.Native, DisplayEmptyAs = "" }],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ConvertFileStep.cs b/src/SharpFM.Model/Scripting/Steps/ConvertFileStep.cs
index c8235831..bedf54cd 100644
--- a/src/SharpFM.Model/Scripting/Steps/ConvertFileStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ConvertFileStep.cs
@@ -1,8 +1,6 @@
using System;
using System.Linq;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -13,7 +11,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// booleans (three labeled, one inverted) and an unlabeled positional
/// enum (DataSourceType) carrying "File" or "XMLSource".
///
-public sealed class ConvertFileStep : ScriptStep, IStepFactory
+public sealed class ConvertFileStep : ScriptStep, IStepFactory
{
public const int XmlId = 139;
public const string XmlName = "Convert File";
@@ -48,8 +46,6 @@ public ConvertFileStep(
VerifySSLCertificates = verifySSLCertificates;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: With dialog renders mid-line between same-mode groups, an
// order the Native-then-Augmented display projection cannot produce.
public override string ToDisplayLine() =>
@@ -61,10 +57,7 @@ public override string ToDisplayLine() =>
+ " ; Verify SSL Certificates: " + (VerifySSLCertificates ? "On" : "Off")
+ " ]";
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
var tokens = hrParams.Select(h => h.Trim()).ToArray();
var openFile = ParseOn(tokens, "Open File:", defaultValue: false);
@@ -79,7 +72,11 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
!t.StartsWith("With dialog:", StringComparison.OrdinalIgnoreCase) &&
!t.StartsWith("Verify SSL Certificates:", StringComparison.OrdinalIgnoreCase))
?? "File";
- return new ConvertFileStep(openFile, skipIdx, withDialog, dataType, sslVerify, enabled);
+ OpenFile = openFile;
+ SkipIndexes = skipIdx;
+ WithDialog = withDialog;
+ DataSourceType = dataType;
+ VerifySSLCertificates = sslVerify;
}
private static bool ParseOn(string[] tokens, string prefix, bool defaultValue)
@@ -111,7 +108,5 @@ private static bool ParseOn(string[] tokens, string prefix, bool defaultValue)
new BoolStateChild("VerifySSLCertificates") { PocoProperty = "VerifySSLCertificates", HrLabel = "Verify SSL Certificates", Display = DisplayMode.Augmented },
new EnumValueChild("DataSourceType") { PocoProperty = "DataSourceType", Optional = true, DisplayValues = ["File", "XMLSource"], Display = DisplayMode.Native },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/CopyAllRecordsRequestsStep.cs b/src/SharpFM.Model/Scripting/Steps/CopyAllRecordsRequestsStep.cs
index 21bf5567..7db2ab06 100644
--- a/src/SharpFM.Model/Scripting/Steps/CopyAllRecordsRequestsStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CopyAllRecordsRequestsStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -9,7 +7,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name). All round-tripped exactly.
/// No child elements in FM Pro's clipboard output; no hidden state.
///
-public sealed class CopyAllRecordsRequestsStep : ScriptStep, IStepFactory
+public sealed class CopyAllRecordsRequestsStep : ScriptStep, IStepFactory
{
public const int XmlId = 98;
public const string XmlName = "Copy All Records/Requests";
@@ -18,23 +16,11 @@ private CopyAllRecordsRequestsStep() : base(false) { }
public CopyAllRecordsRequestsStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "records",
HelpUrl = "https://help.claris.com/en/pro-help/content/copy-all-records-requests.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/CopyRecordRequestStep.cs b/src/SharpFM.Model/Scripting/Steps/CopyRecordRequestStep.cs
index 02cb1ad4..163a2ecb 100644
--- a/src/SharpFM.Model/Scripting/Steps/CopyRecordRequestStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CopyRecordRequestStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -9,7 +7,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name). All round-tripped exactly.
/// No child elements in FM Pro's clipboard output; no hidden state.
///
-public sealed class CopyRecordRequestStep : ScriptStep, IStepFactory
+public sealed class CopyRecordRequestStep : ScriptStep, IStepFactory
{
public const int XmlId = 101;
public const string XmlName = "Copy Record/Request";
@@ -18,23 +16,11 @@ private CopyRecordRequestStep() : base(false) { }
public CopyRecordRequestStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "records",
HelpUrl = "https://help.claris.com/en/pro-help/content/copy-record-request.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/CopyStep.cs b/src/SharpFM.Model/Scripting/Steps/CopyStep.cs
index feee9cbb..e7246b8e 100644
--- a/src/SharpFM.Model/Scripting/Steps/CopyStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CopyStep.cs
@@ -1,14 +1,12 @@
using System;
using System.Linq;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class CopyStep : ScriptStep, IStepFactory
+public sealed class CopyStep : ScriptStep, IStepFactory
{
public const int XmlId = 47;
public const string XmlName = "Copy";
@@ -28,16 +26,6 @@ public CopyStep(
Target = target;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -51,7 +39,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new BoolStateChild("SelectAll") { PocoProperty = "Select", HrLabel = "Select", ValidValues = ["On", "Off"], DefaultValue = "True" },
new FieldChild("Field") { PocoProperty = "Target", Optional = true, DisplayEmptyAs = "" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/CorrectWordStep.cs b/src/SharpFM.Model/Scripting/Steps/CorrectWordStep.cs
index 54b8e896..79516569 100644
--- a/src/SharpFM.Model/Scripting/Steps/CorrectWordStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CorrectWordStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -9,7 +7,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name). All round-tripped exactly.
/// No child elements in FM Pro's clipboard output; no hidden state.
///
-public sealed class CorrectWordStep : ScriptStep, IStepFactory
+public sealed class CorrectWordStep : ScriptStep, IStepFactory
{
public const int XmlId = 106;
public const string XmlName = "Correct Word";
@@ -18,23 +16,11 @@ private CorrectWordStep() : base(false) { }
public CorrectWordStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "spelling",
HelpUrl = "https://help.claris.com/en/pro-help/content/correct-word.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/CreateDataFileStep.cs b/src/SharpFM.Model/Scripting/Steps/CreateDataFileStep.cs
index d5910cc2..70c2696e 100644
--- a/src/SharpFM.Model/Scripting/Steps/CreateDataFileStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CreateDataFileStep.cs
@@ -1,11 +1,9 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class CreateDataFileStep : ScriptStep, IStepFactory
+public sealed class CreateDataFileStep : ScriptStep, IStepFactory
{
public const int XmlId = 190;
public const string XmlName = "Create Data File";
@@ -25,16 +23,6 @@ public CreateDataFileStep(
CreateFolders = createFolders;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -47,7 +35,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new NamedTextChild("UniversalPathList") { PocoProperty = "UniversalPathList", Optional = true, DisplayEmptyAs = "" },
new BoolStateChild("CreateDirectories") { PocoProperty = "CreateFolders", HrLabel = "Create folders" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/CreatePdfStep.cs b/src/SharpFM.Model/Scripting/Steps/CreatePdfStep.cs
index 0f98d49c..f795abbd 100644
--- a/src/SharpFM.Model/Scripting/Steps/CreatePdfStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CreatePdfStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
@@ -12,7 +10,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <CreatePDFFile> wrapper whose Document / Security
/// / View blocks reuse the same value types as Save Records as PDF.
///
-public sealed class CreatePdfStep : ScriptStep, IStepFactory
+public sealed class CreatePdfStep : ScriptStep, IStepFactory
{
public const int XmlId = 243;
public const string XmlName = "Create PDF";
@@ -41,13 +39,6 @@ public CreatePdfStep(
View = view ?? PdfView.Default();
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
///
/// The canonical Document block FileMaker writes for an unconfigured
/// step: all pages numbered from 1 with a 1–1 page range.
@@ -70,7 +61,7 @@ StoredLabel is null
// Hand-written: must materialize the canonical Document block
// (DefaultDocument) that the shape parser's plain ctor cannot supply.
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
var restore = false;
foreach (var tok in hrParams)
@@ -79,7 +70,11 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
if (t.StartsWith("Restore:", System.StringComparison.OrdinalIgnoreCase))
restore = t.Substring(8).Trim().Equals("On", System.StringComparison.OrdinalIgnoreCase);
}
- return new CreatePdfStep(restore, null, DefaultDocument(), null, null, enabled);
+ RestoreStoredOptions = restore;
+ StoredLabel = null;
+ Document = DefaultDocument();
+ Security = PdfSecurity.Default();
+ View = PdfView.Default();
}
public static StepMetadata Metadata { get; } = new()
@@ -105,7 +100,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
// display slot, mirroring the legacy CreatePDFFile param.
new HrOnly("CreatePDFFile"),
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/CutStep.cs b/src/SharpFM.Model/Scripting/Steps/CutStep.cs
index a8903903..198091db 100644
--- a/src/SharpFM.Model/Scripting/Steps/CutStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/CutStep.cs
@@ -1,14 +1,12 @@
using System;
using System.Linq;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class CutStep : ScriptStep, IStepFactory
+public sealed class CutStep : ScriptStep, IStepFactory
{
public const int XmlId = 46;
public const string XmlName = "Cut";
@@ -28,16 +26,6 @@ public CutStep(
Target = target;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -51,7 +39,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new BoolStateChild("SelectAll") { PocoProperty = "Select", HrLabel = "Select", ValidValues = ["On", "Off"], DefaultValue = "True" },
new FieldChild("Field") { PocoProperty = "Target", Optional = true, DisplayEmptyAs = "" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/DeleteAccountStep.cs b/src/SharpFM.Model/Scripting/Steps/DeleteAccountStep.cs
index 5238dc3c..7d940118 100644
--- a/src/SharpFM.Model/Scripting/Steps/DeleteAccountStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/DeleteAccountStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class DeleteAccountStep : ScriptStep, IStepFactory
+public sealed class DeleteAccountStep : ScriptStep, IStepFactory
{
public const int XmlId = 135;
public const string XmlName = "Delete Account";
@@ -23,16 +21,6 @@ public DeleteAccountStep(
AccountName = accountName ?? new Calculation("");
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -44,7 +32,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new NamedCalcChild("AccountName") { PocoProperty = "AccountName", HrLabel = "Account Name", Optional = true, Display = DisplayMode.Native, DisplayEmptyAs = "" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/DeleteAllRecordsStep.cs b/src/SharpFM.Model/Scripting/Steps/DeleteAllRecordsStep.cs
index bb2cd6c6..0bd0337f 100644
--- a/src/SharpFM.Model/Scripting/Steps/DeleteAllRecordsStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/DeleteAllRecordsStep.cs
@@ -1,7 +1,5 @@
using System;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -11,7 +9,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name) plus a single
/// <NoInteract state="True|False"/> child. All round-tripped.
///
-public sealed class DeleteAllRecordsStep : ScriptStep, IStepFactory
+public sealed class DeleteAllRecordsStep : ScriptStep, IStepFactory
{
public const int XmlId = 10;
public const string XmlName = "Delete All Records";
@@ -35,16 +33,6 @@ public DeleteAllRecordsStep(bool withdialog = false, bool enabled = true)
WithDialog = withdialog;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -56,7 +44,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new BoolStateChild("NoInteract") { PocoProperty = "NoInteract", HrLabel = "With dialog", DisplayInverted = true },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/DeleteFileStep.cs b/src/SharpFM.Model/Scripting/Steps/DeleteFileStep.cs
index cbe00033..20c91d62 100644
--- a/src/SharpFM.Model/Scripting/Steps/DeleteFileStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/DeleteFileStep.cs
@@ -1,8 +1,6 @@
using System;
using System.Linq;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -13,7 +11,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// file path as text. Display form uses the HR-label prefix
/// "Target file:" followed by the raw path string.
///
-public sealed class DeleteFileStep : ScriptStep, IStepFactory
+public sealed class DeleteFileStep : ScriptStep, IStepFactory
{
public const int XmlId = 197;
public const string XmlName = "Delete File";
@@ -27,22 +25,15 @@ public DeleteFileStep(string targetFile = "", bool enabled = true) : base(enable
TargetFile = targetFile;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
// Hand-written: also accepts a bare unlabeled path token, which the
// shape parser would ignore (labeled slots never bind positionally).
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
var tok = hrParams.Length > 0 ? hrParams[0].Trim() : "";
const string Prefix = "Target file:";
if (tok.StartsWith(Prefix, StringComparison.OrdinalIgnoreCase))
tok = tok.Substring(Prefix.Length).Trim();
- return new DeleteFileStep(tok, enabled);
+ TargetFile = tok;
}
public static StepMetadata Metadata { get; } = new()
@@ -54,7 +45,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
[
new NamedTextChild("UniversalPathList") { PocoProperty = "TargetFile", HrLabel = "Target file", Required = true, Optional = true, DisplayEmptyAs = "" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/DeletePortalRowStep.cs b/src/SharpFM.Model/Scripting/Steps/DeletePortalRowStep.cs
index 825364fd..eddf6873 100644
--- a/src/SharpFM.Model/Scripting/Steps/DeletePortalRowStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/DeletePortalRowStep.cs
@@ -1,7 +1,5 @@
using System;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -11,7 +9,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name) plus a single
/// <NoInteract state="True|False"/> child. All round-tripped.
///
-public sealed class DeletePortalRowStep : ScriptStep, IStepFactory
+public sealed class DeletePortalRowStep : ScriptStep, IStepFactory
{
public const int XmlId = 104;
public const string XmlName = "Delete Portal Row";
@@ -35,16 +33,6 @@ public DeletePortalRowStep(bool withdialog = false, bool enabled = true)
WithDialog = withdialog;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -56,7 +44,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new BoolStateChild("NoInteract") { PocoProperty = "NoInteract", HrLabel = "With dialog", DisplayInverted = true },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/DeleteRecordRequestStep.cs b/src/SharpFM.Model/Scripting/Steps/DeleteRecordRequestStep.cs
index 16d2cfc8..b2606335 100644
--- a/src/SharpFM.Model/Scripting/Steps/DeleteRecordRequestStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/DeleteRecordRequestStep.cs
@@ -1,7 +1,5 @@
using System;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -11,7 +9,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name) plus a single
/// <NoInteract state="True|False"/> child. All round-tripped.
///
-public sealed class DeleteRecordRequestStep : ScriptStep, IStepFactory
+public sealed class DeleteRecordRequestStep : ScriptStep, IStepFactory
{
public const int XmlId = 9;
public const string XmlName = "Delete Record/Request";
@@ -35,16 +33,6 @@ public DeleteRecordRequestStep(bool withdialog = false, bool enabled = true)
WithDialog = withdialog;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -56,7 +44,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new BoolStateChild("NoInteract") { PocoProperty = "NoInteract", HrLabel = "With dialog", DisplayInverted = true },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/DialPhoneStep.cs b/src/SharpFM.Model/Scripting/Steps/DialPhoneStep.cs
index a3c84c94..176ff9d2 100644
--- a/src/SharpFM.Model/Scripting/Steps/DialPhoneStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/DialPhoneStep.cs
@@ -1,15 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class DialPhoneStep : ScriptStep, IStepFactory
+public sealed class DialPhoneStep : ScriptStep, IStepFactory
{
public const int XmlId = 65;
public const string XmlName = "Dial Phone";
@@ -51,18 +49,13 @@ public DialPhoneStep(
Calculation = calculation;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: the bare On/Off token maps the wire's "True"/absent
// UseDialPreferences value, a translation the display metadata cannot
// express without widening the node's wire ValidValues.
public override string ToDisplayLine() =>
"Dial Phone [ " + "With dialog: " + (WithDialog ? "On" : "Off") + " ; " + (UseDialPreferences ? "On" : "Off") + " ; " + (Calculation?.Text ?? "") + " ]";
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
var tokens = hrParams.Select(h => h.Trim()).ToArray();
bool withDialog_v = true;
@@ -70,7 +63,9 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
// Display shape is positional after the dialog flag: [ With dialog ; use-dial-prefs On/Off ; phone calc ].
bool useDialPreferences_v = tokens.Length >= 2 && tokens[1].Equals("On", StringComparison.OrdinalIgnoreCase);
Calculation? calculation_v = tokens.Length >= 3 && tokens[2].Length > 0 ? new Calculation(tokens[2]) : null;
- return new DialPhoneStep(withDialog_v, useDialPreferences_v, calculation_v, enabled);
+ WithDialog = withDialog_v;
+ UseDialPreferences = useDialPreferences_v;
+ Calculation = calculation_v;
}
public static StepMetadata Metadata { get; } = new()
@@ -88,7 +83,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
new EnumValueChild("UseDialPreferences") { PocoProperty = "UseDialPreferencesValue", Optional = true, DisplayValues = ["On", "Off"] },
new BareCalcChild { PocoProperty = "Calculation", Optional = true },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/DuplicateRecordRequestStep.cs b/src/SharpFM.Model/Scripting/Steps/DuplicateRecordRequestStep.cs
index 8acf43fc..d27afedf 100644
--- a/src/SharpFM.Model/Scripting/Steps/DuplicateRecordRequestStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/DuplicateRecordRequestStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -9,7 +7,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name). All round-tripped exactly.
/// No child elements in FM Pro's clipboard output; no hidden state.
///
-public sealed class DuplicateRecordRequestStep : ScriptStep, IStepFactory
+public sealed class DuplicateRecordRequestStep : ScriptStep, IStepFactory
{
public const int XmlId = 8;
public const string XmlName = "Duplicate Record/Request";
@@ -18,23 +16,11 @@ private DuplicateRecordRequestStep() : base(false) { }
public DuplicateRecordRequestStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "records",
HelpUrl = "https://help.claris.com/en/pro-help/content/duplicate-record-request.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/EditUserDictionaryStep.cs b/src/SharpFM.Model/Scripting/Steps/EditUserDictionaryStep.cs
index eef74d82..361d4c2e 100644
--- a/src/SharpFM.Model/Scripting/Steps/EditUserDictionaryStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/EditUserDictionaryStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -9,7 +7,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name). All round-tripped exactly.
/// No child elements in FM Pro's clipboard output; no hidden state.
///
-public sealed class EditUserDictionaryStep : ScriptStep, IStepFactory
+public sealed class EditUserDictionaryStep : ScriptStep, IStepFactory
{
public const int XmlId = 109;
public const string XmlName = "Edit User Dictionary";
@@ -18,23 +16,11 @@ private EditUserDictionaryStep() : base(false) { }
public EditUserDictionaryStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "spelling",
HelpUrl = "https://help.claris.com/en/pro-help/content/edit-user-dictionary.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/EnableAccountStep.cs b/src/SharpFM.Model/Scripting/Steps/EnableAccountStep.cs
index ddfd983d..27c18f4e 100644
--- a/src/SharpFM.Model/Scripting/Steps/EnableAccountStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/EnableAccountStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class EnableAccountStep : ScriptStep, IStepFactory
+public sealed class EnableAccountStep : ScriptStep, IStepFactory
{
public const int XmlId = 137;
public const string XmlName = "Enable Account";
@@ -26,16 +24,6 @@ public EnableAccountStep(
AccountOperation = accountOperation;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -49,7 +37,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new NamedCalcChild("AccountName") { PocoProperty = "AccountName", HrLabel = "Account Name", Optional = true, Display = DisplayMode.Native, DisplayEmptyAs = "" },
new EnumValueChild("AccountOperation") { PocoProperty = "AccountOperation", DefaultValue = "Activate", DisplayValues = ["Activate", "Deactivate"], Display = DisplayMode.Native },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/EnableTouchKeyboardStep.cs b/src/SharpFM.Model/Scripting/Steps/EnableTouchKeyboardStep.cs
index f5e55d45..dc7515d1 100644
--- a/src/SharpFM.Model/Scripting/Steps/EnableTouchKeyboardStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/EnableTouchKeyboardStep.cs
@@ -1,8 +1,6 @@
using System;
using System.Collections.Generic;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -13,7 +11,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// enum child. XML values and human-readable display values are mapped
/// through the static HR tables; round-trip preserves the XML value.
///
-public sealed class EnableTouchKeyboardStep : ScriptStep, IStepFactory
+public sealed class EnableTouchKeyboardStep : ScriptStep, IStepFactory
{
public const int XmlId = 174;
public const string XmlName = "Enable Touch Keyboard";
@@ -29,16 +27,6 @@ public EnableTouchKeyboardStep(string showHide = "Show", bool enabled = true)
ShowHide = showHide;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -50,7 +38,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new EnumValueChild("ShowHide") { PocoProperty = "ShowHide", DefaultValue = "Show", ValidValues = ["On", "Off", "Toggle"] },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/EnterBrowseModeStep.cs b/src/SharpFM.Model/Scripting/Steps/EnterBrowseModeStep.cs
index 664d763b..dfa31c32 100644
--- a/src/SharpFM.Model/Scripting/Steps/EnterBrowseModeStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/EnterBrowseModeStep.cs
@@ -1,7 +1,5 @@
using System;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -11,7 +9,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name) plus a single
/// <Pause state="True|False"/> child. All round-tripped.
///
-public sealed class EnterBrowseModeStep : ScriptStep, IStepFactory
+public sealed class EnterBrowseModeStep : ScriptStep, IStepFactory
{
public const int XmlId = 55;
public const string XmlName = "Enter Browse Mode";
@@ -27,16 +25,6 @@ public EnterBrowseModeStep(bool pause = false, bool enabled = true)
Pause = pause;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -48,7 +36,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new BoolStateChild("Pause") { PocoProperty = "Pause", HrLabel = "Pause" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/EnterFindModeStep.cs b/src/SharpFM.Model/Scripting/Steps/EnterFindModeStep.cs
index 049b9965..6f52e904 100644
--- a/src/SharpFM.Model/Scripting/Steps/EnterFindModeStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/EnterFindModeStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class EnterFindModeStep : ScriptStep, IStepFactory
+public sealed class EnterFindModeStep : ScriptStep, IStepFactory
{
public const int XmlId = 22;
public const string XmlName = "Enter Find Mode";
@@ -29,17 +27,10 @@ public EnterFindModeStep(
Query = query;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
// Hand-written: bare display text defaults Pause/Restore to On (FileMaker's
// new-step defaults), which the shape parser's false-initialized POCO
// cannot reproduce.
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
bool pause = true, restore = true;
foreach (var tok in hrParams)
@@ -50,7 +41,9 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
else if (t.StartsWith("Restore:", System.StringComparison.OrdinalIgnoreCase))
restore = t.Substring(8).Trim().Equals("On", System.StringComparison.OrdinalIgnoreCase);
}
- return new EnterFindModeStep(pause, restore, null, enabled);
+ Pause = pause;
+ RestoreStoredRequests = restore;
+ Query = null;
}
public static StepMetadata Metadata { get; } = new()
@@ -70,7 +63,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
new HrOnly("Restore") { Boolean = true },
new HrOnly("Query"),
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/EnterPreviewModeStep.cs b/src/SharpFM.Model/Scripting/Steps/EnterPreviewModeStep.cs
index 91aca9a7..4535431d 100644
--- a/src/SharpFM.Model/Scripting/Steps/EnterPreviewModeStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/EnterPreviewModeStep.cs
@@ -1,7 +1,5 @@
using System;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -11,7 +9,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name) plus a single
/// <Pause state="True|False"/> child. All round-tripped.
///
-public sealed class EnterPreviewModeStep : ScriptStep, IStepFactory
+public sealed class EnterPreviewModeStep : ScriptStep, IStepFactory
{
public const int XmlId = 41;
public const string XmlName = "Enter Preview Mode";
@@ -27,16 +25,6 @@ public EnterPreviewModeStep(bool pause = false, bool enabled = true)
Pause = pause;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -48,7 +36,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new BoolStateChild("Pause") { PocoProperty = "Pause", HrLabel = "Pause" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ExecuteFileMakerDataApiStep.cs b/src/SharpFM.Model/Scripting/Steps/ExecuteFileMakerDataApiStep.cs
index 0b14eeb7..7d44fa40 100644
--- a/src/SharpFM.Model/Scripting/Steps/ExecuteFileMakerDataApiStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ExecuteFileMakerDataApiStep.cs
@@ -1,13 +1,11 @@
using System;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class ExecuteFileMakerDataApiStep : ScriptStep, IStepFactory
+public sealed class ExecuteFileMakerDataApiStep : ScriptStep, IStepFactory
{
public const int XmlId = 203;
public const string XmlName = "Execute FileMaker Data API";
@@ -30,8 +28,6 @@ public ExecuteFileMakerDataApiStep(
Query = query;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: FileMaker shows Target before the query calculation, the
// reverse of the canonical XML order the shape must keep.
public override string ToDisplayLine()
@@ -43,10 +39,7 @@ public override string ToDisplayLine()
return $"Execute FileMaker Data API [ {string.Join(" ; ", parts)} ]";
}
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
bool select = true;
FieldRef? target = null;
@@ -65,7 +58,9 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
querySeen = true;
}
}
- return new ExecuteFileMakerDataApiStep(select, target, query, enabled);
+ Select = select;
+ Target = target;
+ Query = query;
}
public static StepMetadata Metadata { get; } = new()
@@ -82,7 +77,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
new BareCalcChild { PocoProperty = "Query", Optional = true, Display = DisplayMode.Native },
new FieldChild("Field") { PocoProperty = "Target", HrLabel = "Target", Optional = true, VariableTextMarker = true, Display = DisplayMode.Native },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ExecuteSqlStep.cs b/src/SharpFM.Model/Scripting/Steps/ExecuteSqlStep.cs
index 482506c4..48a8186c 100644
--- a/src/SharpFM.Model/Scripting/Steps/ExecuteSqlStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ExecuteSqlStep.cs
@@ -1,13 +1,11 @@
using System;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class ExecuteSqlStep : ScriptStep, IStepFactory
+public sealed class ExecuteSqlStep : ScriptStep, IStepFactory
{
public const int XmlId = 117;
public const string XmlName = "Execute SQL";
@@ -34,8 +32,6 @@ public ExecuteSqlStep(bool withDialog = true, SqlProfile? profile = null, bool e
Profile = profile;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: the SQL Text / Calculated SQL Text token comes from the
// hidden Profile value type, which the shape-driven renderer cannot surface.
public override string ToDisplayLine()
@@ -47,10 +43,7 @@ public override string ToDisplayLine()
return $"Execute SQL [ {dialog} ; SQL Text: {Profile.Query ?? ""} ]";
}
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
// Display is lossy for Execute SQL — ODBC connection fields aren't
// expressible in display. Best-effort: capture dialog and SQL text.
@@ -82,7 +75,8 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
isCalc ? null : sql,
isCalc ? new Calculation(sql) : null)
: null;
- return new ExecuteSqlStep(withDialog, profile, enabled);
+ WithDialog = withDialog;
+ Profile = profile;
}
public static StepMetadata Metadata { get; } = new()
@@ -99,7 +93,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
new ValueTypeChild("Profile") { PocoProperty = "Profile", Optional = true, Display = DisplayMode.Hidden },
new HrOnly("Profile"),
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ExitApplicationStep.cs b/src/SharpFM.Model/Scripting/Steps/ExitApplicationStep.cs
index 57ecd64d..d8495dba 100644
--- a/src/SharpFM.Model/Scripting/Steps/ExitApplicationStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ExitApplicationStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -9,7 +7,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name). All round-tripped exactly.
/// No child elements in FM Pro's clipboard output; no hidden state.
///
-public sealed class ExitApplicationStep : ScriptStep, IStepFactory
+public sealed class ExitApplicationStep : ScriptStep, IStepFactory
{
public const int XmlId = 44;
public const string XmlName = "Exit Application";
@@ -18,23 +16,11 @@ private ExitApplicationStep() : base(false) { }
public ExitApplicationStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "miscellaneous",
HelpUrl = "https://help.claris.com/en/pro-help/content/exit-application.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ExitScriptStep.cs b/src/SharpFM.Model/Scripting/Steps/ExitScriptStep.cs
index 22d00fe3..fadede4a 100644
--- a/src/SharpFM.Model/Scripting/Steps/ExitScriptStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ExitScriptStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class ExitScriptStep : ScriptStep, IStepFactory
+public sealed class ExitScriptStep : ScriptStep, IStepFactory
{
public const int XmlId = 103;
public const string XmlName = "Exit Script";
@@ -23,16 +21,6 @@ public ExitScriptStep(
Calculation = calculation ?? new Calculation("");
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -44,7 +32,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new BareCalcChild { PocoProperty = "Calculation", Optional = true, Display = DisplayMode.Native, DisplayEmptyAs = "" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ExportFieldContentsStep.cs b/src/SharpFM.Model/Scripting/Steps/ExportFieldContentsStep.cs
index 33dd1b21..b6262c9c 100644
--- a/src/SharpFM.Model/Scripting/Steps/ExportFieldContentsStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ExportFieldContentsStep.cs
@@ -1,13 +1,11 @@
using System;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class ExportFieldContentsStep : ScriptStep, IStepFactory
+public sealed class ExportFieldContentsStep : ScriptStep, IStepFactory
{
public const int XmlId = 132;
public const string XmlName = "Export Field Contents";
@@ -36,8 +34,6 @@ public ExportFieldContentsStep(
CreateDirectories = createDirectories;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: Field renders before Path (reverse of canonical XML order)
// and AutoOpen/CreateEmail are conditional bare tokens a BoolStateChild
// cannot produce.
@@ -52,10 +48,7 @@ public override string ToDisplayLine()
return $"Export Field Contents [ {string.Join(" ; ", parts)} ]";
}
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
FieldRef? field = null;
string path = "";
@@ -79,7 +72,11 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
positional++;
}
}
- return new ExportFieldContentsStep(field, path, autoOpen, createEmail, createDirs, enabled);
+ Field = field;
+ Path = path;
+ AutoOpen = autoOpen;
+ CreateEmail = createEmail;
+ CreateDirectories = createDirs;
}
public static StepMetadata Metadata { get; } = new()
@@ -98,7 +95,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
new NamedTextChild("UniversalPathList") { PocoProperty = "Path", Optional = true, Display = DisplayMode.Native },
new FieldChild("Field") { PocoProperty = "Field", Optional = true, Display = DisplayMode.Native },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ExportRecordsStep.cs b/src/SharpFM.Model/Scripting/Steps/ExportRecordsStep.cs
index 5822c358..ec239570 100644
--- a/src/SharpFM.Model/Scripting/Steps/ExportRecordsStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ExportRecordsStep.cs
@@ -2,7 +2,6 @@
using System.Linq;
using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
@@ -14,7 +13,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// fields to export; SummaryFields is an optional list of summary fields
/// that drives grouping.
///
-public sealed class ExportRecordsStep : ScriptStep, IStepFactory
+public sealed class ExportRecordsStep : ScriptStep, IStepFactory
{
public const int XmlId = 36;
public const string XmlName = "Export Records";
@@ -117,16 +116,6 @@ public ExportRecordsStep(
SummaryFields = summaryFields ?? new List();
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -150,7 +139,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new HrOnly("ExportEntries"),
new HrOnly("SummaryFields"),
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ExtendFoundSetStep.cs b/src/SharpFM.Model/Scripting/Steps/ExtendFoundSetStep.cs
index 349fd1c7..f57a3882 100644
--- a/src/SharpFM.Model/Scripting/Steps/ExtendFoundSetStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ExtendFoundSetStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class ExtendFoundSetStep : ScriptStep, IStepFactory
+public sealed class ExtendFoundSetStep : ScriptStep, IStepFactory
{
public const int XmlId = 127;
public const string XmlName = "Extend Found Set";
@@ -23,16 +21,6 @@ public ExtendFoundSetStep(bool restoreStoredRequests = true, FindRequestList? qu
Query = query;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -45,7 +33,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new BoolStateChild("Restore") { PocoProperty = "RestoreStoredRequests", HrLabel = "Restore" },
new ValueTypeChild("Query") { PocoProperty = "Query", Optional = true },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/FindMatchingRecordsStep.cs b/src/SharpFM.Model/Scripting/Steps/FindMatchingRecordsStep.cs
index 5e2ee9ec..bbab7675 100644
--- a/src/SharpFM.Model/Scripting/Steps/FindMatchingRecordsStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/FindMatchingRecordsStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class FindMatchingRecordsStep : ScriptStep, IStepFactory
+public sealed class FindMatchingRecordsStep : ScriptStep, IStepFactory
{
public const int XmlId = 155;
public const string XmlName = "Find Matching Records";
@@ -23,16 +21,6 @@ public FindMatchingRecordsStep(string mode = "FindMatchingReplace", FieldRef? fi
Field = field;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -52,7 +40,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
},
new FieldChild("Field") { PocoProperty = "Field", Optional = true, Display = DisplayMode.Native },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/FineTuneModelStep.cs b/src/SharpFM.Model/Scripting/Steps/FineTuneModelStep.cs
index a0356a60..c014be68 100644
--- a/src/SharpFM.Model/Scripting/Steps/FineTuneModelStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/FineTuneModelStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class FineTuneModelStep : ScriptStep, IStepFactory
+public sealed class FineTuneModelStep : ScriptStep, IStepFactory
{
public const int XmlId = 213;
public const string XmlName = "Fine-Tune Model";
@@ -24,22 +22,12 @@ public FineTuneModelStep(StepChildBag? children = null, bool enabled = true)
Children = children ?? new StepChildBag();
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
///
/// Display edits are anchor-preserved when a configured child subtree is
/// present — the display line carries only the step name.
///
public override bool IsFullyEditable => Children.Children.Count == 0;
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -49,7 +37,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new Passthrough { PocoProperty = "Children" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/FlushCacheToDiskStep.cs b/src/SharpFM.Model/Scripting/Steps/FlushCacheToDiskStep.cs
index fe37d0c4..f26a535f 100644
--- a/src/SharpFM.Model/Scripting/Steps/FlushCacheToDiskStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/FlushCacheToDiskStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -9,7 +7,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name). All round-tripped exactly.
/// No child elements in FM Pro's clipboard output; no hidden state.
///
-public sealed class FlushCacheToDiskStep : ScriptStep, IStepFactory
+public sealed class FlushCacheToDiskStep : ScriptStep, IStepFactory
{
public const int XmlId = 102;
public const string XmlName = "Flush Cache to Disk";
@@ -18,23 +16,11 @@ private FlushCacheToDiskStep() : base(false) { }
public FlushCacheToDiskStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "miscellaneous",
HelpUrl = "https://help.claris.com/en/pro-help/content/flush-cache-to-disk.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/FreezeWindowStep.cs b/src/SharpFM.Model/Scripting/Steps/FreezeWindowStep.cs
index 3373f630..76ac116d 100644
--- a/src/SharpFM.Model/Scripting/Steps/FreezeWindowStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/FreezeWindowStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -9,7 +7,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name). All round-tripped exactly.
/// No child elements in FM Pro's clipboard output; no hidden state.
///
-public sealed class FreezeWindowStep : ScriptStep, IStepFactory
+public sealed class FreezeWindowStep : ScriptStep, IStepFactory
{
public const int XmlId = 79;
public const string XmlName = "Freeze Window";
@@ -18,23 +16,11 @@ private FreezeWindowStep() : base(false) { }
public FreezeWindowStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "windows",
HelpUrl = "https://help.claris.com/en/pro-help/content/freeze-window.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/GenerateResponseFromModelStep.cs b/src/SharpFM.Model/Scripting/Steps/GenerateResponseFromModelStep.cs
index bc12c342..f4c02097 100644
--- a/src/SharpFM.Model/Scripting/Steps/GenerateResponseFromModelStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/GenerateResponseFromModelStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class GenerateResponseFromModelStep : ScriptStep, IStepFactory
+public sealed class GenerateResponseFromModelStep : ScriptStep, IStepFactory
{
public const int XmlId = 220;
public const string XmlName = "Generate Response from Model";
@@ -24,22 +22,12 @@ public GenerateResponseFromModelStep(StepChildBag? children = null, bool enabled
Children = children ?? new StepChildBag();
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
///
/// Display edits are anchor-preserved when a configured child subtree is
/// present — the display line carries only the step name.
///
public override bool IsFullyEditable => Children.Children.Count == 0;
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -49,7 +37,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
[
new Passthrough { PocoProperty = "Children" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/GetDataFilePositionStep.cs b/src/SharpFM.Model/Scripting/Steps/GetDataFilePositionStep.cs
index 699cc6c0..f7dd75f9 100644
--- a/src/SharpFM.Model/Scripting/Steps/GetDataFilePositionStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/GetDataFilePositionStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class GetDataFilePositionStep : ScriptStep, IStepFactory
+public sealed class GetDataFilePositionStep : ScriptStep, IStepFactory
{
public const int XmlId = 194;
public const string XmlName = "Get Data File Position";
@@ -23,16 +21,6 @@ public GetDataFilePositionStep(Calculation? fileId = null, FieldRef? target = nu
Target = target;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -45,7 +33,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new BareCalcChild { PocoProperty = "FileId", HrLabel = "File ID", Required = true, Optional = true, DisplayEmptyAs = "" },
new FieldChild() { PocoProperty = "Target", HrLabel = "Target", Optional = true },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/GetFileExistsStep.cs b/src/SharpFM.Model/Scripting/Steps/GetFileExistsStep.cs
index 715857ba..4e5e2924 100644
--- a/src/SharpFM.Model/Scripting/Steps/GetFileExistsStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/GetFileExistsStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class GetFileExistsStep : ScriptStep, IStepFactory
+public sealed class GetFileExistsStep : ScriptStep, IStepFactory
{
public const int XmlId = 188;
public const string XmlName = "Get File Exists";
@@ -23,16 +21,6 @@ public GetFileExistsStep(string path = "", FieldRef? target = null, bool enabled
Target = target;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -45,7 +33,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new NamedTextChild("UniversalPathList") { PocoProperty = "Path", Required = true, Optional = true, DisplayEmptyAs = "" },
new FieldChild() { PocoProperty = "Target", HrLabel = "Target", Optional = true },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/GetFileSizeStep.cs b/src/SharpFM.Model/Scripting/Steps/GetFileSizeStep.cs
index cdb8dd86..21eb3273 100644
--- a/src/SharpFM.Model/Scripting/Steps/GetFileSizeStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/GetFileSizeStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class GetFileSizeStep : ScriptStep, IStepFactory
+public sealed class GetFileSizeStep : ScriptStep, IStepFactory
{
public const int XmlId = 189;
public const string XmlName = "Get File Size";
@@ -23,16 +21,6 @@ public GetFileSizeStep(string path = "", FieldRef? target = null, bool enabled =
Target = target;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -45,7 +33,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new NamedTextChild("UniversalPathList") { PocoProperty = "Path", Required = true, Optional = true, DisplayEmptyAs = "" },
new FieldChild() { PocoProperty = "Target", HrLabel = "Target", Optional = true },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/GetFolderPathStep.cs b/src/SharpFM.Model/Scripting/Steps/GetFolderPathStep.cs
index 5b544179..d37fa6d5 100644
--- a/src/SharpFM.Model/Scripting/Steps/GetFolderPathStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/GetFolderPathStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class GetFolderPathStep : ScriptStep, IStepFactory
+public sealed class GetFolderPathStep : ScriptStep, IStepFactory
{
public const int XmlId = 181;
public const string XmlName = "Get Folder Path";
@@ -35,16 +33,6 @@ public GetFolderPathStep(
Calculation3 = calculation3;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -61,7 +49,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new NamedCalcChild("DefaultLocation") { PocoProperty = "Calculation2", Optional = true, DisplayEmptyAs = "" },
new NamedCalcChild("Repetition") { PocoProperty = "Calculation3", Optional = true, DisplayEmptyAs = "" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/GoToFieldStep.cs b/src/SharpFM.Model/Scripting/Steps/GoToFieldStep.cs
index 679a9e82..b7e8527f 100644
--- a/src/SharpFM.Model/Scripting/Steps/GoToFieldStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/GoToFieldStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class GoToFieldStep : ScriptStep, IStepFactory
+public sealed class GoToFieldStep : ScriptStep, IStepFactory
{
public const int XmlId = 17;
public const string XmlName = "Go to Field";
@@ -26,16 +24,6 @@ public GoToFieldStep(
Target = target;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -49,7 +37,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new BoolStateChild("SelectAll") { PocoProperty = "SelectPerform", HrLabel = "Select/perform", ValidValues = ["On", "Off"], DefaultValue = "True" },
new FieldChild("Field") { PocoProperty = "Target", Optional = true, DisplayEmptyAs = "" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/GoToLayoutStep.cs b/src/SharpFM.Model/Scripting/Steps/GoToLayoutStep.cs
index 2f67724f..dbb7d0ee 100644
--- a/src/SharpFM.Model/Scripting/Steps/GoToLayoutStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/GoToLayoutStep.cs
@@ -3,7 +3,6 @@
using System.Text.RegularExpressions;
using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
@@ -24,7 +23,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// schema access.
///
///
-public sealed class GoToLayoutStep : ScriptStep, IStepFactory
+public sealed class GoToLayoutStep : ScriptStep, IStepFactory
{
public const int XmlId = 6;
public const string XmlName = "Go to Layout";
@@ -32,6 +31,11 @@ public sealed class GoToLayoutStep : ScriptStep, IStepFactory
public LayoutTarget Target { get; set; }
public Animation? Animation { get; set; }
+ private GoToLayoutStep() : base(false)
+ {
+ Target = new LayoutTarget.Original();
+ }
+
public GoToLayoutStep(bool enabled, LayoutTarget target, Animation? animation = null)
: base(enabled)
{
@@ -41,13 +45,12 @@ public GoToLayoutStep(bool enabled, LayoutTarget target, Animation? animation =
// --- XML parse ---
- // Hand-written rather than StepXmlParser: the reader is deliberately more
- // tolerant than the canonical shape — it accepts legacy wire-value aliases
- // and degrades a SelectedLayout with no named reference to Original
- // instead of materializing an empty target.
- public static new ScriptStep FromXml(XElement step)
+ // Hand-written: the reader is deliberately more tolerant than the
+ // canonical shape — it accepts legacy wire-value aliases and degrades a
+ // SelectedLayout with no named reference to Original instead of
+ // materializing an empty target.
+ protected internal override void PopulateFromXml(XElement step)
{
- var enabled = step.Attribute("enable")?.Value != "False";
var destWire = step.Element("LayoutDestination")?.Attribute("value")?.Value ?? "SelectedLayout";
var layoutEl = step.Element("Layout");
@@ -73,7 +76,8 @@ public GoToLayoutStep(bool enabled, LayoutTarget target, Animation? animation =
var animationEl = step.Element("Animation");
var animation = animationEl is not null ? Values.Animation.FromXml(animationEl) : null;
- return new GoToLayoutStep(enabled, target, animation);
+ Target = target;
+ Animation = animation;
}
private static Calculation ReadCalculationFromLayout(XElement? layoutEl)
@@ -82,10 +86,6 @@ private static Calculation ReadCalculationFromLayout(XElement? layoutEl)
return calcEl is not null ? Calculation.FromXml(calcEl) : new Calculation("");
}
- // --- XML emit ---
-
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// --- Display text render ---
// Hand-written: quoted "layout name" / original-layout variant grammar
@@ -131,7 +131,7 @@ public override string ToDisplayLine()
"^\"(?.*)\"\\s*\\(#(?\\d+)\\)$",
RegexOptions.Compiled);
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
LayoutTarget target = new LayoutTarget.Original();
Animation? animation = null;
@@ -181,7 +181,8 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
}
}
- return new GoToLayoutStep(enabled, target, animation);
+ Target = target;
+ Animation = animation;
}
public static StepMetadata Metadata { get; } = new()
@@ -220,7 +221,5 @@ [new EnumValueChild("LayoutDestination") { PocoProperty = "WireValue" }])
new HrOnly("Layout"),
new ValueTypeChild("Animation") { Display = DisplayMode.Augmented },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/GoToListOfRecordsStep.cs b/src/SharpFM.Model/Scripting/Steps/GoToListOfRecordsStep.cs
index 6b4fa97b..c80266b7 100644
--- a/src/SharpFM.Model/Scripting/Steps/GoToListOfRecordsStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/GoToListOfRecordsStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
@@ -11,7 +9,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// IDs (list of values, JSON array, or array of {recordId} objects),
/// a layout destination enum, and window geometry for the new-window mode.
///
-public sealed class GoToListOfRecordsStep : ScriptStep, IStepFactory
+public sealed class GoToListOfRecordsStep : ScriptStep, IStepFactory
{
public const int XmlId = 228;
public const string XmlName = "Go to List of Records";
@@ -37,8 +35,6 @@ public GoToListOfRecordsStep(
WindowStyles = windowStyles ?? NewWindowStyles.Default();
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: shows RowList/Layout in the reverse of canonical XML order
// and "New window" as a conditional bare token a BoolStateChild cannot render.
public override string ToDisplayLine()
@@ -52,12 +48,9 @@ public override string ToDisplayLine()
return $"Go to List of Records [ {string.Join(" ; ", parts)} ]";
}
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
// Hand-written: display is lossy (RowList is the only parseable field) and
// an unlabeled shape parse would mis-bind the labeled Records/Layout tokens.
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
Calculation rowList = new("");
foreach (var tok in hrParams)
@@ -66,7 +59,10 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
if (t.StartsWith("Records:", System.StringComparison.OrdinalIgnoreCase))
rowList = new Calculation(t.Substring(8).Trim());
}
- return new GoToListOfRecordsStep(false, "CurrentLayout", rowList, null, enabled);
+ ShowInNewWindow = false;
+ LayoutDestination = "CurrentLayout";
+ RowList = rowList;
+ WindowStyles = NewWindowStyles.Default();
}
public static StepMetadata Metadata { get; } = new()
@@ -84,7 +80,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
new NamedCalcChild("RowList") { PocoProperty = "RowList", Optional = true, Display = DisplayMode.Native },
new ValueTypeChild("NewWndStyles") { PocoProperty = "WindowStyles", Display = DisplayMode.Native },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/GoToNextFieldStep.cs b/src/SharpFM.Model/Scripting/Steps/GoToNextFieldStep.cs
index f89de3d6..2a58960e 100644
--- a/src/SharpFM.Model/Scripting/Steps/GoToNextFieldStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/GoToNextFieldStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -9,7 +7,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name). All round-tripped exactly.
/// No child elements in FM Pro's clipboard output; no hidden state.
///
-public sealed class GoToNextFieldStep : ScriptStep, IStepFactory
+public sealed class GoToNextFieldStep : ScriptStep, IStepFactory
{
public const int XmlId = 4;
public const string XmlName = "Go to Next Field";
@@ -18,23 +16,11 @@ private GoToNextFieldStep() : base(false) { }
public GoToNextFieldStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "navigation",
HelpUrl = "https://help.claris.com/en/pro-help/content/go-to-next-field.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/GoToObjectStep.cs b/src/SharpFM.Model/Scripting/Steps/GoToObjectStep.cs
index 854964ef..cda9612e 100644
--- a/src/SharpFM.Model/Scripting/Steps/GoToObjectStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/GoToObjectStep.cs
@@ -1,15 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class GoToObjectStep : ScriptStep, IStepFactory
+public sealed class GoToObjectStep : ScriptStep, IStepFactory
{
public const int XmlId = 145;
public const string XmlName = "Go to Object";
@@ -29,17 +27,12 @@ public GoToObjectStep(
Calculation2 = calculation2 ?? new Calculation("");
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: quoted "object name" token form the shape renderer
// cannot produce.
public override string ToDisplayLine() =>
"Go to Object [ " + Calculation.Text + " ; " + Calculation2.Text + " ]";
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
// Positional display grammar: [ object-name ; repetition ]. Trailing
// empty tokens are dropped by the param splitter.
@@ -50,7 +43,8 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
Calculation? calculation2_v = tokens.Length > 1 && tokens[1].Length > 0
? new Calculation(tokens[1])
: null;
- return new GoToObjectStep(calculation_v, calculation2_v, enabled);
+ Calculation = calculation_v ?? new Calculation("");
+ Calculation2 = calculation2_v ?? new Calculation("");
}
public static StepMetadata Metadata { get; } = new()
@@ -66,7 +60,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
new NamedCalcChild("ObjectName") { PocoProperty = "Calculation", Optional = true, Display = DisplayMode.Native },
new NamedCalcChild("Repetition") { PocoProperty = "Calculation2", Optional = true, Display = DisplayMode.Native },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/GoToPortalRowStep.cs b/src/SharpFM.Model/Scripting/Steps/GoToPortalRowStep.cs
index d466fd48..bfb0e929 100644
--- a/src/SharpFM.Model/Scripting/Steps/GoToPortalRowStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/GoToPortalRowStep.cs
@@ -1,13 +1,11 @@
using System;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class GoToPortalRowStep : ScriptStep, IStepFactory
+public sealed class GoToPortalRowStep : ScriptStep, IStepFactory
{
public const int XmlId = 99;
public const string XmlName = "Go to Portal Row";
@@ -59,8 +57,6 @@ public GoToPortalRowStep(
Calculation = calculation;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: per-mode conditional token grammar (First/Last/Previous/
// Next/ByCalculation) the shape renderer cannot produce.
public override string ToDisplayLine()
@@ -72,10 +68,7 @@ public override string ToDisplayLine()
return $"Go to Portal Row [ {string.Join(" ; ", parts)} ]";
}
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
string location = "Next";
bool selectAll = false, exit = false;
@@ -94,7 +87,11 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
locSeen = true;
}
}
- return new GoToPortalRowStep(true, selectAll, location, exit, calc, enabled);
+ WithDialog = true;
+ SelectAll = selectAll;
+ Location = location;
+ ExitAfterLast = exit;
+ Calculation = calc;
}
public static StepMetadata Metadata { get; } = new()
@@ -111,7 +108,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
new BoolStateChild("Exit") { PocoProperty = "ExitWire", Optional = true, HrLabel = "Exit after last" },
new BareCalcChild { PocoProperty = "CalculationWire", Optional = true },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/GoToPreviousFieldStep.cs b/src/SharpFM.Model/Scripting/Steps/GoToPreviousFieldStep.cs
index 1c3a41c3..9b46108f 100644
--- a/src/SharpFM.Model/Scripting/Steps/GoToPreviousFieldStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/GoToPreviousFieldStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -9,7 +7,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name). All round-tripped exactly.
/// No child elements in FM Pro's clipboard output; no hidden state.
///
-public sealed class GoToPreviousFieldStep : ScriptStep, IStepFactory
+public sealed class GoToPreviousFieldStep : ScriptStep, IStepFactory
{
public const int XmlId = 5;
public const string XmlName = "Go to Previous Field";
@@ -18,23 +16,11 @@ private GoToPreviousFieldStep() : base(false) { }
public GoToPreviousFieldStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "navigation",
HelpUrl = "https://help.claris.com/en/pro-help/content/go-to-previous-field.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/GoToRecordStep.cs b/src/SharpFM.Model/Scripting/Steps/GoToRecordStep.cs
index 5b68dc94..eaedd336 100644
--- a/src/SharpFM.Model/Scripting/Steps/GoToRecordStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/GoToRecordStep.cs
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
@@ -20,7 +19,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// (inverted from NoInteract state) and the target calculation.
///
///
-public sealed class GoToRecordStep : ScriptStep, IStepFactory
+public sealed class GoToRecordStep : ScriptStep, IStepFactory
{
public const int XmlId = 16;
public const string XmlName = "Go to Record/Request/Page";
@@ -31,14 +30,19 @@ public sealed class GoToRecordStep : ScriptStep, IStepFactory
public bool NoInteract { get; set; }
// Emit-only wire projections for the shape renderer: get-only, so the
- // shape parser skips them (FromXml stays hand-written for the typed enum).
- // Null means "element not emitted for this location".
+ // shape parser skips them (PopulateFromXml stays hand-written for the
+ // typed enum). Null means "element not emitted for this location".
public string LocationWire => LocationWireValue(Location);
public bool? ExitWire =>
Location is RowPageLocationKind.Next or RowPageLocationKind.Previous ? ExitAfterLast : null;
public Calculation? LocationCalcWire =>
Location == RowPageLocationKind.ByCalculation ? LocationCalc : null;
+ private GoToRecordStep() : base(false)
+ {
+ Location = RowPageLocationKind.First;
+ }
+
public GoToRecordStep(
bool enabled,
RowPageLocationKind location,
@@ -53,10 +57,8 @@ public GoToRecordStep(
NoInteract = noInteract;
}
- public static new ScriptStep FromXml(XElement step)
+ protected internal override void PopulateFromXml(XElement step)
{
- var enabled = step.Attribute("enable")?.Value != "False";
-
var locationWire = step.Element("RowPageLocation")?.Attribute("value")?.Value ?? "First";
var location = ParseLocation(locationWire);
@@ -70,11 +72,12 @@ public GoToRecordStep(
var exitAfterLast = step.Element("Exit")?.Attribute("state")?.Value == "True";
var noInteract = step.Element("NoInteract")?.Attribute("state")?.Value == "True";
- return new GoToRecordStep(enabled, location, locationCalc, exitAfterLast, noInteract);
+ Location = location;
+ LocationCalc = locationCalc;
+ ExitAfterLast = exitAfterLast;
+ NoInteract = noInteract;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: per-mode conditional token grammar (First/Last/Previous/
// Next/ByCalculation) the shape renderer cannot produce.
public override string ToDisplayLine()
@@ -106,7 +109,7 @@ public override string ToDisplayLine()
return $"Go to Record/Request/Page [ {string.Join(" ; ", parts)} ]";
}
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
var location = RowPageLocationKind.First;
Calculation? locationCalc = null;
@@ -142,7 +145,10 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
location = RowPageLocationKind.Previous;
}
- return new GoToRecordStep(enabled, location, locationCalc, exitAfterLast, noInteract);
+ Location = location;
+ LocationCalc = locationCalc;
+ ExitAfterLast = exitAfterLast;
+ NoInteract = noInteract;
}
public static StepMetadata Metadata { get; } = new()
@@ -161,8 +167,6 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
new EnumValueChild("RowPageLocation") { PocoProperty = "LocationWire", ValidValues = ["First", "Last", "Previous", "Next", "ByCalculation"], DefaultValue = "Next" },
new BareCalcChild { PocoProperty = "LocationCalcWire", Optional = true },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
private static RowPageLocationKind ParseLocation(string wire) => wire switch
diff --git a/src/SharpFM.Model/Scripting/Steps/GoToRelatedRecordStep.cs b/src/SharpFM.Model/Scripting/Steps/GoToRelatedRecordStep.cs
index 20c38261..a2780d32 100644
--- a/src/SharpFM.Model/Scripting/Steps/GoToRelatedRecordStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/GoToRelatedRecordStep.cs
@@ -1,7 +1,5 @@
using System;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
@@ -14,7 +12,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// Table reference, and an optional Layout. The skill documents no
/// <Animation> element for this step, so SharpFM no longer emits one.
///
-public sealed class GoToRelatedRecordStep : ScriptStep, IStepFactory
+public sealed class GoToRelatedRecordStep : ScriptStep, IStepFactory
{
public const int XmlId = 74;
public const string XmlName = "Go to Related Record";
@@ -61,8 +59,6 @@ public GoToRelatedRecordStep(
Layout = layout;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: quoted "From table:"/"Using layout:" grammar the shape
// renderer cannot produce.
public override string ToDisplayLine()
@@ -77,10 +73,7 @@ public override string ToDisplayLine()
return $"Go to Related Record [ {string.Join(" ; ", parts)} ]";
}
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
// Display form is lossy — NewWndStyles attrs and LayoutDestination calc
// variants can't all round-trip.
@@ -101,7 +94,14 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
else if (t.Equals("New window", StringComparison.OrdinalIgnoreCase))
newWindow = true;
}
- return new GoToRelatedRecordStep(showOnly, matchAll, newWindow, true, "SelectedLayout", null, table, layout, enabled);
+ ShowOnlyRelated = showOnly;
+ MatchAllRecords = matchAll;
+ ShowInNewWindow = newWindow;
+ RestoreWindowGeometry = true;
+ LayoutDestination = "SelectedLayout";
+ WindowStyles = NewWindowStyles.Default();
+ Table = table ?? new NamedRef(0, "");
+ Layout = layout;
}
private static string Unquote(string s)
@@ -133,7 +133,5 @@ private static string Unquote(string s)
new NamedRefChild("Layout") { PocoProperty = "Layout", Optional = true, Display = DisplayMode.Native },
new HrOnly("NewWndStyles"),
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/HaltScriptStep.cs b/src/SharpFM.Model/Scripting/Steps/HaltScriptStep.cs
index 4d115ee8..36651fd7 100644
--- a/src/SharpFM.Model/Scripting/Steps/HaltScriptStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/HaltScriptStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
namespace SharpFM.Model.Scripting.Steps;
@@ -9,7 +7,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// <Step> attributes (enable/id/name). All round-tripped exactly.
/// No child elements in FM Pro's clipboard output; no hidden state.
///
-public sealed class HaltScriptStep : ScriptStep, IStepFactory
+public sealed class HaltScriptStep : ScriptStep, IStepFactory
{
public const int XmlId = 90;
public const string XmlName = "Halt Script";
@@ -18,23 +16,11 @@ private HaltScriptStep() : base(false) { }
public HaltScriptStep(bool enabled = true) : base(enabled) { }
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
Id = XmlId,
Category = "control",
HelpUrl = "https://help.claris.com/en/pro-help/content/halt-script.html",
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/ImportRecordsStep.cs b/src/SharpFM.Model/Scripting/Steps/ImportRecordsStep.cs
index 7dd61ad7..3dc03052 100644
--- a/src/SharpFM.Model/Scripting/Steps/ImportRecordsStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/ImportRecordsStep.cs
@@ -2,7 +2,6 @@
using System.Linq;
using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
@@ -14,7 +13,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// mapping is typed via ImportTargetField (map: Import / DoNotImport /
/// Match).
///
-public sealed class ImportRecordsStep : ScriptStep, IStepFactory
+public sealed class ImportRecordsStep : ScriptStep, IStepFactory
{
public const int XmlId = 35;
public const string XmlName = "Import Records";
@@ -108,16 +107,6 @@ public ImportRecordsStep(
TargetFields = targetFields ?? new List();
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -138,7 +127,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new HrOnly("Table"),
new HrOnly("TargetFields"),
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/InsertAudioVideoStep.cs b/src/SharpFM.Model/Scripting/Steps/InsertAudioVideoStep.cs
index 70c259de..233a815c 100644
--- a/src/SharpFM.Model/Scripting/Steps/InsertAudioVideoStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/InsertAudioVideoStep.cs
@@ -1,8 +1,6 @@
using System;
using System.Linq;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
namespace SharpFM.Model.Scripting.Steps;
@@ -13,7 +11,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// that carries BOTH the file path as text content AND a "type"
/// attribute marking the payload as embedded or a reference.
///
-public sealed class InsertAudioVideoStep : ScriptStep, IStepFactory
+public sealed class InsertAudioVideoStep : ScriptStep, IStepFactory
{
public const int XmlId = 159;
public const string XmlName = "Insert Audio/Video";
@@ -33,17 +31,12 @@ public InsertAudioVideoStep(
Reference = reference;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: the single wire element splits into two display tokens
// (path text + type attribute), which the shape renderer cannot produce.
public override string ToDisplayLine() =>
$"Insert Audio/Video [ {Path} ; Reference: {Reference} ]";
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
var tokens = hrParams.Select(h => h.Trim()).ToArray();
string reference = "Embedded";
@@ -57,7 +50,8 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
}
var path = tokens.FirstOrDefault(t =>
!t.StartsWith("Reference:", StringComparison.OrdinalIgnoreCase)) ?? "";
- return new InsertAudioVideoStep(path, reference, enabled);
+ Path = path;
+ Reference = reference;
}
public static StepMetadata Metadata { get; } = new()
@@ -79,7 +73,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
ValidValues = ["Embedded", "Reference"],
},
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/InsertCalculatedResultStep.cs b/src/SharpFM.Model/Scripting/Steps/InsertCalculatedResultStep.cs
index 6e155e5f..3deb9222 100644
--- a/src/SharpFM.Model/Scripting/Steps/InsertCalculatedResultStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/InsertCalculatedResultStep.cs
@@ -1,7 +1,5 @@
using System;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
@@ -15,7 +13,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// via the FieldRef's IsVariable flag and emitting the <Text/> sibling
/// accordingly.
///
-public sealed class InsertCalculatedResultStep : ScriptStep, IStepFactory
+public sealed class InsertCalculatedResultStep : ScriptStep, IStepFactory
{
public const int XmlId = 77;
public const string XmlName = "Insert Calculated Result";
@@ -38,8 +36,6 @@ public InsertCalculatedResultStep(
Calculation = calculation;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: bare "Select" presence token from a BoolStateChild, which
// always renders labeled On/Off.
public override string ToDisplayLine()
@@ -49,10 +45,7 @@ public override string ToDisplayLine()
return $"Insert Calculated Result [ {selectPart}{targetPart}{Calculation?.Text ?? ""} ]";
}
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
bool selectAll = false;
FieldRef? target = null;
@@ -71,7 +64,9 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
calcSeen = true;
}
}
- return new InsertCalculatedResultStep(selectAll, target, calc, enabled);
+ SelectAll = selectAll;
+ Target = target;
+ Calculation = calc;
}
public static StepMetadata Metadata { get; } = new()
@@ -89,7 +84,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
new BareCalcChild { PocoProperty = "Calculation", Optional = true, Display = DisplayMode.Native },
new FieldChild("Field") { PocoProperty = "Target", HrLabel = "Target", Optional = true, VariableTextMarker = true, Display = DisplayMode.Native },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/InsertCurrentDateStep.cs b/src/SharpFM.Model/Scripting/Steps/InsertCurrentDateStep.cs
index 25e20fa8..1f30a76e 100644
--- a/src/SharpFM.Model/Scripting/Steps/InsertCurrentDateStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/InsertCurrentDateStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class InsertCurrentDateStep : ScriptStep, IStepFactory
+public sealed class InsertCurrentDateStep : ScriptStep, IStepFactory
{
public const int XmlId = 13;
public const string XmlName = "Insert Current Date";
@@ -26,16 +24,6 @@ public InsertCurrentDateStep(
Target = target;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -49,7 +37,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new BoolStateChild("SelectAll") { PocoProperty = "Select", HrLabel = "Select", ValidValues = ["On", "Off"], DefaultValue = "True" },
new FieldChild("Field") { PocoProperty = "Target", HrLabel = "Target", Optional = true, DisplayEmptyAs = "" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/InsertCurrentTimeStep.cs b/src/SharpFM.Model/Scripting/Steps/InsertCurrentTimeStep.cs
index e55d6e79..484adca9 100644
--- a/src/SharpFM.Model/Scripting/Steps/InsertCurrentTimeStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/InsertCurrentTimeStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class InsertCurrentTimeStep : ScriptStep, IStepFactory
+public sealed class InsertCurrentTimeStep : ScriptStep, IStepFactory
{
public const int XmlId = 14;
public const string XmlName = "Insert Current Time";
@@ -26,16 +24,6 @@ public InsertCurrentTimeStep(
Target = target;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -49,7 +37,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new BoolStateChild("SelectAll") { PocoProperty = "Select", HrLabel = "Select", ValidValues = ["On", "Off"], DefaultValue = "True" },
new FieldChild("Field") { PocoProperty = "Target", HrLabel = "Target", Optional = true, DisplayEmptyAs = "" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/InsertCurrentUserNameStep.cs b/src/SharpFM.Model/Scripting/Steps/InsertCurrentUserNameStep.cs
index 37637937..0832be14 100644
--- a/src/SharpFM.Model/Scripting/Steps/InsertCurrentUserNameStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/InsertCurrentUserNameStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class InsertCurrentUserNameStep : ScriptStep, IStepFactory
+public sealed class InsertCurrentUserNameStep : ScriptStep, IStepFactory
{
public const int XmlId = 60;
public const string XmlName = "Insert Current User Name";
@@ -26,16 +24,6 @@ public InsertCurrentUserNameStep(
Target = target;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -49,7 +37,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new BoolStateChild("SelectAll") { PocoProperty = "Select", HrLabel = "Select", ValidValues = ["On", "Off"], DefaultValue = "True" },
new FieldChild("Field") { PocoProperty = "Target", HrLabel = "Target", Optional = true, DisplayEmptyAs = "" },
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/InsertEmbeddingInFoundSetStep.cs b/src/SharpFM.Model/Scripting/Steps/InsertEmbeddingInFoundSetStep.cs
index 05253534..cedc7ac9 100644
--- a/src/SharpFM.Model/Scripting/Steps/InsertEmbeddingInFoundSetStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/InsertEmbeddingInFoundSetStep.cs
@@ -1,7 +1,5 @@
using System;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
@@ -14,7 +12,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// the presence-flag options (Overwrite / ContinueOnError / ShowSummary) and the
/// optional parameters calc. Emitted as an empty wrapper when unconfigured.
///
-public sealed class InsertEmbeddingInFoundSetStep : ScriptStep, IStepFactory
+public sealed class InsertEmbeddingInFoundSetStep : ScriptStep, IStepFactory
{
public const int XmlId = 216;
public const string XmlName = "Insert Embedding in Found Set";
@@ -52,8 +50,6 @@ public InsertEmbeddingInFoundSetStep(
Parameters = parameters;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: FileMaker's token order (account/model first, target
// mid-line) diverges from the canonical XML order the shape must keep.
public override string ToDisplayLine()
@@ -72,12 +68,6 @@ public override string ToDisplayLine()
return $"Insert Embedding in Found Set [ {string.Join(" ; ", parts)} ]";
}
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -100,7 +90,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new NamedCalcChild("Parameters") { PocoProperty = "Parameters", HrLabel = "Parameters", Optional = true, Display = DisplayMode.Augmented },
]),
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/InsertEmbeddingStep.cs b/src/SharpFM.Model/Scripting/Steps/InsertEmbeddingStep.cs
index 4aae6a2b..c9b9b745 100644
--- a/src/SharpFM.Model/Scripting/Steps/InsertEmbeddingStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/InsertEmbeddingStep.cs
@@ -1,7 +1,5 @@
using System;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
@@ -13,7 +11,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// account/model/input calculations; the wrapper is emitted empty when the step
/// is unconfigured.
///
-public sealed class InsertEmbeddingStep : ScriptStep, IStepFactory
+public sealed class InsertEmbeddingStep : ScriptStep, IStepFactory
{
public const int XmlId = 215;
public const string XmlName = "Insert Embedding";
@@ -39,8 +37,6 @@ public InsertEmbeddingStep(
Target = target;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: FileMaker shows the Target last, but the shape must keep
// the canonical XML order (Field before the LLMEmbedding wrapper).
public override string ToDisplayLine()
@@ -55,12 +51,6 @@ public override string ToDisplayLine()
return $"Insert Embedding [ {string.Join(" ; ", parts)} ]";
}
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -78,7 +68,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
new NamedCalcChild("InputText") { PocoProperty = "InputText", HrLabel = "Input", Optional = true, Display = DisplayMode.Augmented },
]),
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/InsertFileStep.cs b/src/SharpFM.Model/Scripting/Steps/InsertFileStep.cs
index 6a18e924..520b7f67 100644
--- a/src/SharpFM.Model/Scripting/Steps/InsertFileStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/InsertFileStep.cs
@@ -1,13 +1,11 @@
using System;
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class InsertFileStep : ScriptStep, IStepFactory
+public sealed class InsertFileStep : ScriptStep, IStepFactory
{
public const int XmlId = 131;
public const string XmlName = "Insert File";
@@ -33,8 +31,6 @@ public InsertFileStep(
DialogOptions = dialogOptions;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
// Hand-written: the storage/compression/display-content tokens live inside
// the DialogOptions value type, which the shape-driven renderer cannot
// surface; token order also differs from shape order (Path renders last).
@@ -65,9 +61,6 @@ public override string ToDisplayLine()
return parts.Count == 0 ? "Insert File" : $"Insert File [ {string.Join(" ; ", parts)} ]";
}
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
///
/// Display edits are anchor-preserved when dialog state the display line
/// cannot carry is present: a missing DialogOptions block, a custom
@@ -78,7 +71,7 @@ public override string ToDisplayLine()
public override bool IsFullyEditable =>
DialogOptions is { Enable: false, Title: null, FilterListXml: null };
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
+ protected internal override void PopulateFromDisplay(string[] hrParams)
{
string path = "";
FieldRef? target = null;
@@ -100,7 +93,10 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
path = t;
}
var dialogOptions = new InsertFileDialogOptions(asFile, false, null, storage, compress, null);
- return new InsertFileStep(path, "Embedded", target, dialogOptions, enabled);
+ Path = path;
+ PathType = "Embedded";
+ Target = target;
+ DialogOptions = dialogOptions;
}
public static StepMetadata Metadata { get; } = new()
@@ -115,7 +111,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams)
new FieldChild { PocoProperty = "Target", Optional = true, VariableTextMarker = true, HrLabel = "Target" },
new ValueTypeChild("DialogOptions"),
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/InsertFromDeviceStep.cs b/src/SharpFM.Model/Scripting/Steps/InsertFromDeviceStep.cs
index 04e622ce..f00f318b 100644
--- a/src/SharpFM.Model/Scripting/Steps/InsertFromDeviceStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/InsertFromDeviceStep.cs
@@ -1,6 +1,4 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
@@ -13,7 +11,7 @@ namespace SharpFM.Model.Scripting.Steps;
/// Photo Library, Music Library, Barcode, Signature) — preserved
/// verbatim via for round-trip fidelity.
///
-public sealed class InsertFromDeviceStep : ScriptStep, IStepFactory
+public sealed class InsertFromDeviceStep : ScriptStep, IStepFactory
{
public const int XmlId = 161;
public const string XmlName = "Insert from Device";
@@ -40,13 +38,6 @@ public InsertFromDeviceStep(
DeviceOptions = deviceOptions ?? new StepChildBag();
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
///
/// Display edits are anchor-preserved when a device-specific options
/// subtree is present — the display line shows only the source and
@@ -54,9 +45,6 @@ public InsertFromDeviceStep(
///
public override bool IsFullyEditable => DeviceOptions.Children.Count == 0;
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse(enabled, hrParams, Metadata);
-
public static StepMetadata Metadata { get; } = new()
{
Name = XmlName,
@@ -76,7 +64,5 @@ public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
]),
new HrOnly("DeviceOptions"),
],
- FromXml = FromXml,
- FromDisplay = FromDisplayParams,
};
}
diff --git a/src/SharpFM.Model/Scripting/Steps/InsertFromIndexStep.cs b/src/SharpFM.Model/Scripting/Steps/InsertFromIndexStep.cs
index 071228ce..e43751dc 100644
--- a/src/SharpFM.Model/Scripting/Steps/InsertFromIndexStep.cs
+++ b/src/SharpFM.Model/Scripting/Steps/InsertFromIndexStep.cs
@@ -1,12 +1,10 @@
-using System.Xml.Linq;
using SharpFM.Model.Scripting.Registry;
-using SharpFM.Model.Scripting.Serialization;
using SharpFM.Model.Scripting.Shapes;
using SharpFM.Model.Scripting.Values;
namespace SharpFM.Model.Scripting.Steps;
-public sealed class InsertFromIndexStep : ScriptStep, IStepFactory
+public sealed class InsertFromIndexStep : ScriptStep, IStepFactory
{
public const int XmlId = 11;
public const string XmlName = "Insert from Index";
@@ -26,16 +24,6 @@ public InsertFromIndexStep(
Target = target;
}
- public override XElement ToXml() => StepXmlRenderer.Render(this, Metadata);
-
- public override string ToDisplayLine() => StepDisplayRenderer.Render(this, Metadata);
-
- public static new ScriptStep FromXml(XElement step) =>
- StepXmlParser.Parse(step, Metadata);
-
- public static ScriptStep FromDisplayParams(bool enabled, string[] hrParams) =>
- StepDisplayParser.Parse