public ExperimentSubjectList(KsmGuiBase parent, ExperimentInfo expInfo) : base(parent)
        {
            KnownSubjectsToggle = new KsmGuiToggle(this, "Show only known subjects", true, ToggleKnownSubjects, null, -1, 21);

            KsmGuiBase listHeader = new KsmGuiBase(this);

            listHeader.SetLayoutElement(true, false, -1, 16);
            listHeader.AddImageComponentWithColor(KsmGuiStyle.boxColor);

            KsmGuiText rndHeaderText = new KsmGuiText(listHeader, "RnD", "Science points\nretrieved in RnD", TextAlignmentOptions.Left);

            rndHeaderText.TextComponent.color     = Lib.KolorToColor(Lib.Kolor.Science);
            rndHeaderText.TextComponent.fontStyle = FontStyles.Bold;
            rndHeaderText.TopTransform.SetAnchorsAndPosition(TextAnchor.MiddleLeft, TextAnchor.MiddleLeft, 10, 0);
            rndHeaderText.TopTransform.SetSizeDelta(50, 16);

            KsmGuiText flightHeaderText = new KsmGuiText(listHeader, "Flight", "Science points\ncollected in all vessels", TextAlignmentOptions.Left);

            flightHeaderText.TextComponent.color     = Lib.KolorToColor(Lib.Kolor.Science);
            flightHeaderText.TextComponent.fontStyle = FontStyles.Bold;
            flightHeaderText.TopTransform.SetAnchorsAndPosition(TextAnchor.MiddleLeft, TextAnchor.MiddleLeft, 60, 0);
            flightHeaderText.TopTransform.SetSizeDelta(50, 16);

            KsmGuiText valueHeaderText = new KsmGuiText(listHeader, "Value", "Remaining science value\naccounting for data retrieved in RnD\nand collected in flight", TextAlignmentOptions.Left);

            valueHeaderText.TextComponent.color     = Lib.KolorToColor(Lib.Kolor.Science);
            valueHeaderText.TextComponent.fontStyle = FontStyles.Bold;
            valueHeaderText.TopTransform.SetAnchorsAndPosition(TextAnchor.MiddleLeft, TextAnchor.MiddleLeft, 110, 0);
            valueHeaderText.TopTransform.SetSizeDelta(50, 16);

            KsmGuiText completedHeaderText = new KsmGuiText(listHeader, "Completed", "How many times the subject\nhas been retrieved in RnD", TextAlignmentOptions.Left);

            completedHeaderText.TextComponent.color     = Lib.KolorToColor(Lib.Kolor.Yellow);
            completedHeaderText.TextComponent.fontStyle = FontStyles.Bold;
            completedHeaderText.TopTransform.SetAnchorsAndPosition(TextAnchor.MiddleLeft, TextAnchor.MiddleLeft, 160, 0);
            completedHeaderText.TopTransform.SetSizeDelta(100, 16);

            KsmGuiVerticalScrollView scrollView = new KsmGuiVerticalScrollView(this);

            scrollView.SetLayoutElement(true, true, 320, -1, -1, 250);
            scrollView.ContentGroup.padding = new RectOffset(0, 5, 5, 5);

            BodiesSituationsBiomesSubject subjects = GetSubjectsForExperiment(expInfo);

            if (subjects != null)
            {
                foreach (ObjectPair <int, SituationsBiomesSubject> bodySubjects in GetSubjectsForExperiment(expInfo))
                {
                    CelestialBody body      = FlightGlobals.Bodies[bodySubjects.Key];
                    BodyContainer bodyEntry = new BodyContainer(scrollView, body, bodySubjects.Value);
                    BodyContainers.Add(bodyEntry);
                }
            }

            SetUpdateCoroutine(new KsmGuiUpdateCoroutine(Update));
            ForceExecuteCoroutine();
            ToggleKnownSubjects(true);
        }
        private void Init()
        {
            Lib.Log("Science Archive init started");

            window = new KsmGuiWindow(
                KsmGuiWindow.LayoutGroupType.Vertical,
                false,
                1f,
                true,
                0,
                TextAnchor.UpperLeft,
                5f,
                TextAnchor.UpperLeft,
                TextAnchor.UpperLeft,
                280, -100);

            KsmGuiHeader mainHeader = new KsmGuiHeader(window, Local.SCIENCEARCHIVE_title);            //"SCIENCE ARCHIVE"

            new KsmGuiIconButton(mainHeader, Textures.KsmGuiTexHeaderClose, () => Close());

            KsmGuiHorizontalLayout columns = new KsmGuiHorizontalLayout(window, 5, 0, 0, 5, 0);

            KsmGuiVerticalLayout experimentColumn = new KsmGuiVerticalLayout(columns, 5);

            experimentColumn.SetLayoutElement(false, true, 160);
            new KsmGuiHeader(experimentColumn, Local.SCIENCEARCHIVE_EXPERIMENTS);                                              //"EXPERIMENTS"

            researchFilter = new KsmGuiToggle(experimentColumn, Local.SCIENCEARCHIVE_filter1, true, OnToggleResearchedFilter); //"filter by researched"
            if (Kerbalism.SerenityEnabled)
            {
                ROCFilter = new KsmGuiToggle(experimentColumn, Local.SCIENCEARCHIVE_filter2, true, OnToggleROCFilter);               //"filter ROCs"
            }
            vesselFilter = new KsmGuiToggle(experimentColumn, Local.SCIENCEARCHIVE_filter3, false, OnToggleVesselFilter);            //"filter by current vessel"

            KsmGuiVerticalScrollView experimentsScrollView = new KsmGuiVerticalScrollView(experimentColumn, 0, 0, 0, 0, 0);

            experimentsScrollView.SetLayoutElement(true, true, 160);
            experimentsToggleList = new KsmGuiToggleList <ExpInfoAndSubjects>(experimentsScrollView, OnToggleExperiment);

            foreach (ExperimentInfo expInfo in ScienceDB.ExperimentInfos.OrderBy(p => p.Title))
            {
                ExperimentSubjectList experimentSubjectList = new ExperimentSubjectList(columns, expInfo);
                experimentSubjectList.Enabled = false;
                ExpInfoAndSubjects expInfoPlus = new ExpInfoAndSubjects(expInfo, experimentSubjectList);
                new KsmGuiToggleListElement <ExpInfoAndSubjects>(experimentsToggleList, expInfoPlus, expInfo.Title);
            }

            Toggle.ToggleEvent temp = experimentsToggleList.ChildToggles[0].ToggleComponent.onValueChanged;
            experimentsToggleList.ChildToggles[0].ToggleComponent.onValueChanged = new Toggle.ToggleEvent();
            experimentsToggleList.ChildToggles[0].ToggleComponent.isOn           = true;
            experimentsToggleList.ChildToggles[0].ToggleComponent.onValueChanged = temp;

            currentExperiment = experimentsToggleList.ChildToggles[0].ToggleId;
            currentExperiment.experimentSubjectList.Enabled = true;

            KsmGuiVerticalLayout expInfoColumn = new KsmGuiVerticalLayout(columns, 5);

            new KsmGuiHeader(expInfoColumn, Local.SCIENCEARCHIVE_EXPERIMENTINFO);            //"EXPERIMENT INFO"
            KsmGuiVerticalScrollView expInfoScrollView = new KsmGuiVerticalScrollView(expInfoColumn);

            expInfoScrollView.SetLayoutElement(false, true, 200);
            expInfoText = new KsmGuiText(expInfoScrollView, currentExperiment.expInfo.ModuleInfo);
            expInfoText.SetLayoutElement(true, true);

            foreach (ExperimentInfo experimentInfo in ScienceDB.ExperimentInfos)
            {
                if (experimentInfo.IsROC)
                {
                    ROCExpInfos.Add(experimentInfo);
                }
            }

            window.SetUpdateAction(Update, 20);

            Callbacks.onConfigure.Add(OnConfigure);

            //window.RebuildLayout();
            window.Close();
            Lib.Log("Science Archive init done");
        }