{
 "metadata": {
  "cell_tags": [
   [
    "<None>",
    null
   ]
  ],
  "name": "",
  "signature": "sha256:2151c0c39c1bd1428b13eb12b7468e173d98a14bf1f43050e2fdafe01b7b05d8"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from __future__ import print_function # For py 2.7 compat\n",
      "from IPython.html import widgets # Widget definitions\n",
      "from IPython.display import display # Used to display widgets in the notebook\n",
      "from IPython.utils.traitlets import Unicode # Used to declare attributes of our widget"
     ],
     "language": "python",
     "metadata": {},
     "outputs": []
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "class TestWidget(widgets.DOMWidget):\n",
      "    _view_name = Unicode('TestView', sync=True)\n",
      "    \n",
      "    def __init__(self, **kwargs):\n",
      "        super(TestWidget, self).__init__(**kwargs)\n",
      "        self.on_msg(self._handle_button_msg)\n",
      "\n",
      "    def _handle_button_msg(self, _, content):\n",
      "        if content.get('event', '') == 'click':\n",
      "            self.on_click(content)\n",
      "        elif content.get('event', '') == 'keypress':\n",
      "            self.on_key_press(content)\n",
      "\n",
      "    def on_click(self, content):\n",
      "        print(\"Button {b}\".format(b=content['button']))\n",
      "\n",
      "    def on_key_press(self, content):\n",
      "        print(\"Key {c}\".format(c=content['code']))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": []
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%javascript\n",
      "require([\"widgets/js/widget\"], function(WidgetManager){\n",
      "    \n",
      "    var TestView = IPython.DOMWidgetView.extend({\n",
      "        render: function(){\n",
      "            \n",
      "            this.$canvas = $('<canvas />')\n",
      "                .attr('width', '200')\n",
      "                .attr('height', '100')\n",
      "                .attr('style', 'background: black;')\n",
      "                .attr('tabindex', '1')\n",
      "                .appendTo(this.$el);\n",
      "        },\n",
      "        \n",
      "        events: {\n",
      "            'keydown': 'keypress',\n",
      "            'click': 'click',\n",
      "        },\n",
      "\n",
      "        keypress: function(e) {\n",
      "            var code = e.keyCode || e.which;\n",
      "            this.send({event: 'keypress', code: code});\n",
      "        },\n",
      "\n",
      "        click: function(e) {\n",
      "            this.send({event: 'click', button: e.button});\n",
      "        }\n",
      "    });\n",
      "    \n",
      "    WidgetManager.register_widget_view('TestView', TestView);\n",
      "});"
     ],
     "language": "python",
     "metadata": {},
     "outputs": []
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "my_widget = TestWidget()\n",
      "display(my_widget)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": []
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [],
     "language": "python",
     "metadata": {},
     "outputs": []
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [],
     "language": "python",
     "metadata": {},
     "outputs": []
    }
   ],
   "metadata": {}
  }
 ]
}