// // // Copyright (C) Microsoft. All rights reserved. // // using Contoso.EmailService; using Microsoft.WindowsServerSolutions.Administration.ObjectModel.Adorners; using Microsoft.WindowsServerSolutions.Common.ProviderFramework; using Microsoft.WindowsServerSolutions.HostedEmail; using System; using System.Collections.Generic; using System.ComponentModel; using System.Threading.Tasks; using System.Windows.Forms; namespace Contoso.HostedEmail.DistributionGroup { public class DistributionGroupAdorner : FormContentAdorner, IHostedEmailExtension { private DistributionGroupTabContent content = null; public DistributionGroupAdorner() : base(new Guid("B00F3F8D-176B-4A85-A1C9-3022A6E5B9BC"), Resources.DGAdorner_Name, Resources.DGAdorner_Des) { } public override ICollection CreatePages(FormPropertyBag propertyBag) { List list = new List(); content = new DistributionGroupTabContent(propertyBag) { Title = Resources.DGTab_Name, HelpLink = null, HelpLinkText = null }; list.Add(content); return list; } public override ICollection CreatePostExecutionTasks(FormPropertyBag propertyBag) { return null; } public override ICollection CreatePreExecutionTasks(FormPropertyBag propertyBag) { if (content == null) return null; List tasks = new List(); tasks.Add(new Task(() => content.UpdateDistributionGroups())); return tasks; } #region IHostedEmailExtension public Guid GetAddinId() { return Constants.AdaptorId; } #endregion } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable", Justification = "TabControl will be disposed by the framework.")] public class DistributionGroupTabContent : AddinPageContent { DistributionGroupControl tabControl = null; public DistributionGroupTabContent(FormPropertyBag propertyBag) : base(propertyBag) { tabControl = new DistributionGroupControl(base.PropertyBag); tabControl.Dock = DockStyle.Fill; tabControl.AutoScroll = false; // ATTENTION: // the reason of loading data in page initiailzing coz that we need the UserName in propertyBag which will be // filled in with data after the controls are created. Therefore, we cannot get data we want in this ctor. this.PageInitializing += (object sender, EventArgs e) => { this.tabControl.StartLoadingData(); }; this.PageValidating += (object sender, CancelEventArgs e) => { // Putting the data here coz this method is called in UI thread base.PropertyBag.AddinData[Constants.ExtendedParam_DGs] = tabControl.GetDistributionGroupsString(); }; } public override Control CreateControl() { return tabControl; } public override event EventHandler PropertyChanged { add { tabControl.PropertyChanged += value; } remove { tabControl.PropertyChanged -= value; } } internal void UpdateDistributionGroups() { tabControl.UpdateDistributionGroups(); } } }