private void SymmetryMode_Clicked(UIActionGroupManager obj)
        {
            if (!obj.Current.Action.IsInActionGroup(obj.ActionGroup))
            {
                obj.Current.Action.AddActionToAnActionGroup(obj.ActionGroup);
            }
            else
            {
                obj.Current.Action.RemoveActionToAnActionGroup(obj.ActionGroup);
            }

            if (obj.SymmetryMode == UIActionGroupManager.SymmetryType.All)
            {
                foreach (BaseAction ba in BaseActionFilter.FromParts(obj.Current.Action.listParent.part.symmetryCounterparts))
                {
                    if (ba.name == obj.Current.Action.name)
                    {
                        if (!ba.IsInActionGroup(obj.ActionGroup))
                        {
                            ba.AddActionToAnActionGroup(obj.ActionGroup);
                        }
                        else
                        {
                            ba.RemoveActionToAnActionGroup(obj.ActionGroup);
                        }
                    }
                }
            }

            actionGroupList.Find(
                (e) =>
            {
                return(!e.IsSymmetrySelector && !e.Isfolder && e.Events[UIActionGroupManager.EVENTNAME].active);
            }).UpdateName();
        }
        private void Folder_Clicked(UIActionGroupManager obj)
        {
            if (IsActionGroupsVisible)
            {
                foreach (UIActionGroupManager item in actionGroupList)
                {
                    item.Events[UIActionGroupManager.EVENTNAME].guiActive = item.Isfolder;
                    item.Events[UIActionGroupManager.EVENTNAME].active    = item.Isfolder;
                }

                IsActionGroupsVisible = false;
                IsSymmetryModeVisible = false;

                currentFolder      = null;
                currentActionGroup = null;
            }
            else
            {
                int index, max;
                if (obj.Type == UIActionGroupManager.FolderType.General)
                {
                    index = 2;
                    max   = 9;
                }
                else
                {
                    index = 9;
                    max   = 19;
                }

                currentFolder = obj;

                actionGroupList[(obj.Type == UIActionGroupManager.FolderType.General) ? 1 : 0].Events[UIActionGroupManager.EVENTNAME].guiActive = false;
                actionGroupList[(obj.Type == UIActionGroupManager.FolderType.General) ? 1 : 0].Events[UIActionGroupManager.EVENTNAME].active    = false;

                for (; index < max; index++)
                {
                    actionGroupList[index].Events[UIActionGroupManager.EVENTNAME].guiActive = true;
                    actionGroupList[index].Events[UIActionGroupManager.EVENTNAME].active    = true;

                    actionGroupList[index].UpdateName();
                }

                IsActionGroupsVisible = true;
            }
        }
        private void ActionGroup_Clicked(UIActionGroupManager obj)
        {
            if (obj.Current.Action.listParent.part.symmetryCounterparts.Count > 0)
            {
                if (!IsSymmetryModeVisible)
                {
                    currentActionGroup = obj;

                    actionGroupList.ForEach(
                        (e) =>
                    {
                        // Hide all action groups
                        if (!e.Isfolder && !e.IsSymmetrySelector && e != obj)
                        {
                            e.Events[UIActionGroupManager.EVENTNAME].guiActive = false;
                            e.Events[UIActionGroupManager.EVENTNAME].active    = false;
                        }

                        // Show Symmetry selector
                        if (e.IsSymmetrySelector)
                        {
                            e.Events[UIActionGroupManager.EVENTNAME].guiActive = true;
                            e.Events[UIActionGroupManager.EVENTNAME].active    = true;

                            e.ActionGroup = obj.ActionGroup;
                        }
                    });

                    IsSymmetryModeVisible = true;
                }
                else
                {
                    actionGroupList.ForEach(
                        (e) =>
                    {
                        if (!e.Isfolder && !e.IsSymmetrySelector)
                        {
                            if (currentFolder.Type == UIActionGroupManager.FolderType.General)
                            {
                                e.Events[UIActionGroupManager.EVENTNAME].guiActive = !e.ActionGroup.ToString().Contains("Custom");
                                e.Events[UIActionGroupManager.EVENTNAME].active    = !e.ActionGroup.ToString().Contains("Custom");
                            }
                            else
                            {
                                e.Events[UIActionGroupManager.EVENTNAME].guiActive = e.ActionGroup.ToString().Contains("Custom");
                                e.Events[UIActionGroupManager.EVENTNAME].active    = e.ActionGroup.ToString().Contains("Custom");
                            }
                        }


                        if (e.IsSymmetrySelector)
                        {
                            e.Events[UIActionGroupManager.EVENTNAME].guiActive = false;
                            e.Events[UIActionGroupManager.EVENTNAME].active    = false;

                            e.ActionGroup = KSPActionGroup.None;
                        }
                    });

                    IsSymmetryModeVisible = false;
                    currentActionGroup    = null;
                }
            }
            else
            {
                if (!obj.Current.Action.IsInActionGroup(obj.ActionGroup))
                {
                    obj.Current.Action.AddActionToAnActionGroup(obj.ActionGroup);
                }
                else
                {
                    obj.Current.Action.RemoveActionToAnActionGroup(obj.ActionGroup);
                }

                obj.UpdateName();
            }
        }
        public UIPartManager(Part p)
        {
            this.Part             = p;
            IsActive              = false;
            IsFolderVisible       = false;
            IsActionGroupsVisible = false;
            IsSymmetryModeVisible = false;

            baseActionList  = new List <UIBaseActionManager>();
            actionGroupList = new List <UIActionGroupManager>();

            if (Part.Modules.Contains("UIBaseActionManager") || Part.Modules.Contains("UIActionGroupManager"))
            {
                //if the part already contains actionManager class, we clean them.

                List <PartModule> toRemove = new List <PartModule>();
                foreach (PartModule item in Part.Modules)
                {
                    if (item is UIBaseActionManager || item is UIActionGroupManager)
                    {
                        toRemove.Add(item);
                    }
                }

                foreach (PartModule mod in toRemove)
                {
                    Part.Modules.Remove(mod);
                }
            }


            //We create our base action list
            foreach (BaseAction ba in BaseActionFilter.FromParts(p))
            {
                //We create the module through AddModule to get the initialization done
                UIBaseActionManager man = Part.AddModule("UIBaseActionManager") as UIBaseActionManager;
                // and we remove it to avoid bloating an eventual save.
                Part.Modules.Remove(man);

                man.Action   = ba;
                man.Origin   = this;
                man.Clicked += BaseAction_Clicked;

                man.Initialize();

                baseActionList.Add(man);
            }

            // and our action group list
            //First two specific uiactionmanager as folder.
            UIActionGroupManager agm = Part.AddModule("UIActionGroupManager") as UIActionGroupManager;

            Part.Modules.Remove(agm);

            agm.Events[UIActionGroupManager.EVENTNAME].guiName = "    AGM : General";
            agm.Origin   = this;
            agm.Isfolder = true;
            agm.Type     = UIActionGroupManager.FolderType.General;
            agm.Clicked += Folder_Clicked;

            actionGroupList.Add(agm);

            agm = Part.AddModule("UIActionGroupManager") as UIActionGroupManager;
            Part.Modules.Remove(agm);

            agm.Events[UIActionGroupManager.EVENTNAME].guiName = "    AGM : Custom";
            agm.Origin   = this;
            agm.Isfolder = true;
            agm.Type     = UIActionGroupManager.FolderType.Custom;
            agm.Clicked += Folder_Clicked;

            actionGroupList.Add(agm);

            //and the rest of action groups
            foreach (KSPActionGroup ag in Enum.GetValues(typeof(KSPActionGroup)))
            {
                if (ag == KSPActionGroup.None)
                {
                    continue;
                }

                agm = Part.AddModule("UIActionGroupManager") as UIActionGroupManager;
                Part.Modules.Remove(agm);

                agm.Origin      = this;
                agm.ActionGroup = ag;
                agm.Clicked    += ActionGroup_Clicked;
                agm.Initialize();

                actionGroupList.Add(agm);
            }

            agm = Part.AddModule("UIActionGroupManager") as UIActionGroupManager;
            Part.Modules.Remove(agm);

            agm.Events[UIActionGroupManager.EVENTNAME].guiName = "        Only this part";
            agm.Origin             = this;
            agm.IsSymmetrySelector = true;
            agm.SymmetryMode       = UIActionGroupManager.SymmetryType.One;
            agm.Clicked           += SymmetryMode_Clicked;

            actionGroupList.Add(agm);

            agm = Part.AddModule("UIActionGroupManager") as UIActionGroupManager;
            Part.Modules.Remove(agm);

            agm.Events[UIActionGroupManager.EVENTNAME].guiName = "        This part and all symmetry counterparts";
            agm.Origin             = this;
            agm.IsSymmetrySelector = true;
            agm.SymmetryMode       = UIActionGroupManager.SymmetryType.All;
            agm.Clicked           += SymmetryMode_Clicked;

            actionGroupList.Add(agm);
        }
        private void SymmetryMode_Clicked(UIActionGroupManager obj)
        {
            if (!obj.Current.Action.IsInActionGroup(obj.ActionGroup))
                obj.Current.Action.AddActionToAnActionGroup(obj.ActionGroup);
            else
                obj.Current.Action.RemoveActionToAnActionGroup(obj.ActionGroup);

            if (obj.SymmetryMode == UIActionGroupManager.SymmetryType.All)
            {
                foreach (BaseAction ba in BaseActionFilter.FromParts(obj.Current.Action.listParent.part.symmetryCounterparts))
                {
                    if (ba.name == obj.Current.Action.name)
                    {
                        if (!ba.IsInActionGroup(obj.ActionGroup))
                            ba.AddActionToAnActionGroup(obj.ActionGroup);
                        else
                            ba.RemoveActionToAnActionGroup(obj.ActionGroup);

                    }
                }
            }

            actionGroupList.Find(
                (e) =>
                {
                    return !e.IsSymmetrySelector && !e.Isfolder && e.Events[UIActionGroupManager.EVENTNAME].active;
                }).UpdateName();
        }
        private void Folder_Clicked(UIActionGroupManager obj)
        {
            if (IsActionGroupsVisible)
            {
                foreach (UIActionGroupManager item in actionGroupList)
                {
                    item.Events[UIActionGroupManager.EVENTNAME].guiActive = item.Isfolder;
                    item.Events[UIActionGroupManager.EVENTNAME].active = item.Isfolder;
                }

                IsActionGroupsVisible = false;
                IsSymmetryModeVisible = false;

                currentFolder = null;
                currentActionGroup = null;
            }
            else
            {
                int index, max;
                if (obj.Type == UIActionGroupManager.FolderType.General)
                {
                    index = 2;
                    max = 9;
                }
                else
                {
                    index = 9;
                    max = 19;
                }

                currentFolder = obj;

                actionGroupList[(obj.Type == UIActionGroupManager.FolderType.General) ? 1 : 0].Events[UIActionGroupManager.EVENTNAME].guiActive = false;
                actionGroupList[(obj.Type == UIActionGroupManager.FolderType.General) ? 1 : 0].Events[UIActionGroupManager.EVENTNAME].active = false;

                for (; index < max; index++)
                {
                    actionGroupList[index].Events[UIActionGroupManager.EVENTNAME].guiActive = true;
                    actionGroupList[index].Events[UIActionGroupManager.EVENTNAME].active = true;

                    actionGroupList[index].UpdateName();
                }

                IsActionGroupsVisible = true;
            }
        }
        private void ActionGroup_Clicked(UIActionGroupManager obj)
        {
            if (obj.Current.Action.listParent.part.symmetryCounterparts.Count > 0)
            {
                if (!IsSymmetryModeVisible)
                {
                    currentActionGroup = obj;

                    actionGroupList.ForEach(
                        (e) =>
                        {
                            // Hide all action groups
                            if (!e.Isfolder && !e.IsSymmetrySelector && e != obj)
                            {
                                e.Events[UIActionGroupManager.EVENTNAME].guiActive = false;
                                e.Events[UIActionGroupManager.EVENTNAME].active = false;
                            }

                            // Show Symmetry selector
                            if (e.IsSymmetrySelector)
                            {
                                e.Events[UIActionGroupManager.EVENTNAME].guiActive = true;
                                e.Events[UIActionGroupManager.EVENTNAME].active = true;

                                e.ActionGroup = obj.ActionGroup;
                            }
                        });

                    IsSymmetryModeVisible = true;
                }
                else
                {

                    actionGroupList.ForEach(
                        (e) =>
                        {
                            if (!e.Isfolder && !e.IsSymmetrySelector)
                            {
                                if (currentFolder.Type == UIActionGroupManager.FolderType.General)
                                {
                                    e.Events[UIActionGroupManager.EVENTNAME].guiActive = !e.ActionGroup.ToString().Contains("Custom");
                                    e.Events[UIActionGroupManager.EVENTNAME].active = !e.ActionGroup.ToString().Contains("Custom");
                                }
                                else
                                {
                                    e.Events[UIActionGroupManager.EVENTNAME].guiActive = e.ActionGroup.ToString().Contains("Custom");
                                    e.Events[UIActionGroupManager.EVENTNAME].active = e.ActionGroup.ToString().Contains("Custom");
                                }
                            }

                            if (e.IsSymmetrySelector)
                            {
                                e.Events[UIActionGroupManager.EVENTNAME].guiActive = false;
                                e.Events[UIActionGroupManager.EVENTNAME].active = false;

                                e.ActionGroup = KSPActionGroup.None;
                            }
                        });

                    IsSymmetryModeVisible = false;
                    currentActionGroup = null;
                }
            }
            else
            {
                if (!obj.Current.Action.IsInActionGroup(obj.ActionGroup))
                    obj.Current.Action.AddActionToAnActionGroup(obj.ActionGroup);
                else
                    obj.Current.Action.RemoveActionToAnActionGroup(obj.ActionGroup);

                obj.UpdateName();
            }
        }