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); }
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(); }
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); }
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; } }
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; } }
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(); }
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))); } }
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)); }
public TdiTabInfo(ITdiTab tab, Label label, TdiTabInfo masterTabInfo = null) { MasterTabInfo = masterTabInfo; TdiTab = tab; TabNameLabel = label; }