public static void synchronize(EDifferenceToMake differenceToMake, NodeStructure nodeStructure, NodeStructureList nodeStructureList, TreeView treeView, ENodeStructureCheckedEntryPoint nodeStructureCheckedEntryPoint, TreeNode treeNode, int occurance)
        {
            switch (nodeStructureCheckedEntryPoint)
            {
                case (ENodeStructureCheckedEntryPoint)(0):
                    {
                        switch (differenceToMake)
                        {
                            case (EDifferenceToMake)(0):
                                {
                                    nodeStructureCheckedEntryPoint = ENodeStructureCheckedEntryPoint.USER;
                                    NodeStructureManager.check(nodeStructureList, nodeStructure, (ENodeStructureCheckedEntryPoint)(0));
                                    break;
                                }
                            case (EDifferenceToMake)(1):
                                {
                                    nodeStructureCheckedEntryPoint = ENodeStructureCheckedEntryPoint.USER;
                                    NodeStructureManager.uncheck(nodeStructureList, nodeStructure, (ENodeStructureCheckedEntryPoint)(0));
                                    break;
                                }
                        }
                        break;
                    }
                case (ENodeStructureCheckedEntryPoint)(1):
                    {
                        switch (differenceToMake)
                        {
                            case (EDifferenceToMake)(0):
                                {
                                    //nodeStructureCheckedEntryPoint = ENodeStructureCheckedEntryPoint.FORCED;
                                    NodeStructureManager.uncheck(nodeStructureList, nodeStructure, (ENodeStructureCheckedEntryPoint)(1));
                                    nodeStructureCheckedEntryPoint = ENodeStructureCheckedEntryPoint.USER;
                                    break;
                                }
                            case (EDifferenceToMake)(1):
                                {
                                    //nodeStructureCheckedEntryPoint = ENodeStructureCheckedEntryPoint.FORCED;
                                    NodeStructureManager.check(nodeStructureList, nodeStructure, (ENodeStructureCheckedEntryPoint)(1));
                                    nodeStructureCheckedEntryPoint = ENodeStructureCheckedEntryPoint.USER;
                                    break;
                                }

                        }
                        break;
                    }
            }
            fillTreeView(nodeStructureList, treeView, treeNode, occurance);
        }
 public static void check(NodeStructureList nodeStructureList, NodeStructure nodeStructure, ENodeStructureCheckedEntryPoint nodeStructureCheckedEntryPoint)
 {
     if (nodeStructure.isChild)
     {
         NodeStructure parent = NodeStructureManager.getParentNodeStructure(nodeStructure, nodeStructureList);
         NodeStructureListManager.removeNodeStructure(nodeStructure, parent.children);
         nodeStructure.isChecked = true;
         NodeStructureListManager.addNodeStructure(nodeStructure, parent.children);
         if (nodeStructure.isParent)
         {
             if (nodeStructureCheckedEntryPoint == ENodeStructureCheckedEntryPoint.FORCEDBYPARENT)
             {
                 for (int i = 0; i < nodeStructure.children.Count; i++)
                 {
                     check(nodeStructureList, nodeStructure.children[i], ENodeStructureCheckedEntryPoint.FORCEDBYPARENT);
                 }
             }
             else if (nodeStructureCheckedEntryPoint == ENodeStructureCheckedEntryPoint.FORCEDBYCHILD)
             {
                 //Maybe check parent.
                 NodeStructure parentNodeStructure = NodeStructureManager.getParentNodeStructure(nodeStructure, nodeStructureList);
                 if (NodeStructureManager.allChildrenChecked(parentNodeStructure))
                     check(nodeStructureList, parentNodeStructure, ENodeStructureCheckedEntryPoint.FORCEDBYCHILD);
             }
             else if (nodeStructureCheckedEntryPoint == ENodeStructureCheckedEntryPoint.USER) {
                 //Do both of the above.
                 for (int i = 0; i < nodeStructure.children.Count; i++)
                 {
                     check(nodeStructureList, nodeStructure.children[i], ENodeStructureCheckedEntryPoint.FORCEDBYPARENT);
                 }
                 NodeStructure parentNodeStructure = NodeStructureManager.getParentNodeStructure(nodeStructure, nodeStructureList);
                 if (NodeStructureManager.allChildrenChecked(parentNodeStructure))
                     check(nodeStructureList, parentNodeStructure, ENodeStructureCheckedEntryPoint.FORCEDBYCHILD);
             }
         }
         else
         {
             //Just a child that was selected.
             if (nodeStructureCheckedEntryPoint == ENodeStructureCheckedEntryPoint.USER)
             {
                 NodeStructure parentNodeStructure = NodeStructureManager.getParentNodeStructure(nodeStructure, nodeStructureList);
                 if (NodeStructureManager.allChildrenChecked(parentNodeStructure))
                     check(nodeStructureList, parentNodeStructure, ENodeStructureCheckedEntryPoint.FORCEDBYCHILD);
             
             }
             else if (nodeStructureCheckedEntryPoint == ENodeStructureCheckedEntryPoint.FORCEDBYPARENT)
             {
                 //Do nothing...last level.
             }
         }
     }
     else if (nodeStructure.isParent)
     {
         nodeStructure.isChecked = true;
         //Just a parent - top level
         if (nodeStructureCheckedEntryPoint == ENodeStructureCheckedEntryPoint.FORCEDBYPARENT)
         {
             //Impossible.
         }
         else if (nodeStructureCheckedEntryPoint == ENodeStructureCheckedEntryPoint.FORCEDBYCHILD)
         {
             //Done - no more.
         }
         else if (nodeStructureCheckedEntryPoint == ENodeStructureCheckedEntryPoint.USER)
         {
             for (int i = 0; i < nodeStructure.children.Count; i++)
             {
                 check(nodeStructureList, nodeStructure.children[i], ENodeStructureCheckedEntryPoint.FORCEDBYPARENT);
             }
         }
     }
 }
 public static void updateRequests(NodeStructureList nodeStructureList, TreeView treeView, ENodeStructureCheckedEntryPoint nodeStructureCheckedEntryPoint, TreeNode treeNode, int occurance)
 {
     if (occurance == 1)
         saveExpandedState(nodeStructureList, treeView);
     NodeStructure nodeStructure = null, childNodeStructure = null, endNodeStructure = null;
     for (int i = 0; i < treeView.Nodes.Count; i++)
     {
         nodeStructure = (NodeStructure)(treeView.Nodes[i].Tag);
         if (differencesExist(nodeStructure, treeView.Nodes[i]) == (EDifferenceToMake)(0) || differencesExist(nodeStructure, treeView.Nodes[i]) == (EDifferenceToMake)(1))
             synchronize(differencesExist(nodeStructure, treeView.Nodes[i]), nodeStructure, nodeStructureList, treeView, nodeStructureCheckedEntryPoint, treeNode, occurance);
         if (nodeStructure.isParent)
         {
             for (int j = 0; j < treeView.Nodes[i].Nodes.Count; j++)
             {
                 childNodeStructure = (NodeStructure)(treeView.Nodes[i].Nodes[j].Tag);
                 if (differencesExist(childNodeStructure, treeView.Nodes[i].Nodes[j]) == (EDifferenceToMake)(0) || differencesExist(childNodeStructure, treeView.Nodes[i].Nodes[j]) == (EDifferenceToMake)(1))
                     synchronize(differencesExist(childNodeStructure, treeView.Nodes[i].Nodes[j]), childNodeStructure, nodeStructureList, treeView, nodeStructureCheckedEntryPoint, treeNode, occurance);
                 if (childNodeStructure.isParent)
                 {
                     for (int k = 0; k < treeView.Nodes[i].Nodes[j].Nodes.Count; k++)
                     {
                         endNodeStructure = (NodeStructure)(treeView.Nodes[i].Nodes[j].Nodes[k].Tag);
                         if (differencesExist(endNodeStructure, treeView.Nodes[i].Nodes[j].Nodes[k]) == (EDifferenceToMake)(0) || differencesExist(endNodeStructure, treeView.Nodes[i].Nodes[j].Nodes[k]) == (EDifferenceToMake)(1))
                             synchronize(differencesExist(endNodeStructure, treeView.Nodes[i].Nodes[j].Nodes[k]), endNodeStructure, nodeStructureList, treeView, nodeStructureCheckedEntryPoint, treeNode, occurance);
                     }
                 }
             }
         }
     }
 }
 public static void uncheck(NodeStructureList nodeStructureList, NodeStructure nodeStructure, ENodeStructureCheckedEntryPoint nodeStructureCheckedEntryPoint)
 {
     if (nodeStructure.isChild)
     {
         NodeStructure parent = NodeStructureManager.getParentNodeStructure(nodeStructure, nodeStructureList);
         NodeStructureListManager.removeNodeStructure(nodeStructure, parent.children);
         nodeStructure.isChecked = false;
         NodeStructureListManager.addNodeStructure(nodeStructure, parent.children);
         if (nodeStructure.isParent)
         {
             if (nodeStructureCheckedEntryPoint == ENodeStructureCheckedEntryPoint.FORCEDBYPARENT)
             {
                 for (int i = 0; i < nodeStructure.children.Count; i++)
                 {
                     uncheck(nodeStructureList, nodeStructure.children[i], ENodeStructureCheckedEntryPoint.FORCEDBYPARENT);
                 }
             }
             else if (nodeStructureCheckedEntryPoint == ENodeStructureCheckedEntryPoint.FORCEDBYCHILD)
             {
                 //Uncheck parent
                 NodeStructure parentNodeStructure = NodeStructureManager.getParentNodeStructure(nodeStructure, nodeStructureList);
                 uncheck(nodeStructureList, parentNodeStructure, ENodeStructureCheckedEntryPoint.FORCEDBYCHILD);
             }
             else if (nodeStructureCheckedEntryPoint == ENodeStructureCheckedEntryPoint.USER)
             {
                 //Do both of the above.
                 for (int i = 0; i < nodeStructure.children.Count; i++)
                 {
                     uncheck(nodeStructureList, nodeStructure.children[i], ENodeStructureCheckedEntryPoint.FORCEDBYPARENT);
                 }
                 NodeStructure parentNodeStructure = NodeStructureManager.getParentNodeStructure(nodeStructure, nodeStructureList);
                 uncheck(nodeStructureList, parentNodeStructure, ENodeStructureCheckedEntryPoint.FORCEDBYCHILD);
             }
         }
         else
         {
             //Just a child was selected
             if (nodeStructureCheckedEntryPoint == ENodeStructureCheckedEntryPoint.USER)
             {
                 //Uncheck parent
                 NodeStructure parentNodeStructure = NodeStructureManager.getParentNodeStructure(nodeStructure, nodeStructureList);
                 uncheck(nodeStructureList, parentNodeStructure, ENodeStructureCheckedEntryPoint.FORCEDBYCHILD);
             }
             else if (nodeStructureCheckedEntryPoint == ENodeStructureCheckedEntryPoint.FORCEDBYPARENT)
             {
                 //Do nothing...last level.
             }
         }
     }
     else if (nodeStructure.isParent)
     {
         nodeStructure.isChecked = false;
         //Just a parent 
         //top level.
         //FORCEDBYPARENT = IMPOSSIBLE
         //FORCEDBYCHILD = DONE
         if (nodeStructureCheckedEntryPoint == ENodeStructureCheckedEntryPoint.USER)
         {
             //Uncheck children and thus all below.
             for (int i = 0; i < nodeStructure.children.Count; i++)
             {
                 uncheck(nodeStructureList, nodeStructure.children[i], ENodeStructureCheckedEntryPoint.FORCEDBYPARENT);
             }
         }
     }
 }