private void RemovePersonFromAllChildren(IUIPerson person)
 {
     foreach (var child in person.Children)
     {
         child.Parents.Remove(person);
     }
 }
示例#2
0
        internal void RemoveParent(IUIPerson selectedPerson, IUIPerson nonParent)
        {
            this._genealogyMaster.ParentRelationManager.RemoveParent(selectedPerson, nonParent);
            this.UpdateSelectedParents(selectedPerson);

            this.UpdateImage();
        }
示例#3
0
        private void AddChildren(ref List <IWriteTo> statements, IUIPerson person, IUIPerson partner, NodeStatement point, IEnumerable <IUIPerson> childrenOfCouple)
        {
            childrenOfCouple = childrenOfCouple.Where(x => !x.IsHidden);
            var childrenSubgraphStatements = new List <IWriteTo>();

            foreach (var child in childrenOfCouple)
            {
                var childNodeDict = new Dictionary <Id, Id> {
                    { "label", child.Label }, { "shape", "box" }, { "color", child.IsFemale ? "pink" : "blue" }, { "fillcolor", "white" }, { "style", "filled" }
                }.ToImmutableDictionary();
                var childNode = new NodeStatement(child.Id.ToString(), childNodeDict);

                var childToDotDict = new Dictionary <Id, Id> {
                    { "dir", "none" }
                }.ToImmutableDictionary();
                var childToDotStatement = new EdgeStatement(point.Id.Value, child.Id.ToString(), childToDotDict);

                childrenSubgraphStatements.Add(childNode);

                statements.Add(childToDotStatement);
            }

            var childrenSubgraphStatement = new SubgraphStatement("children" + (person.Id + "z" + partner.Id), childrenSubgraphStatements.ToImmutableList());

            statements.Add(childrenSubgraphStatement);
        }
 private void RemovePersonFromAllParents(IUIPerson person)
 {
     foreach (var parent in person.Parents)
     {
         parent.Children.Remove(person);
     }
 }
示例#5
0
        internal void RemoveChild(IUIPerson selectedPerson, IUIPerson nonChild)
        {
            this._genealogyMaster.ChildRelationmanager.RemoveChild(selectedPerson, nonChild);
            this.UpdateSelectedChildren(selectedPerson);

            this.UpdateImage();
        }
        private void UnLinkImplicitPartners(IUIPerson person)
        {
            IUIPerson lastParent = null;

            foreach (var parentOfPersonToRemoveParent in person.Parents)
            {
                if (lastParent != null)
                {
                    if (lastParent.Partners.Contains(parentOfPersonToRemoveParent))
                    {
                        if (!lastParent.Children.Intersect(parentOfPersonToRemoveParent.Children).Any())
                        {
                            lastParent.Partners.Remove(parentOfPersonToRemoveParent);
                            parentOfPersonToRemoveParent.Partners.Remove(lastParent);
                        }
                    }
                }

                lastParent = parentOfPersonToRemoveParent;
            }

            foreach (var partnerOfPersonToRemove in person.Partners)
            {
                partnerOfPersonToRemove.Partners.Remove(person);
            }
        }
示例#7
0
        private void AddPartner(ref List <IWriteTo> statements, IUIPerson person, NodeStatement personNode, IUIPerson partner)
        {
            if (partner.IsHidden)
            {
                return;
            }

            var edgeDictPoint = new Dictionary <Id, Id> {
                { "shape", "point" }, { "label", "" }
            }.ToImmutableDictionary();
            var point = new NodeStatement("partners" + (partner.Id + "z" + person.Id), edgeDictPoint);

            var partnerNodeDict = new Dictionary <Id, Id> {
                { "label", partner.Label }, { "shape", "box" }, { "color", partner.IsFemale ? "pink" : "blue" }, { "fillcolor", "white" }, { "style", "filled" }
            }.ToImmutableDictionary();
            var partnerNode = new NodeStatement(partner.Id.ToString(), partnerNodeDict);

            var edgeDictLinePersonToPoint = new Dictionary <Id, Id> {
                { "dir", "none" }
            }.ToImmutableDictionary();
            var linePersonToPoint = new EdgeStatement(person.Id.ToString(), point.Id.ToString(), edgeDictLinePersonToPoint);

            var linePartnerToPointDict = new Dictionary <Id, Id> {
                { "dir", "none" }
            }.ToImmutableDictionary();
            var linePartnerToPoint = new EdgeStatement(partner.Id.ToString(), point.Id.ToString(), linePartnerToPointDict);

            var parentSubgraphExists = statements.Where(x => x is SubgraphStatement).Select(y => ((SubgraphStatement)y).Name).Any(z => z.Value == "partners" + (partner.Id + "z" + person.Id) || z.Value == "partners" + (person.Id + "z" + partner.Id));

            if (!parentSubgraphExists)
            {
                var parentSubgraphStatements = new List <IWriteTo>();

                parentSubgraphStatements.Add(point);

                parentSubgraphStatements.Add(partnerNode);

                parentSubgraphStatements.Add(personNode);

                parentSubgraphStatements.Add(linePersonToPoint);

                parentSubgraphStatements.Add(linePartnerToPoint);

                var parentSubgraphStatement = new SubgraphStatement(point.Id.ToString(), parentSubgraphStatements.ToImmutableList());
                statements.Add(parentSubgraphStatement);

                var childrenSubgraphExists = statements.Where(x => x is SubgraphStatement).Select(y => ((SubgraphStatement)y).Name).Any(z => z.Value == "children" + (partner.Id + "z" + person.Id) || z.Value == "children" + (person.Id + "z" + partner.Id));
                if (!childrenSubgraphExists)
                {
                    var childrenOfCouple = person.Children.Where(x => x.Parents.Contains(partner) && x.Parents.Contains(person)).Where(x => !x.IsHidden);
                    childrenOfCouple = childrenOfCouple.OrderByDescending(x => x.GetAllDescendants().Count);
                    this.AddChildren(ref statements, person, partner, point, childrenOfCouple);
                }
            }
        }
示例#8
0
        public void MoveOneUp(IUIPerson personToMoveUp)
        {
            var indexOfPerson = this.Persons.IndexOf(personToMoveUp);

            if (indexOfPerson > 0)
            {
                this.Persons.Swap(indexOfPerson, indexOfPerson - 1);
                this._genealogyMaster.Swap(indexOfPerson, indexOfPerson - 1);

                this.UpdateImage();
            }
        }
        public void RemoveParent(IUIPerson child, IUIPerson parent)
        {
            if (child.Parents.FirstOrDefault(x => x.Id == parent.Id) != null && parent.Children.FirstOrDefault(x => x.Id == child.Id) != null)
            {
                this.UnLinkImplicitPartners(child);

                child.Parents.Remove(parent);
                parent.Children.Remove(child);

                this.OnGenealogyChanged(new GenealogyMasterEventArgs(this.persons));
            }
        }
示例#10
0
        internal void AddParent(IUIPerson selectedPerson, IUIPerson parent)
        {
            try
            {
                this._genealogyMaster.ParentRelationManager.AddParent(selectedPerson, parent);
                this.UpdateSelectedParents(selectedPerson);
            }
            catch (InvalidStateException ex)
            {
                MessageBox.Show(ex.Message);
            }

            this.UpdateImage();
        }
示例#11
0
        private void DescendantRetriever(IUIPerson pointer, ref List <IUIPerson> descendants)
        {
            if (pointer.Children == null || !pointer.Children.Any())
            {
                return;
            }

            foreach (var descendant in pointer.Children)
            {
                descendants.Add(descendant);

                this.DescendantRetriever(descendant, ref descendants);
            }
        }
示例#12
0
        public void RemovePerson(IUIPerson person)
        {
            this.persons.Remove(person);
            this.RemovePersonFromAllChildren(person);
            this.RemovePersonFromAllParents(person);

            this.UnLinkImplicitPartners(person);

            person.Children.Clear();
            person.Parents.Clear();
            person.Partners.Clear();

            this.OnGenealogyChanged(new GenealogyMasterEventArgs(this.persons));
        }
示例#13
0
        internal void AddChild(IUIPerson selectedPerson, IUIPerson child)
        {
            try
            {
                this._genealogyMaster.ChildRelationmanager.AddChild(selectedPerson, child);
                this.UpdateSelectedChildren(selectedPerson);
            }
            catch (InvalidStateException ex)
            {
                MessageBox.Show(ex.Message);
            }

            this.UpdateImage();
        }
示例#14
0
        public List <IUIPerson> GetChildrenConceivedWithPerson(IUIPerson possiblePartner)
        {
            var commonChildren = new List <IUIPerson>();

            if (!this.Partners.Contains(possiblePartner))
            {
                return(commonChildren);
            }

            var ownChildren       = this.Children;
            var childrenOfPartner = possiblePartner.Children;

            commonChildren = ownChildren.Intersect(childrenOfPartner).ToList();

            return(commonChildren);
        }
示例#15
0
        private void UpdateSelectedParents(IUIPerson value)
        {
            this.ParentsOfSelected.Clear();

            if (value == null)
            {
                return;
            }

            foreach (var parent in value.Parents)
            {
                this.ParentsOfSelected.Add(parent);
            }

            this.UpdateImage();
        }
示例#16
0
        private void UpdateSelectedChildren(IUIPerson value)
        {
            this.ChildrenOfSelected.Clear();

            if (value == null)
            {
                return;
            }

            foreach (var child in value.Children)
            {
                this.ChildrenOfSelected.Add(child);
            }

            this.UpdateImage();
        }
示例#17
0
        public void AddPerson(IUIPerson person, bool autoDefineGender = false)
        {
            person.FirstName = person.FirstName.Trim();
            person.LastName  = person.LastName.Trim();

            if (!this.persons.Contains(person))
            {
                if (autoDefineGender)
                {
                    person.AutoDefineGender();
                }

                this.persons.Add(person);

                this.OnGenealogyChanged(new GenealogyMasterEventArgs(this.persons));
            }
        }
        private void LinkImplicitPartners(IUIPerson child)
        {
            IUIPerson lastParent = null;

            foreach (var parentOfPersonToAddParent in child.Parents)
            {
                if (lastParent != null)
                {
                    if (!lastParent.Partners.Contains(parentOfPersonToAddParent))
                    {
                        lastParent.Partners.Add(parentOfPersonToAddParent);
                        parentOfPersonToAddParent.Partners.Add(lastParent);
                    }
                }

                lastParent = parentOfPersonToAddParent;
            }
        }
        public void AddParent(IUIPerson child, IUIPerson parent)
        {
            if (child == parent)
            {
                return;
            }

            if (child.Parents.Contains(parent))
            {
                return;
            }

            if (child.Parents.Count == 2 && !child.Parents.Contains(parent))
            {
                throw new InvalidStateException(string.Format("Mehr als 2 Eltern sind nicht erlaubt und {0} hat bereits 2", child.FullName));
            }

            if (child.Children.Contains(parent) || parent.Parents.Contains(child))
            {
                throw new InvalidStateException(string.Format("Person \"{0}\" kann nicht Kind und Eltern von \"{1}\" zugergleich sein", parent.FullName, child.FullName));
            }

            if (parent.GetAllDescendants().Contains(child))
            {
                throw new InvalidStateException(string.Format("Person \"{0}\" ist bereits ein Nachfahre von \"{1}\"", child.FullName, parent.FullName));
            }

            if (!persons.Contains(parent))
            {
                persons.Add(parent);
            }

            if (!persons.Contains(child))
            {
                persons.Add(child);
            }

            child.Parents.Add(parent);
            parent.Children.Add(child);

            this.LinkImplicitPartners(child);

            this.OnGenealogyChanged(new GenealogyMasterEventArgs(this.persons));
        }
        private void UnLinkImplicitPartners(IUIPerson child)
        {
            IUIPerson lastParent = null;

            foreach (var parentOfPersonToRemoveParent in child.Parents)
            {
                if (lastParent != null)
                {
                    if (lastParent.Partners.Contains(parentOfPersonToRemoveParent))
                    {
                        if (!lastParent.GetChildrenConceivedWithPerson(parentOfPersonToRemoveParent).Any(x => x.Id != child.Id))
                        {
                            lastParent.Partners.Remove(parentOfPersonToRemoveParent);
                            parentOfPersonToRemoveParent.Partners.Remove(lastParent);
                        }
                    }
                }

                lastParent = parentOfPersonToRemoveParent;
            }
        }
示例#21
0
 public void AddPersonAsync(IUIPerson person, bool autoDefineGender = false)
 {
     Task.Run(() => AddPerson(person, autoDefineGender));
 }
 private void MoveOneUpMethod(IUIPerson personToMoveUp)
 {
     this.MainViewModel.MoveOneUp(personToMoveUp);
 }
 private void RemovePersonMethod(IUIPerson personToRemove)
 {
     this.Persons.Remove(personToRemove);
 }
示例#24
0
 public static void AutoDefineGender(this IUIPerson person)
 {
     person.IsFemale = GenderizeApi.FirstNameIsFemale(person.FirstName);
 }
示例#25
0
 private bool IsSingleParent(IUIPerson person, IEnumerable <IUIPerson> partners)
 {
     return(!partners.Any() && person.Children.Any());
 }
示例#26
0
        public PersonDetails(IUIPerson selectedPersonInList)
        {
            PersonDetailsViewModel.Person = selectedPersonInList;

            InitializeComponent();
        }