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); }
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; }