HelloWorld example for Sitefinity 4 custom Widgets and ControlDesigners

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="HelloWorld.ascx.cs" Inherits="SitefinityWebApp.Widgets.HelloWorld" %>

<p>Hello <asp:Literal ID="NameLiteral" runat="server" /></p>
using System;
using Telerik.Sitefinity.Web.UI.ControlDesign;

namespace SitefinityWebApp.Widgets
{
[ControlDesigner(typeof(HelloWorldDesigner))]
    public partial class HelloWorld : System.Web.UI.UserControl
    {
        // This public property will become editable in Sitefinity
        public string Name { get; set; }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(Name))
            {
                NameLiteral.Text = "World!";
            }
            else
            {
                NameLiteral.Text = Name;
            }
        }
    }
}
<div>
    <span>Your name:</span><br />
    <input type="text" id="txtName" />
</div>
using System.Collections.Generic;
using Telerik.Sitefinity.Web.UI.ControlDesign;
using System.Web.UI;

namespace SitefinityWebApp.Widgets
{
    public class HelloWorldDesigner : ControlDesignerBase
    {
        protected override void InitializeControls(Telerik.Sitefinity.Web.UI.GenericContainer container)
        {
            base.DesignerMode = ControlDesignerModes.Simple;
        }

        public override string LayoutTemplatePath
        {
            get
            {
                return _layoutTemplatePath;
            }
            set
            {
                _layoutTemplatePath = value;
            }
        }

        protected override string LayoutTemplateName
        {
            get { return string.Empty; }
        }

        public override IEnumerable<ScriptReference> GetScriptReferences()
        {
            // get script collection
            var scripts = base.GetScriptReferences() as List<ScriptReference>;
            if (scripts == null) return base.GetScriptReferences();

            scripts.Add(new ScriptReference(_scriptReference));

            return scripts.ToArray();
        }

        private string _layoutTemplatePath = "~/Widgets/HelloWorldDesigner.ascx";
        private string _scriptReference = "~/Widgets/HelloWorldDesigner.js";
    }
}
Type.registerNamespace("SitefinityWebApp.Widgets.HelloWorld");

SitefinityWebApp.Widgets.HelloWorldDesigner = function (element) {
    SitefinityWebApp.Widgets.HelloWorldDesigner.initializeBase(this, [element]);
}

SitefinityWebApp.Widgets.HelloWorldDesigner.prototype = {
    initialize: function () {
        SitefinityWebApp.Widgets.HelloWorldDesigner.callBaseMethod(this, 'initialize');
    },
    dispose: function () {
        SitefinityWebApp.Widgets.HelloWorldDesigner.callBaseMethod(this, 'dispose');
    },
    refreshUI: function () {
        var controlData = this._propertyEditor.get_control();

        // bind widget properites to designer
        jQuery("#txtName").val(controlData.Name);


    },
    applyChanges: function () {

        var controlData = this._propertyEditor.get_control();

        // bind designer properties back to widget
        controlData.Name = jQuery("#txtName").val();

    }
}

SitefinityWebApp.Widgets.HelloWorldDesigner.registerClass('SitefinityWebApp.Widgets.HelloWorldDesigner', Telerik.Sitefinity.Web.UI.ControlDesign.ControlDesignerBase);
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();