Untitled

 avatar
unknown
pascal
5 months ago
6.9 kB
2
Indexable
using System.Text.RegularExpressions;

namespace EditFormatInserter
{
    internal class Program
    {
        static Regex GetComponentNameRegex = new Regex(@"object ([A-Z0-9\._]+): \w+", RegexOptions.IgnoreCase);
        static Regex GetPropRegex = new Regex(@"([A-Z0-9\.]+) = (.+)", RegexOptions.IgnoreCase);

        static string GetLeadSpaces(string line) => new string(line.TakeWhile(c => c == ' ').ToArray());

        static bool IsEmptyValue(string val) => string.IsNullOrWhiteSpace(val) || val == "''";

        static void DropComponent(List<string> content, int start, int end)
        {
            for (int i = end; i >= start; --i)
                content.RemoveAt(i);
        }

        static bool HasProperty(List<string> content, int start, int end, string propertyName)
        {
            for (int i = start; i < end; ++i)
            {
                if (content[i].TrimStart().StartsWith(propertyName))
                    return true;
            }

            return false;
        }

        static bool AddEditFormatToEh(List<string> content, int start, int end)
        {
            var foundKind = false;
            for (int i = start; i < end; i++)
            {
                var line = content[i];
                if (line.TrimStart().StartsWith("Kind = dtkDateEh"))
                {
                    foundKind = true;
                    break;
                }
            }

            if (!foundKind)
                return false;

            for (int i = start; i < end; i++)
            {
                var line = content[i];
                if (line.TrimStart().StartsWith("EditFormat ="))
                    return false;
            }

            var empt = GetLeadSpaces(content[end - 1]);
            content.Insert(end, empt + "EditFormat = 'DD.MM.YYYY'");
            return true;
        }

        static readonly HashSet<string> defProps = [
            "Left", "Top", "Width", "Height", "TabOrder", "TabStop",
            "Ctl3D", "Visible", "OnChange", "OnCloseUp", "ParentShowHint", "ShowHint", "Hint"
            ];

        static bool ConvertDtComponent(List<string> content, int start, int end)
        {
            if (HasProperty(content, start, end, "ShowCheckbox = True"))
                return false;

            //if (HasProperty(content, start, end, "LabelCaption ="))
            //    return false;

            var empt = GetLeadSpaces(content[start]);
            var componentName = GetComponentNameRegex.Match(content[start]).Groups[1].Value;

            var newComp = new List<string>();
            newComp.Add($"{empt}object {componentName}: TDBDateTimeEditEh");

            // AdvDateTimePicker =>
            bool hasFormat = false;
            bool hasLabel = false;
            for (int i = start; i < end; ++i)
            {
                var line = content[i];
                var name = content[i].TrimStart();
                var propMatch = GetPropRegex.Match(line);

                var val = propMatch.Groups[2].Value;
                var prop = propMatch.Groups[1].Value;

                if (defProps.Contains(prop))
                {
                    newComp.Add(line);
                }
                else if (prop == "Format" && !IsEmptyValue(val))
                {
                    newComp.Add($"{empt}  EditFormat = {val.ToUpper()}");
                    hasFormat = true;
                }
                else if (prop == "LabelCaption" && !IsEmptyValue(val))
                {
                    newComp.Add($"{empt}  ControlLabel.Caption = {val}");
                    newComp.Add($"{empt}  ControlLabel.Visible = True");
                    hasLabel = true;
                }
                else if (prop == "LabelPosition" && val == "lpTopLeft" && hasLabel)
                {
                    //Console.WriteLine("LabelPosition: " + val);
                    newComp.Add($"{empt}  ControlLabelLocation.Position = lpAboveLeftEh");
                }
                else if (prop == "LabelPosition" && val == "lpLeftCenter" && hasLabel)
                {
                    //Console.WriteLine("LabelPosition: " + val);
                    newComp.Add($"{empt}  ControlLabelLocation.Position = lpLeftCenterEh");
                }
            }

            if (!hasFormat)
                newComp.Add($"{empt}  EditFormat = 'DD.MM.YYYY'");

            newComp.Add($"{empt}end");

            DropComponent(content, start, end);
            content.InsertRange(start, newComp);
            return true;
        }

        static bool ProcessComponents(List<string> content, string componentName, Func<List<string>, int, int, bool> func)
        {
            bool result = false;
            int start = 0;
            int end = 0;

            for (int i = 0; i < content.Count; ++i)
            {
                var line = content[i];
                if (line.TrimStart().StartsWith("object") && line.EndsWith(componentName))
                {
                    start = i;
                }
                else if (start > 0 && line.Trim() == "end")
                {
                    end = i;
                }

                if (start > 0 && end > 0)
                {
                    result |= func?.Invoke(content, start, end) ?? false;
                    start = 0;
                    end = 0;
                }
            }

            return result;
        }

        static void Main(string[] args)
        {

            var dir = "D:\\proj\\VagTK\\VagTK";
            var files = Directory.GetFiles(dir, "*.dfm", SearchOption.AllDirectories);

            foreach (var file in files)
            {
                var content = File.ReadAllLines(file).ToList();

                //if (ProcessComponents(content, "TDBDateTimeEditEh", AddEditFormatToEh))
                //{
                //    File.WriteAllLines(file, content);
                //    Console.WriteLine("Done: " + file);
                //}

                if (ProcessComponents(content, "TAdvDateTimePicker", ConvertDtComponent))
                {
                    File.WriteAllLines(file, content);

                    var pas = file.Substring(0, file.Length - 3) + "pas";
                    var pasContent = File.ReadAllText(pas);

                    pasContent = pasContent.Replace("TAdvDateTimePicker", "TDBDateTimeEditEh");
                    if (pasContent.IndexOf("DBCtrlsEh") == -1)
                        pasContent = pasContent.Replace("AdvDateTimePicker", "DBCtrlsEh");

                    File.WriteAllText(pas, pasContent);

                    Console.WriteLine("Done: " + file);
                }
            }


            Console.WriteLine("Hello, World!");
        }
    }
}
Editor is loading...
Leave a Comment