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(); }
//FIXME Возможно временный метод, в нем не было необходиости пока в MonoDevelop не появился баг, с удалением подписок с кнопок Save и Cancel private void CheckButtonSubscription() { saveButton = GtkHelper.EnumerateAllChildren(this).OfType <Button> ().FirstOrDefault(x => x.Name == "buttonSave"); if (saveButton != null) { saveButton.Clicked -= OnButtonSaveClicked; saveButton.Clicked += OnButtonSaveClicked; } cancelButton = GtkHelper.EnumerateAllChildren(this).OfType <Button> ().FirstOrDefault(x => x.Name == "buttonCancel"); if (cancelButton != null) { cancelButton.Clicked -= OnButtonCancelClicked; cancelButton.Clicked += OnButtonCancelClicked; } }