Ejemplo n.º 1
0
        public AutocompleteDropdown(
            string label,
            TextType textType = TextType.TreatAsText,
            int delayMilisec  = Magics.AutocompleteDefaultDelay)
        {
            _cnt.ClassName = GetType().FullNameWithoutGenerics();

            var lbl = new HTMLLabelElement {
                HtmlFor = _input.Id, TextContent = label
            };

            _cnt.AppendChild(lbl);

            _cnt.AppendChild(_input);
            _cnt.AppendChild(_options);
            HideOptions();

            DocumentUtil.AddMouseDownListener(_cnt, x => {
                if (!x.HasHtmlTarget())
                {
                    return;
                }
                var htmlTarget = x.HtmlTarget();

                if (htmlTarget.IsElementOrItsDescendant(_cnt))
                {
                    //clicked inside control (focus stays within logical control) thus do nothing
                    return;
                }

                HideOptions();
            });

            _input.OnFocus += ev => {
                if (_ignoreNextFocus)
                {
                    _ignoreNextFocus = false;
                    return;
                }

                ShowOptions();

                if (!_input.HasFocus())
                {
                    //non user generated (isTrusted == false) events don't invoke default action in Chrome
                    _ignoreNextFocus = true;
                    _input.Focus();
                }
            };
            _input.OnKeyDown += ev => {
                switch (ev.KeyCode)
                {
                case Magics.KeyCodeEscape:
                    if (OptionsVisible)
                    {
                        ev.PreventDefault();
                        ev.StopPropagation();
                        HideOptions();
                    }
                    break;

                case Magics.KeyCodeEnter:
                case Magics.KeyCodeArrowUp:
                case Magics.KeyCodeArrowDown:
                    ev.PreventDefault();
                    OnKeyboardEvent(AutocompleteSrcType.KeyDown, ev);
                    break;

                case Magics.KeyCodeBackspace:
                    OnKeyboardEvent(AutocompleteSrcType.KeyDown, ev);     //it is not called onkeypress
                    break;

                case Magics.KeyCodeTab:
                    HideOptions();
                    break;

                default: break;
                }
            };
            _input.OnKeyPress += ev => {
                switch (ev.KeyCode)
                {
                case Magics.KeyCodeBackspace:
                case Magics.KeyCodeEnter:
                case Magics.KeyCodeArrowUp:
                case Magics.KeyCodeArrowDown:
                    ev.PreventDefault();
                    break;

                default:
                    OnKeyboardEvent(AutocompleteSrcType.KeyPressed, ev);
                    break;
                }
            };

            _textType     = textType;
            _delayMilisec = delayMilisec;
        }
Ejemplo n.º 2
0
        protected TwoPanelsWithResizer(
            Hideability hideable, int minPanelSizePx, Tuple <int?, int?> fixedSize, SpacingPolicy?spacingPolicy)
        {
            MinPanelSizePx = minPanelSizePx;

            if (fixedSize == null && !spacingPolicy.HasValue ||
                fixedSize != null && spacingPolicy.HasValue ||
                fixedSize != null && fixedSize.Item1.HasValue && fixedSize.Item2.HasValue ||
                fixedSize != null && !fixedSize.Item1.HasValue && !fixedSize.Item2.HasValue)
            {
                throw new Exception("Either spacing policy needs to be provided OR exactly one fixedSize dimension");
            }

            Hideable             = hideable;
            _fixedSize           = fixedSize;
            _spacingPolicy       = spacingPolicy;
            _container.ClassName = GetType().FullName;
            _container.Id        = UniqueIdGenerator.GenerateAsString();
            _splitter.ClassName  = Magics.CssClassSplitter;

            _container.AppendChild(FirstPanel);
            _container.AppendChild(_splitter);
            _container.AppendChild(SecondPanel);

            _splitter.OnTouchStart += x => {
                if (!x.HasHtmlTarget())
                {
                    return;
                }

                var htmlTarget = x.HtmlTarget();

                if (!htmlTarget.IsElementOrItsDescendant(_splitter))
                {
                    return;
                }

                _isDragging = true;
                _touchId    = x.TargetTouches[0].Identifier;
                Logger.Debug(GetType(), "TouchStart {0}", _touchId);
            };

            _splitter.OnTouchEnd += ev => {
                _isDragging = false;
                _touchId    = 0;
                Logger.Debug(GetType(), "TouchEnd {0}", _touchId);
            };

            _splitter.OnTouchMove += ev => {
                if (!_isDragging)
                {
                    return;
                }

                var touch = ev.Touches.FirstOrDefault(x => x.Identifier == _touchId);

                Logger.Debug(GetType(), "TouchMove {0} present?={1}", _touchId, touch != null);

                if (touch == null)
                {
                    return;
                }

                var sizes = CalculateSizesOnUserResize(touch.PageX, touch.PageY);

                if (sizes.Item1 < minPanelSizePx || sizes.Item2 < minPanelSizePx)
                {
                    return;
                }
                Logger.Debug(GetType(), "updating sizes for panelType={0} id={1} to ({2}; {3})", GetType().FullName, _container.Id, sizes.Item1, sizes.Item2);

                _container.AddClasses(Magics.CssClassActive);
                ev.PreventDefault();
                Sizes = sizes;
                SetPanelsSize(sizes);
            };

            DocumentUtil.AddMouseDownListener(_splitter, x => {
                if (!x.HasHtmlTarget())
                {
                    return;
                }

                var htmlTarget = x.HtmlTarget();

                if (!htmlTarget.IsElementOrItsDescendant(_splitter))
                {
                    return;
                }

                _isDragging = true;
                x.PreventDefault();
            });

            DocumentUtil.AddMouseUpListener(_splitter, x => {
                _isDragging = false;
            });

            DocumentUtil.AddMouseMoveListener(_splitter, ev => {
                if (!_isDragging)
                {
                    return;
                }
                ev.PreventDefault();

                var sizes = CalculateSizesOnUserResize(ev.PageX, ev.PageY);

                if (sizes.Item1 < minPanelSizePx || sizes.Item2 < minPanelSizePx)
                {
                    return;
                }
                Logger.Debug(GetType(), "updating sizes for panelType={0} id={1} to ({2}; {3})", GetType().FullName, _container.Id, sizes.Item1, sizes.Item2);

                _container.AddClasses(Magics.CssClassActive);

                Sizes = sizes;
                SetPanelsSize(sizes);
            });

            DocumentUtil.AddElementAttachedToDocumentListener(_container, InitializeWidthsOnAttachOrResize);
            DocumentUtil.AddElementResizeListener(_container, InitializeWidthsOnAttachOrResize);
        }