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(); }
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(); }