internal void RefreshLists()
    {
      GetSelectedResourcesParts(true);
      _dockedVessels = null;

      // now lets reconcile the selected parts based on the new list of resources...
      WindowManifest.ReconcileSelectedXferParts(SMAddon.smController.SelectedResources);

      // Now lets update the Resource Xfer Objects...
      SMAddon.smController.ResourcesToXfer.Clear();
      if (!SMAddon.smController.SelectedResources.Contains("Crew") && !SMAddon.smController.SelectedResources.Contains("Science"))
      {
        foreach (string resource in SMAddon.smController.SelectedResources)
        {
          // Lets create a Xfer Object for managing xfer options and data.
          TransferResource modResource = new TransferResource(resource);
          modResource.srcXferAmount = TransferResource.CalcMaxResourceXferAmt(SMAddon.smController.SelectedPartsSource, SMAddon.smController.SelectedPartsTarget, resource);
          modResource.tgtXferAmount = TransferResource.CalcMaxResourceXferAmt(SMAddon.smController.SelectedPartsTarget, SMAddon.smController.SelectedPartsSource, resource);
          SMAddon.smController.ResourcesToXfer.Add(modResource);
        }
      }

      if (SMSettings.EnableCLS && SMAddon.CanShowShipManifest(false))
      {
        if (SMAddon.GetCLSAddon())
        {
          SMAddon.UpdateCLSSpaces();
          if (SMAddon.GetCLSVessel())
            GetHatches();
        }
      }

      SMAddon.FrozenKerbals = WindowRoster.GetFrozenKerbals();

      GetAntennas();
      GetLights();
      GetSolarPanels();
      WindowRoster.GetRosterList();
      DockedVessels = null;
    }
    private static void ResourceButtonToggled(string resourceName)
    {
      try
      {
        if (!SMAddon.smController.CrewTransfer.CrewXferActive && !TransferResource.ResourceXferActive)
        {
          // First, lets clear any highlighting...
          SMHighlighter.ClearResourceHighlighting(SMAddon.smController.SelectedResourcesParts);

          // Now let's update our lists...
          if (!SMAddon.smController.SelectedResources.Contains(resourceName))
          {
            // now lets determine what to do with selection
            if (resourceName == "Crew" || resourceName == "Science" || resourceName == "ElectricCharge")
            {
              SMAddon.smController.SelectedResources.Clear();
              SMAddon.smController.SelectedResources.Add(resourceName);
            }
            else
            {
              if (SMAddon.smController.SelectedResources.Contains("Crew") || SMAddon.smController.SelectedResources.Contains("Science") || SMAddon.smController.SelectedResources.Contains("ElectricCharge"))
              {
                SMAddon.smController.SelectedResources.Clear();
                SMAddon.smController.SelectedResources.Add(resourceName);
              }
              else if (SMAddon.smController.SelectedResources.Count > 1)
              {
                SMAddon.smController.SelectedResources.RemoveRange(0, 1);
                SMAddon.smController.SelectedResources.Add(resourceName);
              }
              else
                SMAddon.smController.SelectedResources.Add(resourceName);
            }
          }
          else if (SMAddon.smController.SelectedResources.Contains(resourceName))
          {
            SMAddon.smController.SelectedResources.Remove(resourceName);
          }

          // Now, refresh the resources parts list
          SMAddon.smController.GetSelectedResourcesParts();

          // now lets reconcile the selected parts based on the new list of resources...
          ReconcileSelectedXferParts(SMAddon.smController.SelectedResources);

          // Now lets update the Xfer Objects...
          SMAddon.smController.ResourcesToXfer.Clear();
          if (!SMAddon.smController.SelectedResources.Contains("Crew") && !SMAddon.smController.SelectedResources.Contains("Science"))
          {
            foreach (string resource in SMAddon.smController.SelectedResources)
            {
              // Lets create a Xfer Object for managing xfer options and data.
              TransferResource modResource = new TransferResource(resource);
              modResource.srcXferAmount = TransferResource.CalcMaxResourceXferAmt(SMAddon.smController.SelectedPartsSource, SMAddon.smController.SelectedPartsTarget, resource);
              modResource.tgtXferAmount = TransferResource.CalcMaxResourceXferAmt(SMAddon.smController.SelectedPartsTarget, SMAddon.smController.SelectedPartsSource, resource);
              SMAddon.smController.ResourcesToXfer.Add(modResource);
            }
          }

          // Now, based on the resourceselection, do we show the Transfer window?
          if (SMAddon.smController.SelectedResources.Count > 0)
            WindowTransfer.ShowWindow = true;
          else
            WindowTransfer.ShowWindow = false;
        }
      }
      catch (Exception ex)
      {
        Utilities.LogMessage(string.Format(" in WindowManifest.ResourceButtonToggled.  Error:  {0} \r\n\r\n{1}", ex.Message, ex.StackTrace), "Error", true);
      }
    }
        internal static void XferResource(List<Part> XferParts, TransferResource modResource, double XferAmount, SMAddon.XFERMode XferMode, bool drain)
        {
            // This adjusts the delta when we get to the end of the xfer.
            Utilities.LogMessage("XferResource:  " + modResource.ResourceName + " - 1. XferAmount = " + XferAmount.ToString() + ", Drain? " + drain.ToString(), "Info", SMSettings.VerboseLogging);

            // This var keeps track of what we actually moved..
            double XferBalance = XferAmount;
            double XferBalanceOld = XferBalance;
            int XferTimeout = 0;

            // Not all parts will have enough resource to meet the SrcPartAmt to move.   We need to account for that.
            // count up source parts with avalilabe resources. so we can devide by them
            while (XferBalance > 0.0000001d)
            {
                Utilities.LogMessage("XferResource:  " + modResource.ResourceName + " - 2. XferBalance = " + XferBalance.ToString() + ", Is Source: " + drain.ToString(), "Info", SMSettings.VerboseLogging);

                // Lets account for any empty/full containers
                int PartCount = 0;
                foreach (Part part in XferParts)
                    if ((drain && part.Resources[modResource.ResourceName].amount > 0d) ||
                        (!drain && part.Resources[modResource.ResourceName].amount < part.Resources[modResource.ResourceName].maxAmount))
                        PartCount += 1;

                // now split up the xfer amount evenly across the number of tanks that can send/receive resources
                double PartAmt = XferBalance / PartCount;

                // Calculate Xfer amounts for each part and move.
                foreach (Part part in XferParts)
                {
                    double AmtToMove = 0d;
                    if (drain)
                    {
                        AmtToMove = part.Resources[modResource.ResourceName].amount >= PartAmt ? PartAmt : part.Resources[modResource.ResourceName].amount;
                        part.Resources[modResource.ResourceName].amount -= AmtToMove;
                    }
                    else
                    {
                        double CapacityAvail = part.Resources[modResource.ResourceName].maxAmount - part.Resources[modResource.ResourceName].amount;
                        AmtToMove = CapacityAvail >= PartAmt ? PartAmt : CapacityAvail;
                        part.Resources[modResource.ResourceName].amount += AmtToMove;
                    }
                    Utilities.LogMessage("XferResource:  " + modResource.ResourceName + " - 3. AmtToMove = " + AmtToMove.ToString() + ", Drain: " + drain.ToString(), "Info", SMSettings.VerboseLogging);
                    // Report ramaining balance after Transfer.
                    XferBalance -= AmtToMove;
                }
                // account for rounding and double resolution issues
                if (XferBalance <= 0.0000001d)
                    break;
                else if (XferBalance != XferBalanceOld)
                {
                    XferBalanceOld = XferBalance;
                    XferTimeout = 0;
                }
                else if (XferBalance == XferBalanceOld)
                {
                    XferTimeout += 1;
                    if (XferTimeout >= 30)
                    {
                        Utilities.LogMessage("XferResource  Timeout!  Resource:  " + modResource.ResourceName + " - 3. XferBalance = " + XferBalance.ToString() + ", Drain: " + drain.ToString(), "Error", true);
                        break;
                    }
                }
            }
        }