Inheritance: System.Windows.Forms.TableLayoutPanel
        private FieldPanel AddNewFieldPanel(FormularFieldDescriptor desc)
        {
            var field = new FieldPanel(desc);

            field.CanEdit = CanEditFields;
            Controls.Add(field);
            field.Locked = Locked;

            field.Change += (sender, args) =>
            {
                if (Changed != null)
                {
                    Changed(this, Formular);
                }
            };
            return(field);
        }
        protected bool LayoutByFormular(MessageFormular formular, bool keepUnused)
        {
            this.SuspendLayout();

            var empty = Enumerable.Empty <FieldPanel>();
            var prev  = FieldPanels.ToList();

            var unused = (
                from panel in prev
                where panel.IsFaulty && panel.CanEdit
                select panel
                ).Concat(
                from panel in prev
                where !panel.IsFaulty && !panel.IsEmpty
                where !formular.FieldNames.Contains(panel.Descriptor.Name)
                select panel
                ).Distinct().ToList();

            var remove = (
                from panel in prev
                where !panel.IsFaulty
                where panel.IsEmpty || !formular.FieldNames.Contains(panel.Descriptor.Name)
                select panel
                ).Concat(keepUnused? empty : unused).Distinct().ToList();

            // keep all that will
            var remain = (
                from panel in prev
                where !panel.IsFaulty
                where !panel.IsEmpty
                where formular.FieldNames.Contains(panel.Descriptor.Name)
                select panel
                ).Concat(keepUnused? unused : empty).Distinct().ToList();

            var currentDesc = (
                from panel in prev
                where !panel.IsEmpty
                select panel.Descriptor.Name
                );

            var fresh = (
                from field in formular.FieldDescriptors
                where !currentDesc.Contains(field.Name)
                select field
                ).ToList();

            var maxCount = remove.Count();
            var counter  = maxCount;

            foreach (var descriptor in fresh)
            {
                // if lingering panels available, recycle it or else instanciate new one
                if (counter > 0)
                {
                    FieldPanel revive = remove[maxCount - counter];
                    revive.Descriptor = descriptor; // will modify the checkbox and description text

                    revive.Visible = true;
                    revive.Locked  = Locked;
                    counter--;
                }
                else
                {
                    AddNewFieldPanel(descriptor);
                }
            }

            // cleanup: just keep them lingering around, recycle when needed. should speed up gui
            while (counter > 0)
            {
                FieldPanel panel = remove[maxCount - counter];
                if (panel != null && !(panel.IsFaulty && keepUnused))
                {
                    panel.IsEmpty = true;                                                   // removes Checked as well
                }
                counter--;
            }

            // update remaining fields
            foreach (FieldPanel panel in remain)
            {
                if (!panel.IsFaulty) // don't touch faulty panels, user might want to fix them later.
                {
                    var desc = formular[panel.Descriptor.Name];
                    desc.IsRequired  = panel.Checked;
                    panel.Descriptor = desc; // overwrite to stay in sync with the node's central formular
                }
            }

            this.ResumeLayout();
            return(true);
        }
Ejemplo n.º 3
0
        private FieldPanel AddNewFieldPanel(FormularFieldDescriptor desc)
        {
            var field = new FieldPanel(desc);
            field.CanEdit = CanEditFields;
            Controls.Add(field);
            field.Locked = Locked;

            field.Change += (sender, args) =>
            {
                if (Changed != null) Changed(this, Formular);
            };
            return field;
        }