protected ConsumableInfoTableColumn AddConsumableInfoColumn(string id, IConsumableUIItem consumable_info, Action <IAssignableIdentity, GameObject> load_value_action, Func <IAssignableIdentity, GameObject, ResultValues> get_value_action, Action <GameObject> on_press_action, Action <GameObject, ResultValues> set_value_action, Comparison <IAssignableIdentity> sort_comparison, Action <IAssignableIdentity, GameObject, ToolTip> on_tooltip, Action <IAssignableIdentity, GameObject, ToolTip> on_sort_tooltip)
    {
        ConsumableInfoTableColumn consumableInfoTableColumn = new ConsumableInfoTableColumn(consumable_info, load_value_action, get_value_action, on_press_action, set_value_action, sort_comparison, on_tooltip, on_sort_tooltip, (GameObject widget_go) => string.Empty);

        consumableInfoTableColumn.scrollerID = "consumableScroller";
        if (RegisterColumn(id, consumableInfoTableColumn))
        {
            return(consumableInfoTableColumn);
        }
        return(null);
    }
    private ResultValues get_value_consumable_info(IAssignableIdentity minion, GameObject widget_go)
    {
        ConsumableInfoTableColumn consumableInfoTableColumn = GetWidgetColumn(widget_go) as ConsumableInfoTableColumn;
        IConsumableUIItem         consumable_info           = consumableInfoTableColumn.consumable_info;
        TableRow     widgetRow = GetWidgetRow(widget_go);
        ResultValues result    = ResultValues.Partial;

        switch (widgetRow.rowType)
        {
        case TableRow.RowType.Header:
        {
            bool flag  = true;
            bool flag2 = true;
            bool flag3 = false;
            bool flag4 = false;
            foreach (KeyValuePair <TableRow, GameObject> item in consumableInfoTableColumn.widgets_by_row)
            {
                GameObject value = item.Value;
                if (!((UnityEngine.Object)value == (UnityEngine.Object)widget_go) && !((UnityEngine.Object)value == (UnityEngine.Object)null))
                {
                    switch (consumableInfoTableColumn.get_value_action(item.Key.GetIdentity(), value))
                    {
                    case ResultValues.False:
                        flag2 = false;
                        if (!flag)
                        {
                            flag4 = true;
                        }
                        break;

                    case ResultValues.Partial:
                        flag3 = true;
                        flag4 = true;
                        break;

                    case ResultValues.True:
                        flag = false;
                        if (!flag2)
                        {
                            flag4 = true;
                        }
                        break;
                    }
                    if (flag4)
                    {
                        break;
                    }
                }
            }
            result = (flag3 ? ResultValues.Partial : (flag2 ? ResultValues.True : ((!flag) ? ResultValues.Partial : ResultValues.False)));
            break;
        }

        case TableRow.RowType.Default:
            result = ((!ConsumerManager.instance.DefaultForbiddenTagsList.Contains(consumable_info.ConsumableId.ToTag())) ? ResultValues.True : ResultValues.False);
            break;

        case TableRow.RowType.Minion:
            if ((UnityEngine.Object)(minion as MinionIdentity) != (UnityEngine.Object)null)
            {
                ConsumableConsumer component = ((MinionIdentity)minion).GetComponent <ConsumableConsumer>();
                result = (component.IsPermitted(consumable_info.ConsumableId) ? ResultValues.True : ResultValues.False);
            }
            else
            {
                result = ResultValues.True;
            }
            break;

        case TableRow.RowType.StoredMinon:
            result = ((!((UnityEngine.Object)(minion as StoredMinionIdentity) != (UnityEngine.Object)null)) ? ResultValues.True : (((StoredMinionIdentity)minion).IsPermittedToConsume(consumable_info.ConsumableId) ? ResultValues.True : ResultValues.False));
            break;
        }
        return(result);
    }
    private void on_tooltip_consumable_info(IAssignableIdentity minion, GameObject widget_go, ToolTip tooltip)
    {
        tooltip.ClearMultiStringTooltip();
        ConsumableInfoTableColumn consumableInfoTableColumn = GetWidgetColumn(widget_go) as ConsumableInfoTableColumn;
        TableRow widgetRow = GetWidgetRow(widget_go);

        EdiblesManager.FoodInfo foodInfo = consumableInfoTableColumn.consumable_info as EdiblesManager.FoodInfo;
        int num = 0;

        if (foodInfo != null)
        {
            int            num2           = foodInfo.Quality;
            MinionIdentity minionIdentity = minion as MinionIdentity;
            if ((UnityEngine.Object)minionIdentity != (UnityEngine.Object)null)
            {
                AttributeInstance attributeInstance = minionIdentity.GetAttributes().Get(Db.Get().Attributes.FoodExpectation);
                num2 += Mathf.RoundToInt(attributeInstance.GetTotalValue());
            }
            string effectForFoodQuality = Edible.GetEffectForFoodQuality(num2);
            Effect effect = Db.Get().effects.Get(effectForFoodQuality);
            foreach (AttributeModifier selfModifier in effect.SelfModifiers)
            {
                if (selfModifier.AttributeId == Db.Get().Attributes.QualityOfLife.Id)
                {
                    num += Mathf.RoundToInt(selfModifier.Value);
                }
            }
        }
        switch (widgetRow.rowType)
        {
        case TableRow.RowType.Header:
            tooltip.AddMultiStringTooltip(consumableInfoTableColumn.consumable_info.ConsumableName, null);
            if (foodInfo != null)
            {
                tooltip.AddMultiStringTooltip(string.Format(UI.CONSUMABLESSCREEN.FOOD_AVAILABLE, GameUtil.GetFormattedCalories(WorldInventory.Instance.GetAmount(consumableInfoTableColumn.consumable_info.ConsumableId.ToTag()) * foodInfo.CaloriesPerUnit, GameUtil.TimeSlice.None, true)), null);
                tooltip.AddMultiStringTooltip(string.Format(UI.CONSUMABLESSCREEN.FOOD_QUALITY, GameUtil.AddPositiveSign(num.ToString(), num > 0)), null);
                tooltip.AddMultiStringTooltip("\n" + foodInfo.Description, null);
            }
            else
            {
                tooltip.AddMultiStringTooltip(string.Format(UI.CONSUMABLESSCREEN.FOOD_AVAILABLE, GameUtil.GetFormattedUnits(WorldInventory.Instance.GetAmount(consumableInfoTableColumn.consumable_info.ConsumableId.ToTag()), GameUtil.TimeSlice.None, true)), null);
            }
            break;

        case TableRow.RowType.Default:
            if (consumableInfoTableColumn.get_value_action(minion, widget_go) == ResultValues.True)
            {
                tooltip.AddMultiStringTooltip(string.Format(UI.CONSUMABLESSCREEN.NEW_MINIONS_FOOD_PERMISSION_ON, consumableInfoTableColumn.consumable_info.ConsumableName), null);
            }
            else
            {
                tooltip.AddMultiStringTooltip(string.Format(UI.CONSUMABLESSCREEN.NEW_MINIONS_FOOD_PERMISSION_OFF, consumableInfoTableColumn.consumable_info.ConsumableName), null);
            }
            break;

        case TableRow.RowType.Minion:
        case TableRow.RowType.StoredMinon:
            if (minion != null)
            {
                if (consumableInfoTableColumn.get_value_action(minion, widget_go) == ResultValues.True)
                {
                    tooltip.AddMultiStringTooltip(string.Format(UI.CONSUMABLESSCREEN.FOOD_PERMISSION_ON, minion.GetProperName(), consumableInfoTableColumn.consumable_info.ConsumableName), null);
                }
                else
                {
                    tooltip.AddMultiStringTooltip(string.Format(UI.CONSUMABLESSCREEN.FOOD_PERMISSION_OFF, minion.GetProperName(), consumableInfoTableColumn.consumable_info.ConsumableName), null);
                }
                if (foodInfo != null && (UnityEngine.Object)(minion as MinionIdentity) != (UnityEngine.Object)null)
                {
                    tooltip.AddMultiStringTooltip(string.Format(UI.CONSUMABLESSCREEN.FOOD_QUALITY_VS_EXPECTATION, GameUtil.AddPositiveSign(num.ToString(), num > 0), minion.GetProperName()), null);
                }
                else if ((UnityEngine.Object)(minion as StoredMinionIdentity) != (UnityEngine.Object)null)
                {
                    tooltip.AddMultiStringTooltip(string.Format(UI.CONSUMABLESSCREEN.CANNOT_ADJUST_PERMISSIONS, (minion as StoredMinionIdentity).GetStorageReason()), null);
                }
            }
            break;
        }
    }
    private void on_click_consumable_info(GameObject widget_go)
    {
        ConsumableConsumer        consumableConsumer        = null;
        IConsumableUIItem         consumableUIItem          = null;
        TableRow                  widgetRow                 = GetWidgetRow(widget_go);
        IAssignableIdentity       identity                  = widgetRow.GetIdentity();
        ConsumableInfoTableColumn consumableInfoTableColumn = GetWidgetColumn(widget_go) as ConsumableInfoTableColumn;

        switch (widgetRow.rowType)
        {
        case TableRow.RowType.Header:
            switch (get_value_consumable_info(null, widget_go))
            {
            case ResultValues.True:
                consumableInfoTableColumn.on_set_action(widget_go, ResultValues.False);
                break;

            case ResultValues.False:
            case ResultValues.Partial:
            case ResultValues.ConditionalGroup:
                consumableInfoTableColumn.on_set_action(widget_go, ResultValues.True);
                break;
            }
            consumableInfoTableColumn.on_load_action(null, widget_go);
            break;

        case TableRow.RowType.Default:
        {
            consumableUIItem = consumableInfoTableColumn.consumable_info;
            bool flag3 = !ConsumerManager.instance.DefaultForbiddenTagsList.Contains(consumableUIItem.ConsumableId.ToTag());
            consumableInfoTableColumn.on_set_action(widget_go, (!flag3) ? ResultValues.True : ResultValues.False);
            break;
        }

        case TableRow.RowType.Minion:
        {
            MinionIdentity minionIdentity = identity as MinionIdentity;
            if ((UnityEngine.Object)minionIdentity != (UnityEngine.Object)null)
            {
                consumableUIItem   = consumableInfoTableColumn.consumable_info;
                consumableConsumer = minionIdentity.GetComponent <ConsumableConsumer>();
                if ((UnityEngine.Object)consumableConsumer == (UnityEngine.Object)null)
                {
                    Debug.LogError("Could not find minion identity / row associated with the widget");
                }
                else
                {
                    bool flag2 = consumableConsumer.IsPermitted(consumableUIItem.ConsumableId);
                    consumableInfoTableColumn.on_set_action(widget_go, (!flag2) ? ResultValues.True : ResultValues.False);
                }
            }
            break;
        }

        case TableRow.RowType.StoredMinon:
        {
            StoredMinionIdentity storedMinionIdentity = identity as StoredMinionIdentity;
            if ((UnityEngine.Object)storedMinionIdentity != (UnityEngine.Object)null)
            {
                consumableUIItem = consumableInfoTableColumn.consumable_info;
                bool flag = storedMinionIdentity.IsPermittedToConsume(consumableUIItem.ConsumableId);
                consumableInfoTableColumn.on_set_action(widget_go, (!flag) ? ResultValues.True : ResultValues.False);
            }
            break;
        }
        }
    }
    private void set_value_consumable_info(GameObject widget_go, ResultValues new_value)
    {
        ConsumableConsumer consumableConsumer = null;
        IConsumableUIItem  consumableUIItem   = null;
        TableRow           widgetRow          = GetWidgetRow(widget_go);

        if ((UnityEngine.Object)widgetRow == (UnityEngine.Object)null)
        {
            Debug.LogWarning("Row is null");
        }
        else
        {
            ConsumableInfoTableColumn consumableInfoTableColumn = GetWidgetColumn(widget_go) as ConsumableInfoTableColumn;
            IAssignableIdentity       identity = widgetRow.GetIdentity();
            consumableUIItem = consumableInfoTableColumn.consumable_info;
            switch (widgetRow.rowType)
            {
            case TableRow.RowType.StoredMinon:
                break;

            case TableRow.RowType.Header:
                set_value_consumable_info(default_row.GetComponent <TableRow>().GetWidget(consumableInfoTableColumn), new_value);
                StartCoroutine(CascadeSetColumnCheckBoxes(sortable_rows, consumableInfoTableColumn, new_value, widget_go));
                break;

            case TableRow.RowType.Default:
                if (new_value == ResultValues.True)
                {
                    ConsumerManager.instance.DefaultForbiddenTagsList.Remove(consumableUIItem.ConsumableId.ToTag());
                }
                else
                {
                    ConsumerManager.instance.DefaultForbiddenTagsList.Add(consumableUIItem.ConsumableId.ToTag());
                }
                consumableInfoTableColumn.on_load_action(identity, widget_go);
                foreach (KeyValuePair <TableRow, GameObject> item in consumableInfoTableColumn.widgets_by_row)
                {
                    if (item.Key.rowType == TableRow.RowType.Header)
                    {
                        consumableInfoTableColumn.on_load_action(null, item.Value);
                        break;
                    }
                }
                break;

            case TableRow.RowType.Minion:
            {
                MinionIdentity minionIdentity = identity as MinionIdentity;
                if ((UnityEngine.Object)minionIdentity != (UnityEngine.Object)null)
                {
                    consumableConsumer = minionIdentity.GetComponent <ConsumableConsumer>();
                    if ((UnityEngine.Object)consumableConsumer == (UnityEngine.Object)null)
                    {
                        Debug.LogError("Could not find minion identity / row associated with the widget");
                    }
                    else
                    {
                        switch (new_value)
                        {
                        case ResultValues.True:
                        case ResultValues.ConditionalGroup:
                            consumableConsumer.SetPermitted(consumableUIItem.ConsumableId, true);
                            break;

                        case ResultValues.False:
                        case ResultValues.Partial:
                            consumableConsumer.SetPermitted(consumableUIItem.ConsumableId, false);
                            break;
                        }
                        consumableInfoTableColumn.on_load_action(widgetRow.GetIdentity(), widget_go);
                        foreach (KeyValuePair <TableRow, GameObject> item2 in consumableInfoTableColumn.widgets_by_row)
                        {
                            if (item2.Key.rowType == TableRow.RowType.Header)
                            {
                                consumableInfoTableColumn.on_load_action(null, item2.Value);
                                break;
                            }
                        }
                    }
                }
                break;
            }
            }
        }
    }
    protected override void OnActivate()
    {
        title = UI.CONSUMABLESSCREEN.TITLE;
        base.OnActivate();
        AddPortraitColumn("Portrait", base.on_load_portrait, null, true);
        AddButtonLabelColumn("Names", base.on_load_name_label, base.get_value_name_label, delegate(GameObject widget_go)
        {
            GetWidgetRow(widget_go).SelectMinion();
        }, delegate(GameObject widget_go)
        {
            GetWidgetRow(widget_go).SelectAndFocusMinion();
        }, base.compare_rows_alphabetical, on_tooltip_name, base.on_tooltip_sort_alphabetically, false);
        AddLabelColumn("QOLExpectations", on_load_qualityoflife_expectations, get_value_qualityoflife_label, compare_rows_qualityoflife_expectations, on_tooltip_qualityoflife_expectations, on_tooltip_sort_qualityoflife_expectations, 96, true);
        List <IConsumableUIItem> list = new List <IConsumableUIItem>();

        for (int i = 0; i < FOOD.FOOD_TYPES_LIST.Count; i++)
        {
            list.Add(FOOD.FOOD_TYPES_LIST[i]);
        }
        List <GameObject> prefabsWithTag = Assets.GetPrefabsWithTag(GameTags.Medicine);

        for (int j = 0; j < prefabsWithTag.Count; j++)
        {
            MedicinalPill component = prefabsWithTag[j].GetComponent <MedicinalPill>();
            if ((bool)component)
            {
                list.Add(component);
            }
            else
            {
                DebugUtil.DevLogErrorFormat("Prefab tagged Medicine does not have MedicinalPill component: {0}", prefabsWithTag[j]);
            }
        }
        list.Sort(delegate(IConsumableUIItem a, IConsumableUIItem b)
        {
            int num2 = a.MajorOrder.CompareTo(b.MajorOrder);
            if (num2 == 0)
            {
                num2 = a.MinorOrder.CompareTo(b.MinorOrder);
            }
            return(num2);
        });
        ConsumerManager.instance.OnDiscover += OnConsumableDiscovered;
        List <ConsumableInfoTableColumn> list2 = new List <ConsumableInfoTableColumn>();
        List <DividerColumn>             list3 = new List <DividerColumn>();
        List <ConsumableInfoTableColumn> list4 = new List <ConsumableInfoTableColumn>();

        StartScrollableContent("consumableScroller");
        int num = 0;

        for (int k = 0; k < list.Count; k++)
        {
            if (list[k].Display)
            {
                if (list[k].MajorOrder != num && k != 0)
                {
                    string id = "QualityDivider_" + list[k].MajorOrder;
                    ConsumableInfoTableColumn[] quality_group_columns = list4.ToArray();
                    DividerColumn dividerColumn = new DividerColumn(delegate
                    {
                        if (quality_group_columns == null || quality_group_columns.Length == 0)
                        {
                            return(true);
                        }
                        ConsumableInfoTableColumn[] array = quality_group_columns;
                        foreach (ConsumableInfoTableColumn consumableInfoTableColumn in array)
                        {
                            if (consumableInfoTableColumn.isRevealed)
                            {
                                return(true);
                            }
                        }
                        return(false);
                    }, "consumableScroller");
                    list3.Add(dividerColumn);
                    RegisterColumn(id, dividerColumn);
                    list4.Clear();
                }
                ConsumableInfoTableColumn item = AddConsumableInfoColumn(list[k].ConsumableId, list[k], on_load_consumable_info, get_value_consumable_info, on_click_consumable_info, set_value_consumable_info, compare_consumable_info, on_tooltip_consumable_info, on_tooltip_sort_consumable_info);
                list2.Add(item);
                num = list[k].MajorOrder;
                list4.Add(item);
            }
        }
        AddSuperCheckboxColumn("SuperCheckConsumable", list2.ToArray(), base.on_load_value_checkbox_column_super, get_value_checkbox_column_super, base.on_press_checkbox_column_super, base.set_value_checkbox_column_super, null, on_tooltip_consumable_info_super);
    }