private void ActivateTab(int newActiveTabIdx)
        {
            _activeTab = newActiveTabIdx;

            _tabContentContainer.RemoveAllChildren();
            _tabHandleContainer.Children[_activeTab].ClassList.Add(Magics.CssClassActive);
            var activeTabContent = _tabContents[_activeTab];

            _tabContentContainer.AppendChild(activeTabContent);
        }
        private HorizontalTabbedView(Action <HorizontalTabbedView> addTabs)
        {
            _container = new HTMLDivElement {
                Id        = UniqueIdGenerator.GenerateAsString(),
                ClassName = GetType().FullName
            };

            _tabHandleContainer = new HTMLDivElement {
                ClassName = Magics.CssClassTabHandleContainer
            };

            _tabContentContainer = new HTMLDivElement {
                ClassName = Magics.CssClassTabContentContainer
            };

            _container.AppendChild(_tabHandleContainer);
            _container.AppendChild(_tabContentContainer);

            _tabHandleContainer.OnClick += ev => {
                if (!ev.HasHtmlTarget())
                {
                    return;
                }

                var target = ev.HtmlTarget();

                if (target == _tabHandleContainer)
                {
                    return;
                }

                var newActiveTabHandle = target.GetParentElementHavingParent(_tabHandleContainer);
                var newActiveTabIdx    = _tabHandleContainer.Children.IndexOfUsingEquals(newActiveTabHandle);

                if (_activeTab == newActiveTabIdx)
                {
                    Logger.Debug(GetType(), "already active tab selected {0}", _activeTab);
                    return;
                }

                Logger.Debug(GetType(), "switching tab from {0} to {1}", _activeTab, newActiveTabIdx);

                if (newActiveTabIdx < 0 || newActiveTabIdx >= _tabContents.Count)
                {
                    Logger.Error(GetType(), "there's no tab at index {0}. ignoring tab switch", newActiveTabIdx);
                    return;
                }

                if (_activeTab >= 0)
                {
                    _tabHandleContainer.Children[_activeTab].ClassList.Remove(Magics.CssClassActive);
                    _tabContentContainer.RemoveAllChildren();
                }

                ActivateTab(newActiveTabIdx);
            };

            addTabs(this);

            DocumentUtil.AddElementAttachedToDocumentListener(_container, () => {
                if (_measured)
                {
                    return;
                }

                var formerlyFocused = Document.ActiveElement;
                Logger.Debug(GetType(), "Measuring tab heights in onAttached");

                // measure tab content
                var oldVis = _tabContentContainer.Style.Visibility;
                _tabContentContainer.Style.Visibility = Visibility.Hidden;

                _tabContents.ForEachI((i, tab) => {
                    _tabContentContainer.RemoveAllChildren();
                    _tabContentContainer.AppendChild(tab);
                });

                _tabContentContainer.RemoveAllChildren();
                _tabContentContainer.Style.Visibility = oldVis;
                _measured = true;

                //assure that focused element within tab stays focused(it may have been lost during measurement process above)
                if (_tabContents.Any())
                {
                    ActivateTab(_activeTab);
                    if (formerlyFocused != Document.ActiveElement)
                    {
                        formerlyFocused.TryFocusElement();
                    }
                }
            });

            //activate first tab
            if (_tabContents.Any())
            {
                ActivateTab(0);
            }
        }