Пример #1
0
        /// <summary>EnumT must be enum. It is expected that Convert.ToInt32(x) call will succeed</summary>
        public static RadioBasedSingleChoice BuildForEnum <EnumT, CtxT>(
            string labelOrNull, EnumT defaultValue, Func <EnumT, string> getLabel,
            Func <int, EnumT> intToEnum,
            Func <HTMLElement, int, CtxT> beforeAddItems,
            RadioBasedSingleChoiceItemAdder <CtxT, EnumT> itemAdderOrNull = null) where EnumT : struct
        {
            RadioBasedSingleChoiceItemAdder itemAdder = null;

            if (itemAdderOrNull != null)
            {
                itemAdder = (ctx, cntnr, rawItem, itemAsEl, labelEl, itemNo) =>
                            itemAdderOrNull(
                    (CtxT)ctx, cntnr, intToEnum(Convert.ToInt32(rawItem.Item1)), itemAsEl, labelEl, itemNo);
            }

            var result = new RadioBasedSingleChoice(labelOrNull, itemAdder)
            {
                BeforeAddItems  = (x, y) => beforeAddItems(x, y),
                PermittedValues =
                    EnumExtensions
                    .GetEnumValues <EnumT>()
                    .Select(x => Tuple.Create(Convert.ToInt32(x) + "", getLabel(x))),
                Value = Tuple.Create(Convert.ToInt32(defaultValue) + "", getLabel(defaultValue))
            };

            return(result);
        }
Пример #2
0
        public static RadioBasedSingleChoice Build <T, CtxT>(
            string labelOrNull, T defaultValue, Func <T, string> getLabel,
            Func <int, T> intToItem, Func <T, int> itemToInt,
            Func <HTMLElement, int, CtxT> beforeAddItemsOrNull        = null,
            RadioBasedSingleChoiceItemAdder <CtxT, T> itemAdderOrNull = null)
        {
            RadioBasedSingleChoiceItemAdder itemAdder = null;

            if (itemAdderOrNull != null)
            {
                itemAdder = (ctx, cntnr, rawItem, itemAsEl, labelEl, itemNo) =>
                            itemAdderOrNull(
                    (CtxT)ctx, cntnr, intToItem(Convert.ToInt32(rawItem.Item1)), itemAsEl, labelEl, itemNo);
            }

            var result = new RadioBasedSingleChoice(labelOrNull, itemAdder);

            if (beforeAddItemsOrNull != null)
            {
                result.BeforeAddItems = (x, y) => beforeAddItemsOrNull(x, y);
            }

            var defVal = Tuple.Create(itemToInt(defaultValue) + "", getLabel(defaultValue));

            result.PermittedValues = new [] { defVal };
            result.Value           = defVal;

            return(result);
        }
Пример #3
0
 /// <summary>EnumT must be enum. It is expected that Convert.ToInt32(x) call will succeed</summary>
 public static RadioBasedSingleChoice BuildForEnum <EnumT, CtxT>(
     EnumT defaultValue, Func <EnumT, string> getLabel,
     Func <int, EnumT> intToEnum,
     Func <HTMLElement, int, CtxT> beforeAddItems,
     RadioBasedSingleChoiceItemAdder <CtxT, EnumT> itemAdderOrNull = null) where EnumT : struct
 {
     return(BuildForEnum(null, defaultValue, getLabel, intToEnum, beforeAddItems, itemAdderOrNull));
 }
        public RadioBasedSingleChoice(string labelOrNull = null, RadioBasedSingleChoiceItemAdder customItemAdder = null)
        {
            BeforeAddItems = (element, i) => null;

            ItemAdder = customItemAdder ?? ((ctx, cntnr, rawItem, itemElem, lblElem, itemNo) => {
                cntnr.AppendChild(itemElem);
                cntnr.AppendChild(lblElem);
            });

            _uniqueNumberAsName = UniqueIdGenerator.GenerateAsString();

            _container           = new HTMLDivElement();
            _container.ClassName = GetType().FullNameWithoutGenerics();

            if (labelOrNull != null)
            {
                _genericLabelOrNull = new HTMLLabelElement {
                    TextContent = labelOrNull
                };
                _container.AppendChild(_genericLabelOrNull);
            }

            _logic = new ControlWithValueLogic <Tuple <string, string> >(
                (newVal, isUser) => Changed?.Invoke(newVal, isUser),
                () => {
                var active = _valueToItem.Values.FirstOrDefault(x => x.Checked);
                return(active == null ? Tuple.Create("", "") : Tuple.Create(active.Value, _valueToLabel[active.Value]));
            },
                v => {
                var emptying = v == null || string.IsNullOrEmpty(v.Item1);

                Logger.Debug(GetType(), "setPhysicalValue emptying?={0} value=({1};{2})",
                             emptying, v?.Item1, v?.Item2);

                if (emptying)
                {
                    foreach (var x in _valueToItem.Values)
                    {
                        if (x.Checked)
                        {
                            x.Checked = false;
                            break;
                        }
                    }
                    return;
                }

                _valueToItem[v.Item1].Checked = true;
            },
                () => _valueToItem.Any() && !_valueToItem.First().Value.Disabled,
                v => _valueToItem.Values.ForEach(x => _valueToItem.First().Value.Disabled = !v),
                () => _container.ClassList.Contains(Magics.CssClassIsValidating),
                v => _container.AddOrRemoveClass(v, Magics.CssClassIsValidating)
                );
            _logic.ValueToString = x => x == null ? "<Tuple null>" : $"<Tuple fst={x.Item1} snd={x.Item2}>";
        }