private void FixListItem(KSP.UI.UIListItem item)
        {
            float width = 166 * resizeFactor - (166 - 163);

            // Resize the item
            Text t = item.GetComponentsInChildren <Text>(true).FirstOrDefault();

            if (t)
            {
                t.rectTransform.sizeDelta = new Vector2(width, t.rectTransform.sizeDelta.y);
            }
        }
        public void OnPreCull()
        {
            // Try to find the app frame for the contracts window.  Note that we may pick up
            // the ones from the Engineer's report in the VAB/SPH instead, so check by name.
            if (!contractsFrame)
            {
                // Check if this scene even has a contracts app
                IEnumerable <GenericAppFrame> frames = Resources.FindObjectsOfTypeAll <GenericAppFrame>();
                if (!frames.Any())
                {
                    Destroy(this);
                    return;
                }

                foreach (GenericAppFrame appFrame in frames)
                {
                    if (appFrame.header.text == "Contracts")
                    {
                        contractsFrame = appFrame;
                        break;
                    }
                }
            }

            if (contractsFrame)
            {
                LoggingUtil.LogInfo(this, "Making adjustments to contract frame...");

                // Set the new width and height (old value * factor)
                int width  = (int)(166 * resizeFactor);
                int height = (int)(176 * 2.5);
                widthField.SetValue(contractsFrame, width);

                // Apply the changes
                RectTransform rectTransform = (RectTransform)transformField.GetValue(contractsFrame);
                rectTransform.sizeDelta = new Vector2((float)width, (float)height);

                // Remove the limit on max height (technically should be a little less than screen height, but close enough)
                contractsFrame.maxHeight = Screen.height;

                // Apply the changes
                contractsFrame.Reposition();

                if (ContractsApp.Instance != null)
                {
                    // Find the cascading list field
                    foreach (FieldInfo cascadingListField in cascadingListFields)
                    {
                        GenericCascadingList ccl = (GenericCascadingList)cascadingListField.GetValue(ContractsApp.Instance);
                        if (ccl != null)
                        {
                            // Set the body width (I think this is used for word wrap logic)
                            ccl.bodyTextStartWidth = (int)(166 * resizeFactor - (166 - 151));

                            // Fix the prefab for the header - will apply to any newly added contracts
                            FixListItem(ccl.cascadeHeader);

                            // Fix the prefab for the body - used for contract notes
                            FixListItem(ccl.cascadeBody);
                        }
                    }

                    // Fix the prefab used for contract parameters
                    KSP.UI.UIListItem uiListPrefab = (KSP.UI.UIListItem)uiListPrefabField.GetValue(ContractsApp.Instance);
                    Text text = uiListPrefab.GetComponentsInChildren <Text>(true).FirstOrDefault();
                    if (text)
                    {
                        text.rectTransform.sizeDelta = new Vector2(166 * resizeFactor - (166 - 163), 14.0f);
                    }

                    // Refresh the contract list, forces everything to get recreated
                    refreshMethod.Invoke(ContractsApp.Instance, new object[] { });

                    // No need to hang around, the changes will stick for the lifetime of the app
                    Destroy(this);
                }
            }
        }