public override void ApplyChanges()
        {
            ExternalListViewWebPart wp = (ExternalListViewWebPart)this.ParentToolPane.SelectedWebPart;

            wp.CatalogId           = this.ddlCatalogs.SelectedValue;
            wp.ViewName            = this.ddlViews.SelectedValue;
            wp.RelationField       = this.txtRelationFld.Text;
            wp.FilterOperators     = this.txtFilterOperators.Text;
            wp.CalendarHeight      = this.txtCalendarHeight.Text;
            wp.CalendarWidth       = this.txtCalendarWidth.Text;
            wp.EditMode            = this.chEditMode.Checked;
            wp.DisplayPrepopulated = this.chDisplayPrepopulated.Checked;

            base.ApplyChanges();
        }
        protected override void CreateChildControls()
        {
            RosterConfigService configProvider = new RosterConfigService();
            var lists = configProvider.GetLists();

            ddlCatalogs          = new DropDownList();
            ddlCatalogs.ID       = "catalogSelector";
            ddlCatalogs.CssClass = "lists_control";
            ddlCatalogs.Attributes.Add("onchange", "UpdateViewsList(this);");
            ddlCatalogs.Items.AddRange(lists.Select(x => new ListItem(x.Name, x.Id.ToString())).ToArray());

            ddlViews          = new DropDownList();
            ddlViews.ID       = "viewSelector";
            ddlViews.CssClass = "views_control";
            ddlViews.Items.AddRange(lists.SelectMany(x => x.ViewMetadatas).Select(v => new ListItem(v.Name, v.Id.ToString())).ToArray());

            hidAllViewsInfo       = new HiddenField();
            hidAllViewsInfo.ID    = "hidAllViewsHierarchy";
            hidAllViewsInfo.Value = new JavaScriptSerializer().Serialize(lists.Select(x => new { list = x.Id, views = x.ViewMetadatas.Select(v => new { viewId = v.Id, viewName = v.Name }) }));

            txtRelationFld    = new TextBox();
            txtRelationFld.ID = "txtRelationField";

            txtFilterOperators    = new TextBox();
            txtFilterOperators.ID = "txtFilterOperators";

            txtCalendarWidth    = new TextBox();
            txtCalendarWidth.ID = "txtCalendarWidth";

            txtCalendarHeight    = new TextBox();
            txtCalendarHeight.ID = "txtCalendarHeight";

            chEditMode      = new CheckBox();
            chEditMode.ID   = "chEditMode";
            chEditMode.Text = "Edit mode? (GridView only)";

            chDisplayPrepopulated      = new CheckBox();
            chDisplayPrepopulated.ID   = "chDisplayPrepopulated";
            chDisplayPrepopulated.Text = "Display pre-populated? (CalendarView only)";

            this.Controls.Add(ddlCatalogs);
            this.Controls.Add(ddlViews);
            this.Controls.Add(hidAllViewsInfo);
            this.Controls.Add(txtRelationFld);
            this.Controls.Add(txtFilterOperators);
            this.Controls.Add(txtCalendarWidth);
            this.Controls.Add(txtCalendarHeight);
            this.Controls.Add(chEditMode);
            this.Controls.Add(chDisplayPrepopulated);
            ScriptLink.Register(this.Page, "/_layouts/15/Roster.Presentation/js/cascadeSelection.view.js", true);

            //setting the last set values as current values on custom toolpart
            ExternalListViewWebPart wp = (ExternalListViewWebPart)this.ParentToolPane.SelectedWebPart;

            if (wp != null)
            {
                this.ddlCatalogs.SelectedValue     = wp.CatalogId;
                this.ddlViews.SelectedValue        = wp.ViewName;
                this.txtRelationFld.Text           = wp.RelationField;
                this.txtFilterOperators.Text       = wp.FilterOperators;
                this.txtCalendarWidth.Text         = wp.CalendarWidth;
                this.txtCalendarHeight.Text        = wp.CalendarHeight;
                this.chEditMode.Checked            = wp.EditMode;
                this.chDisplayPrepopulated.Checked = wp.DisplayPrepopulated;
            }

            base.CreateChildControls();
        }