public void AddTab(ITdiTab tab, int after = -1) { if (tab.FailInitialize) { logger.Warn("Вкладка <{0}> не добавлена, так как сообщает что построена с ошибкой(Свойство FailInitialize) .", tab.TabName ); return; } HBox box = new HBox(); Label nameLable = new Label(tab.TabName); box.Add(nameLable); Image closeImage = new Image(Stock.Close, IconSize.Menu); Button closeButton = new Button(closeImage); closeButton.Relief = ReliefStyle.None; closeButton.Clicked += OnCloseButtonClicked; closeButton.ModifierStyle.Xthickness = 0; closeButton.ModifierStyle.Ythickness = 0; box.Add(closeButton); box.ShowAll(); var journalTab = tab as ITdiJournal; if (journalTab != null && ((journalTab.UseSlider == null && DefaultUseSlider) || journalTab.UseSlider.Value)) { TdiSliderTab slider = new TdiSliderTab((ITdiJournal)tab); tab = slider; } tab.CloseTab += HandleCloseTab; tab.TabNameChanged += OnTabNameChanged; _tabs.Add(new TdiTabInfo(tab, nameLable)); var vbox = new TabVBox(tab); int inserted; if (after >= 0) { inserted = this.InsertPage(vbox, box, after + 1); } else { inserted = this.AppendPage(vbox, box); } tab.TabParent = this; vbox.Show(); this.ShowTabs = true; if (TabAdded != null) { TabAdded(this, new TabAddedEventArgs(tab)); } this.CurrentPage = inserted; logger.Debug("Добавлена вкладка '{0}'", tab.TabName); //I-867 Если вкладка "заказы", if (tab is ITdiTabAddedNotifier) { //то открыть окно "контрагенты" ((ITdiTabAddedNotifier)tab).OnTabAdded(); } }
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 TabVBox GetTabBoxForTab(ITdiTab tab) { return(this.Children.SingleOrDefault(w => { TabVBox tabBox = (w as TabVBox); if (tabBox.Tab == tab) { return true; } if (tabBox.Tab is TdiSliderTab) { return (tabBox.Tab as TdiSliderTab).Journal == tab; } return false; }) as TabVBox); }
void OnCloseButtonClicked(object sender, EventArgs e) { Widget boxWidget = (sender as Widget).Parent; TabVBox tab = null; foreach (Widget wid in this.Children) { if (this.GetTabLabel(wid) == boxWidget) { tab = (TabVBox)wid; } } if (tab == null) { logger.Warn("Не найден вкладка соответствующая кнопке закрыть."); return; } AskToCloseTab(tab.Tab, CloseSource.ClosePage); }
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(); }
void OnCloseButtonClicked(object sender, EventArgs e) { Widget boxWidget = (sender as Widget).Parent; TabVBox tab = null; foreach (Widget wid in this.Children) { if (this.GetTabLabel(wid) == boxWidget) { tab = (TabVBox)wid; } } if (tab == null) { logger.Warn("Не найден вкладка соответствующая кнопке закрыть."); return; } if (CheckClosingSlaveTabs(tab.Tab)) { return; } ITDICloseControlTab cct = tab.Tab as ITDICloseControlTab; if (cct != null && !cct.CanClose()) { return; } if (SaveIfNeed(tab.Tab)) { CloseTab(tab.Tab); } }