Exemple #1
0
        public void ForceCloseTab(ITdiTab tab, CloseSource source = CloseSource.External)
        {
            var slider = tab.TabParent as TdiSliderTab;

            if (slider != null)
            {
                slider.ForceCloseTab(tab, source);
                return;
            }

            TdiTabInfo info = _tabs.Find(i => i.TdiTab == tab);

            if (info == null)
            {
                logger.Warn("Вкладка предположительно уже закрыта, попускаем...");
                return;
            }

            while (info.SlaveTabs.Count > 0)
            {
                ForceCloseTab(info.SlaveTabs[0], CloseSource.WithMasterPage);
            }

            CloseTab(info, source);
        }
Exemple #2
0
        private void CloseTab(TdiTabInfo info, CloseSource source)
        {
            if (info.SlaveTabs.Count > 0)
            {
                throw new InvalidOperationException("Вкладка не может быть закрыта, если у нее есть подчинёные вкладки.");
            }

            var tab = info.TdiTab;

            //Закрываем вкладку
            TabVBox tabBox    = GetTabBoxForTab(tab);
            bool    IsCurrent = this.CurrentPageWidget == tabBox;

            _tabs.RemoveAll(t => t.TdiTab == tab);
            _tabs.ForEach(t => t.SlaveTabs.RemoveAll(s => s == tab));
            if (IsCurrent)
            {
                this.PrevPage();
            }
            this.Remove(tabBox);
            var maybeSliderActiveDialog = (tab as TdiSliderTab)?.ActiveDialog;

            if (maybeSliderActiveDialog != null)
            {
                OnTabClosed(maybeSliderActiveDialog, CloseSource.WithParentPage);
            }
            OnTabClosed(tab, source);
            tab.OnTabClosed();
            if (tabBox != null && tabBox.Tab is Container)
            {
                GtkHelper.EnumerateAllChildren((Container)tabBox.Tab)
                .OfType <IMustBeDestroyed>().ToList()
                .ForEach(w => w.Destroy());
            }
            logger.Debug("Вкладка <{0}> удалена", tab.TabName);
            if (tabBox != null)
            {
                tabBox.Destroy();
            }

            tab.TabNameChanged -= OnTabNameChanged;

            if (tab is IDisposable)
            {
                (tab as IDisposable).Dispose();
                tab = null;
            }
            GC.Collect();
        }
Exemple #3
0
        public bool CheckClosingSlaveTabs(ITdiTab tab)
        {
            TdiTabInfo info = _tabs.Find(i => i.TdiTab == tab);

            if (info.SlaveTabs.Count > 0)
            {
                string        Message = "Сначала надо закрыть подчиненую вкладку.";
                MessageDialog md      = new MessageDialog((Window)this.Toplevel, DialogFlags.Modal,
                                                          MessageType.Warning,
                                                          ButtonsType.Ok,
                                                          Message);
                md.Run();
                md.Destroy();
                this.CurrentPage = this.PageNum(GetTabBoxForTab(info.SlaveTabs[0]));
                return(true);
            }

            return(false);
        }
Exemple #4
0
        void OnTabNameChanged(object sender, TdiTabNameChangedEventArgs e)
        {
            ITdiTab    tab  = sender as ITdiTab;
            TdiTabInfo info = _tabs.Find(i => i.TdiTab == tab);

            if (info == null)
            {
                throw new ApplicationException();
            }
            TdiTabInfo masterTabInfo = _tabs.Find(i => i.SlaveTabs.Contains(tab));

            if (masterTabInfo != null)
            {
                info.TabNameLabel.LabelProp   = ">" + e.NewName;
                info.TabNameLabel.TooltipText = String.Format("Открыто из {0}", masterTabInfo.TdiTab.TabName);
            }
            else
            {
                info.TabNameLabel.LabelProp = e.NewName;
            }
        }
Exemple #5
0
        void OnTabNameChanged(object sender, TdiTabNameChangedEventArgs e)
        {
            ITdiTab    tab  = sender as ITdiTab;
            TdiTabInfo info = _tabs.Find(i => i.TdiTab == tab);

            if (info == null)
            {
                logger.Warn("Не найдена вкладка");
                return;
            }
            TdiTabInfo masterTabInfo = _tabs.Find(i => i.SlaveTabs.Contains(tab));

            if (masterTabInfo != null)
            {
                info.TabNameLabel.LabelProp   = ">" + e.NewName;
                info.TabNameLabel.TooltipText = String.Format("Открыто из {0}", masterTabInfo.TdiTab.TabName);
            }
            else
            {
                info.TabNameLabel.LabelProp = e.NewName;
            }
        }
Exemple #6
0
        private void CloseTab(ITdiTab tab)
        {
            TdiTabInfo info = _tabs.Find(i => i.TdiTab == tab);

            if (info == null)
            {
                logger.Warn("Вкладка предположительно уже закрыта, попускаем...");
                return;
            }

            if (info.SlaveTabs.Count > 0)
            {
                throw new InvalidOperationException("Вкладка не может быть закрыта, если у нее есть подчинёные вкладки.");
            }

            //Закрываем вкладку
            TabVBox tabBox    = GetTabBoxForTab(tab);
            bool    IsCurrent = this.CurrentPageWidget == tabBox;

            _tabs.RemoveAll(t => t.TdiTab == tab);
            _tabs.ForEach(t => t.SlaveTabs.RemoveAll(s => s == tab));
            if (IsCurrent)
            {
                this.PrevPage();
            }
            this.Remove(tabBox);
            var maybeSliderActiveDialog = (tab as TdiSliderTab)?.ActiveDialog;

            if (maybeSliderActiveDialog != null)
            {
                OnTabClosed(maybeSliderActiveDialog);
            }
            OnTabClosed(tab);
            logger.Debug("Вкладка <{0}> удалена", tab.TabName);
            (tab as Widget).Destroy();
            tabBox.Destroy();
        }
Exemple #7
0
        public ITdiTab FindTab(string hashName, string masterHashName = null)
        {
            if (String.IsNullOrWhiteSpace(hashName))
            {
                return(null);
            }

            TdiTabInfo tab = null;

            if (String.IsNullOrWhiteSpace(masterHashName))
            {
                tab = Tabs.FirstOrDefault(x => x.MasterTabInfo == null && x.TdiTab.CompareHashName(hashName));
                return(tab?.TdiTab);
            }
            else
            {
                var master = Tabs.FirstOrDefault(x => x.TdiTab.CompareHashName(masterHashName));
                if (master == null)
                {
                    return(null);
                }
                return(master.SlaveTabs.FirstOrDefault(x => x.CompareHashName(hashName)));
            }
        }
Exemple #8
0
        public void AddSlaveTab(ITdiTab masterTab, ITdiTab slaveTab)
        {
            TdiTabInfo info = _tabs.Find(t => t.TdiTab == masterTab);

            if (info == null)
            {
                throw new NullReferenceException("Мастер вкладка не найдена в списке активных вкладок.");
            }

            var journalTab = slaveTab as ITdiJournal;

            if (journalTab != null && (!journalTab.UseSlider.HasValue && DefaultUseSlider || journalTab.UseSlider.Value))
            {
                TdiSliderTab slider = new TdiSliderTab((ITdiJournal)slaveTab, WidgetResolver);
                slaveTab = slider;
            }

            info.SlaveTabs.Add(slaveTab);
            this.AddTab(slaveTab, masterTab);
            var addedTabInfo = _tabs.Find(t => t.TdiTab == slaveTab);

            addedTabInfo.MasterTabInfo = info;
            OnTabNameChanged(slaveTab, new TdiTabNameChangedEventArgs(slaveTab.TabName));
        }
Exemple #9
0
 public TdiTabInfo(ITdiTab tab, Label label, TdiTabInfo masterTabInfo = null)
 {
     MasterTabInfo = masterTabInfo;
     TdiTab        = tab;
     TabNameLabel  = label;
 }