src/cm/media/js/lib/yui/yui_3.10.3/docs/widget/widget-extend.html
author gibus
Tue, 16 Jul 2013 14:29:46 +0200
changeset 525 89ef5ed3c48b
permissions -rw-r--r--
Upgrades to yui 3.10.3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
525
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     1
<!DOCTYPE html>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     2
<html lang="en">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     3
<head>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     4
    <meta charset="utf-8">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     5
    <title>Example: Extending the Base Widget Class</title>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     6
    <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=PT+Sans:400,700,400italic,700italic">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     7
    <link rel="stylesheet" href="../../build/cssgrids/cssgrids-min.css">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     8
    <link rel="stylesheet" href="../assets/css/main.css">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     9
    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    10
    <link rel="shortcut icon" type="image/png" href="../assets/favicon.png">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    11
    <script src="../../build/yui/yui-min.js"></script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    12
    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    13
</head>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    14
<body>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    15
<!--
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    16
<a href="https://github.com/yui/yui3"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub"></a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    17
-->
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    18
<div id="doc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    19
    <div id="hd">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    20
        <h1><img src="http://yuilibrary.com/img/yui-logo.png"></h1>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    21
    </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    22
    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    23
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    24
            <h1>Example: Extending the Base Widget Class</h1>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    25
    <div class="yui3-g">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    26
        <div class="yui3-u-3-4">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    27
            <div id="main">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    28
                <div class="content"><style type="text/css" scoped>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    29
    .yui3-js-enabled .yui3-spinner-loading {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    30
        display:none;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    31
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    32
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    33
    .yui3-spinner-hidden {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    34
        display:none;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    35
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    36
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    37
    .yui3-spinner {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    38
        display:-moz-inline-stack;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    39
        display:inline-block;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    40
        zoom:1;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    41
        *display:inline;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    42
        vertical-align:middle;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    43
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    44
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    45
    .yui3-spinner-content {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    46
        padding:1px;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    47
        position:relative;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    48
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    49
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    50
    .yui3-spinner-value {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    51
        width:2em;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    52
        height:1.5em;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    53
        text-align:right;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    54
        margin-right:22px;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    55
        vertical-align:top;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    56
        border:1px solid #000;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    57
        padding:2px;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    58
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    59
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    60
    .yui3-spinner-increment, .yui3-spinner-decrement {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    61
        position:absolute;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    62
        height:1em;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    63
        width:22px;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    64
        overflow:hidden;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    65
        text-indent:-10em;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    66
        border:1px solid #999;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    67
        margin:0;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    68
        padding:0px;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    69
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    70
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    71
    .yui3-spinner-increment {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    72
        top:1px;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    73
        *top:2px;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    74
        right:1px;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    75
        background:#ddd url(../assets/widget/arrows.png) no-repeat 50% 0px;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    76
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    77
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    78
     .yui3-spinner-decrement {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    79
        bottom:1px;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    80
        *bottom:2px;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    81
        right:1px;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    82
        background:#ddd url(../assets/widget/arrows.png) no-repeat 50% -20px;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    83
     }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    84
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    85
    #widget-extend-example {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    86
        padding:5px;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    87
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    88
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    89
    #widget-extend-example .hint {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    90
        margin-top:10px;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    91
        font-size:85%;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    92
        color:#00a;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    93
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    94
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    95
</style>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    96
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    97
<div class="intro">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    98
    <p>This example shows how to extend the base <code>Widget</code> class to create a simple, re-usable spinner control. The <code>Spinner</code> class created in the example is not intended to be a fully featured spinner. It is used here as a concrete example, to convey some of the key concepts to keep in mind when extending the <code>Widget</code> class.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    99
</div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   100
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   101
<div class="example">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   102
    <div id="widget-extend-example">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   103
    A basic spinner widget: <input type="text" id="numberField" class="yui3-spinner-loading" value="20" />
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   104
    <p class="hint">Click the buttons, or the arrow up/down and page up/down keys on your keyboard to change the spinner's value</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   105
</div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   106
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   107
<script type="text/javascript">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   108
YUI().use("event-key", "widget", function(Y) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   109
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   110
    var Lang = Y.Lang,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   111
        Widget = Y.Widget,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   112
        Node = Y.Node;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   113
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   114
    /* Spinner class constructor */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   115
    function Spinner(config) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   116
        Spinner.superclass.constructor.apply(this, arguments);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   117
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   118
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   119
    /* 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   120
     * Required NAME static field, to identify the Widget class and 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   121
     * used as an event prefix, to generate class names etc. (set to the 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   122
     * class name in camel case). 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   123
     */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   124
    Spinner.NAME = "spinner";
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   125
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   126
    /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   127
     * The attribute configuration for the Spinner widget. Attributes can be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   128
     * defined with default values, get/set functions and validator functions
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   129
     * as with any other class extending Base.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   130
     */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   131
    Spinner.ATTRS = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   132
        // The minimum value for the spinner.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   133
        min : {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   134
            value:0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   135
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   136
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   137
        // The maximum value for the spinner.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   138
        max : {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   139
            value:100
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   140
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   141
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   142
        // The current value of the spinner.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   143
        value : {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   144
            value:0,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   145
            validator: function(val) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   146
                return this._validateValue(val);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   147
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   148
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   149
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   150
        // Amount to increment/decrement the spinner when the buttons or arrow up/down keys are pressed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   151
        minorStep : {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   152
            value:1
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   153
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   154
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   155
        // Amount to increment/decrement the spinner when the page up/down keys are pressed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   156
        majorStep : {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   157
            value:10
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   158
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   159
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   160
        // override default ("null"), required for focus()
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   161
        tabIndex: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   162
            value: 0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   163
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   164
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   165
        // The strings for the spinner UI. This attribute is 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   166
        // defined by the base Widget class but has an empty value. The
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   167
        // spinner is simply providing a default value for the attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   168
        strings: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   169
            value: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   170
                tooltip: "Press the arrow up/down keys for minor increments, page up/down for major increments.",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   171
                increment: "Increment",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   172
                decrement: "Decrement"
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   173
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   174
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   175
    };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   176
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   177
    /* Static constant used to identify the classname applied to the spinners value field */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   178
    Spinner.INPUT_CLASS = Y.ClassNameManager.getClassName(Spinner.NAME, "value");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   179
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   180
    /* Static constants used to define the markup templates used to create Spinner DOM elements */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   181
    Spinner.INPUT_TEMPLATE = '<input type="text" class="' + Spinner.INPUT_CLASS + '">';
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   182
    Spinner.BTN_TEMPLATE = '<button type="button"></button>';
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   183
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   184
    /* 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   185
     * The HTML_PARSER static constant is used by the Widget base class to populate 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   186
     * the configuration for the spinner instance from markup already on the page.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   187
     *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   188
     * The Spinner class attempts to set the value of the spinner widget if it
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   189
     * finds the appropriate input element on the page.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   190
     */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   191
    Spinner.HTML_PARSER = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   192
        value: function (srcNode) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   193
            var val = parseInt(srcNode.get("value")); 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   194
            return Y.Lang.isNumber(val) ? val : null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   195
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   196
    };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   197
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   198
    /* Spinner extends the base Widget class */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   199
    Y.extend(Spinner, Widget, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   200
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   201
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   202
         * initializer is part of the lifecycle introduced by 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   203
         * the Widget class. It is invoked during construction,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   204
         * and can be used to setup instance specific state.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   205
         * 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   206
         * The Spinner class does not need to perform anything
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   207
         * specific in this method, but it is left in as an example.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   208
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   209
        initializer: function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   210
            // Not doing anything special during initialization
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   211
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   212
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   213
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   214
         * destructor is part of the lifecycle introduced by 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   215
         * the Widget class. It is invoked during destruction,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   216
         * and can be used to cleanup instance specific state.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   217
         * 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   218
         * The spinner cleans up any node references it's holding
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   219
         * onto. The Widget classes destructor will purge the 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   220
         * widget's bounding box of event listeners, so spinner 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   221
         * only needs to clean up listeners it attaches outside of 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   222
         * the bounding box.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   223
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   224
        destructor : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   225
            this._documentMouseUpHandle.detach();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   226
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   227
            this.inputNode = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   228
            this.incrementNode = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   229
            this.decrementNode = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   230
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   231
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   232
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   233
         * renderUI is part of the lifecycle introduced by the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   234
         * Widget class. Widget's renderer method invokes:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   235
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   236
         *     renderUI()
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   237
         *     bindUI()
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   238
         *     syncUI()
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   239
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   240
         * renderUI is intended to be used by the Widget subclass
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   241
         * to create or insert new elements into the DOM. 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   242
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   243
         * For spinner the method adds the input (if it's not already 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   244
         * present in the markup), and creates the inc/dec buttons
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   245
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   246
        renderUI : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   247
            this._renderInput();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   248
            this._renderButtons();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   249
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   250
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   251
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   252
         * bindUI is intended to be used by the Widget subclass 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   253
         * to bind any event listeners which will drive the Widget UI.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   254
         * 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   255
         * It will generally bind event listeners for attribute change
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   256
         * events, to update the state of the rendered UI in response 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   257
         * to attribute value changes, and also attach any DOM events,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   258
         * to activate the UI.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   259
         * 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   260
         * For spinner, the method:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   261
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   262
         * - Sets up the attribute change listener for the "value" attribute
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   263
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   264
         * - Binds key listeners for the arrow/page keys
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   265
         * - Binds mouseup/down listeners on the boundingBox, document respectively.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   266
         * - Binds a simple change listener on the input box.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   267
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   268
        bindUI : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   269
            this.after("valueChange", this._afterValueChange);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   270
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   271
            var boundingBox = this.get("boundingBox");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   272
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   273
            // Looking for a key event which will fire continuously across browsers while the key is held down. 38, 40 = arrow up/down, 33, 34 = page up/down
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   274
            var keyEventSpec = (!Y.UA.opera) ? "down:" : "press:";
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   275
            keyEventSpec += "38, 40, 33, 34";
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   276
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   277
            Y.on("key", Y.bind(this._onDirectionKey, this), boundingBox, keyEventSpec);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   278
            Y.on("mousedown", Y.bind(this._onMouseDown, this), boundingBox);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   279
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   280
            this._documentMouseUpHandle = Y.on("mouseup", Y.bind(this._onDocMouseUp, this), boundingBox.get("ownerDocument"));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   281
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   282
            Y.on("change", Y.bind(this._onInputChange, this), this.inputNode);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   283
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   284
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   285
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   286
         * syncUI is intended to be used by the Widget subclass to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   287
         * update the UI to reflect the current state of the widget.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   288
         * 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   289
         * For spinner, the method sets the value of the input field,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   290
         * to match the current state of the value attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   291
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   292
        syncUI : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   293
            this._uiSetValue(this.get("value"));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   294
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   295
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   296
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   297
         * Creates the input control for the spinner and adds it to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   298
         * the widget's content box, if not already in the markup.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   299
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   300
        _renderInput : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   301
            var contentBox = this.get("contentBox"),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   302
                input = contentBox.one("." + Spinner.INPUT_CLASS),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   303
                strings = this.get("strings");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   304
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   305
            if (!input) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   306
                input = Node.create(Spinner.INPUT_TEMPLATE);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   307
                contentBox.appendChild(input);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   308
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   309
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   310
            input.set("title", strings.tooltip);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   311
            this.inputNode = input;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   312
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   313
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   314
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   315
         * Creates the button controls for the spinner and add them to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   316
         * the widget's content box, if not already in the markup.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   317
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   318
        _renderButtons : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   319
            var contentBox = this.get("contentBox"),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   320
                strings = this.get("strings");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   321
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   322
            var inc = this._createButton(strings.increment, this.getClassName("increment"));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   323
            var dec = this._createButton(strings.decrement, this.getClassName("decrement"));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   324
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   325
            this.incrementNode = contentBox.appendChild(inc);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   326
            this.decrementNode = contentBox.appendChild(dec);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   327
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   328
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   329
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   330
         * Utility method, to create a spinner button
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   331
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   332
        _createButton : function(text, className) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   333
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   334
            var btn = Y.Node.create(Spinner.BTN_TEMPLATE);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   335
            btn.set("innerHTML", text);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   336
            btn.set("title", text);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   337
            btn.addClass(className);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   338
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   339
            return btn;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   340
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   341
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   342
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   343
         * Bounding box mouse down handler. Will determine if the mouse down
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   344
         * is on one of the spinner buttons, and increment/decrement the value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   345
         * accordingly.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   346
         * 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   347
         * The method also sets up a timer, to support the user holding the mouse
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   348
         * down on the spinner buttons. The timer is cleared when a mouse up event
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   349
         * is detected.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   350
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   351
        _onMouseDown : function(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   352
            var node = e.target,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   353
                dir,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   354
                handled = false,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   355
                currVal = this.get("value"),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   356
                minorStep = this.get("minorStep");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   357
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   358
            if (node.hasClass(this.getClassName("increment"))) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   359
                this.set("value", currVal + minorStep);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   360
                dir = 1;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   361
                handled = true;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   362
            } else if (node.hasClass(this.getClassName("decrement"))) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   363
                this.set("value", currVal - minorStep);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   364
                dir = -1;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   365
                handled = true;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   366
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   367
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   368
            if (handled) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   369
                this._setMouseDownTimers(dir, minorStep);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   370
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   371
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   372
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   373
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   374
         * Override the default content box value, since we don't want the srcNode
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   375
         * to be the content box for spinner.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   376
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   377
        _defaultCB : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   378
            return null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   379
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   380
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   381
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   382
         * Document mouse up handler. Clears the timers supporting
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   383
         * the "mouse held down" behavior.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   384
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   385
        _onDocMouseUp : function(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   386
            this._clearMouseDownTimers();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   387
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   388
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   389
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   390
         * Bounding box Arrow up/down, Page up/down key listener.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   391
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   392
         * Increments/Decrement the spinner value, based on the key pressed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   393
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   394
        _onDirectionKey : function(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   395
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   396
            e.preventDefault();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   397
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   398
            var currVal = this.get("value"),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   399
                newVal = currVal,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   400
                minorStep = this.get("minorStep"),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   401
                majorStep = this.get("majorStep");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   402
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   403
            switch (e.charCode) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   404
                case 38:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   405
                    newVal += minorStep;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   406
                    break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   407
                case 40:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   408
                    newVal -= minorStep;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   409
                    break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   410
                case 33:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   411
                    newVal += majorStep;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   412
                    newVal = Math.min(newVal, this.get("max"));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   413
                    break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   414
                case 34:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   415
                    newVal -= majorStep;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   416
                    newVal = Math.max(newVal, this.get("min"));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   417
                    break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   418
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   419
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   420
            if (newVal !== currVal) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   421
                this.set("value", newVal);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   422
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   423
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   424
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   425
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   426
         * Simple change handler, to make sure user does not input an invalid value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   427
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   428
        _onInputChange : function(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   429
            if (!this._validateValue(this.inputNode.get("value"))) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   430
                this.syncUI();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   431
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   432
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   433
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   434
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   435
         * Initiates mouse down timers, to increment slider, while mouse button
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   436
         * is held down
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   437
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   438
        _setMouseDownTimers : function(dir, step) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   439
            this._mouseDownTimer = Y.later(500, this, function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   440
                this._mousePressTimer = Y.later(100, this, function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   441
                    this.set("value", this.get("value") + (dir * step));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   442
                }, null, true)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   443
            });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   444
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   445
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   446
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   447
         * Clears timers used to support the "mouse held down" behavior
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   448
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   449
        _clearMouseDownTimers : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   450
            if (this._mouseDownTimer) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   451
                this._mouseDownTimer.cancel();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   452
                this._mouseDownTimer = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   453
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   454
            if (this._mousePressTimer) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   455
                this._mousePressTimer.cancel();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   456
                this._mousePressTimer = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   457
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   458
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   459
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   460
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   461
         * value attribute change listener. Updates the 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   462
         * value in the rendered input box, whenever the 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   463
         * attribute value changes.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   464
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   465
        _afterValueChange : function(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   466
            this._uiSetValue(e.newVal);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   467
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   468
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   469
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   470
         * Updates the value of the input box to reflect 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   471
         * the value passed in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   472
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   473
        _uiSetValue : function(val) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   474
            this.inputNode.set("value", val);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   475
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   476
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   477
        /*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   478
         * value attribute default validator. Verifies that
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   479
         * the value being set lies between the min/max value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   480
         */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   481
        _validateValue: function(val) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   482
            var min = this.get("min"),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   483
                max = this.get("max");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   484
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   485
            return (Lang.isNumber(val) && val >= min && val <= max);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   486
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   487
    });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   488
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   489
    // Create a new Spinner instance, drawing it's 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   490
    // starting value from an input field already on the 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   491
    // page (the #numberField text box)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   492
    var spinner = new Spinner({
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   493
        srcNode: "#numberField",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   494
        max:100,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   495
        min:0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   496
    });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   497
    spinner.render();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   498
    spinner.focus();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   499
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   500
</script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   501
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   502
</div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   503
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   504
<h2>Extending The <code>Widget</code> Class</h2>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   505
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   506
<h3>Basic Class Structure</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   507
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   508
<p>Widgets classes follow the general pattern implemented by the <code>Spinner</code> class, shown in the code snippet below. The basic pattern for setting up a new widget class involves:</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   509
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   510
<ol>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   511
    <li>Defining the constructor function for the new widget class, which invokes the superclass constructor to kick off the initialization chain <em>(line 2)</em></li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   512
    <li>Defining the static <code>NAME</code> property for the class, which is normally the class name in camel case, and is used to prefix events and CSS classes fired/created by the class <em>(line 11)</em></li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   513
    <li>Defining the static <code>ATTRS</code> property for the class, which defines the set of attributes which the class will introduce, in addition to the superclass attributes <em>(line 18-57)</em></li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   514
    <li>Extending the <code>Widget</code> class, and adding/overriding any prototype properties/methods <em>(line 61)</em></li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   515
</ol>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   516
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   517
<pre class="code prettyprint">&#x2F;* Spinner class constructor *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   518
function Spinner(config) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   519
    Spinner.superclass.constructor.apply(this, arguments);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   520
}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   521
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   522
&#x2F;* 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   523
 * Required NAME static field, to identify the Widget class and 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   524
 * used as an event prefix, to generate class names etc. (set to the 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   525
 * class name in camel case). 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   526
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   527
Spinner.NAME = &quot;spinner&quot;;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   528
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   529
&#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   530
 * The attribute configuration for the Spinner widget. Attributes can be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   531
 * defined with default values, get&#x2F;set functions and validator functions
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   532
 * as with any other class extending Base.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   533
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   534
Spinner.ATTRS = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   535
    &#x2F;&#x2F; The minimum value for the spinner.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   536
    min : {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   537
        value:0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   538
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   539
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   540
    &#x2F;&#x2F; The maximum value for the spinner.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   541
    max : {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   542
        value:100
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   543
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   544
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   545
    &#x2F;&#x2F; The current value of the spinner.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   546
    value : {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   547
        value:0,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   548
        validator: function(val) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   549
            return this._validateValue(val);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   550
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   551
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   552
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   553
    &#x2F;&#x2F; Amount to increment&#x2F;decrement the spinner when the buttons, 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   554
    &#x2F;&#x2F; or arrow up&#x2F;down keys are pressed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   555
    minorStep : {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   556
        value:1
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   557
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   558
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   559
    &#x2F;&#x2F; Amount to increment&#x2F;decrement the spinner when the page up&#x2F;down keys are pressed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   560
    majorStep : {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   561
        value:10
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   562
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   563
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   564
    &#x2F;&#x2F; The localizable strings for the spinner. This attribute is 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   565
    &#x2F;&#x2F; defined by the base Widget class but has an empty value. The
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   566
    &#x2F;&#x2F; spinner is simply providing a default value for the attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   567
    strings: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   568
        value: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   569
            tooltip: &quot;Press the arrow up&#x2F;down keys for minor increments, \ 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   570
                      page up&#x2F;down for major increments.&quot;,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   571
            increment: &quot;Increment&quot;,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   572
            decrement: &quot;Decrement&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   573
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   574
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   575
};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   576
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   577
Y.extend(Spinner, Widget, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   578
    &#x2F;&#x2F; Methods&#x2F;properties to add to the prototype of the new class
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   579
    ...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   580
});</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   581
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   582
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   583
<p>Note that these steps are the same for any class which is derived from <a href="../base/index.html"><code>Base</code></a>, nothing Widget-specific is involved yet. 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   584
Widget adds the concept of a rendered UI to the existing Base lifecycle (viz. init, destroy and attribute state configuration), which we'll see show up in Widget-specific areas below.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   585
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   586
<h4>A Note On Externalizing Strings and Internationalization</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   587
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   588
<p>For the scope of this example we won't get into packaging your custom widget code as a YUI module, but when you do, you can leverage the <a href="../intl/index.html">Internationalization</a> infrastructure 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   589
to bundle the strings for your widget separately from the code, and avoid hard-coding them into the widget's code base as we're doing above.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   590
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   591
<p>When packaged separately from the code, the <code>strings</code> attribute can be changed to be:</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   592
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   593
<pre class="code prettyprint">Spinner.ATTRS = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   594
    ...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   595
    strings : {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   596
        valueFn : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   597
            return Y.Intl.get(&quot;myspinner&quot;); &#x2F;&#x2F; Assuming &quot;myspinner&quot; is the name of your widget&#x27;s module. 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   598
        }        
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   599
    } 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   600
    ...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   601
}</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   602
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   603
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   604
<p>Loader will deliver the language specific bundle for your widget along with the code when someone uses your <code>myspinner</code> module. The language specific strings can be retrieved through the <code>Y.Intl.get(modulename)</code> call.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   605
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   606
<p>The <a href="../intl/intl-basic.html">Language Resource Bundles</a> example goes into more detail about the structure of the langauge bundles, how they are built and how to configure your YUI instance to deliver them. <a href="https://github.com/yui/yui3/tree/master/build/calendar-base">Calendar's source code</a> is also a good example of how this infrastructure is used.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   607
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   608
<h3>The HTML_PARSER Property</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   609
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   610
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   611
The first Widget-specific property <code>Spinner</code> implements is the static <a href="http://yuilibrary.com/yui/docs/api/Widget.html#property_Widget.HTML_PARSER"><code>HTML_PARSER</code></a> property. It is used to set the initial widget configuration based on markup, providing basic progressive enhancement support.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   612
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   613
<p> 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   614
The value of the <code>HTML_PARSER</code> property is an object literal, where each property is a widget attribute name, and the value is either a selector string (if the attribute is a node reference) or a function which is executed to provide 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   615
a value for the attribute from the markup on the page. Markup is essentially thought of as an additional data source for the user to set initial attribute values, outside of the configuration object passed to the constructor 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   616
<em>(values passed to the constructor will take precedence over values picked up from markup)</em>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   617
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   618
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   619
<p>For <code>Spinner</code>, <code>HTML_PARSER</code> defines a function for the <code>value</code> attribute, which sets the initial value of the spinner based on an input field if present in the markup.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   620
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   621
<pre class="code prettyprint">&#x2F;* 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   622
 * The HTML_PARSER static constant is used by the Widget base class to populate 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   623
 * the configuration for the spinner instance from markup already on the page.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   624
 *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   625
 * The Spinner class attempts to set the value of the spinner widget if it
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   626
 * finds the appropriate input element on the page.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   627
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   628
Spinner.HTML_PARSER = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   629
    value: function (contentBox) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   630
        var node = contentBox.one(&quot;.&quot; + Spinner.INPUT_CLASS);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   631
        return (node) ? parseInt(node.get(&quot;value&quot;)) : null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   632
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   633
};</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   634
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   635
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   636
<h3>Lifecycle Methods: initializer, destructor</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   637
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   638
<p>The <code>initializer</code> and <code>destructor</code> lifecycle methods are carried over from <code>Base</code>, and can be used to set up initial state during construction, and clean up state during destruction respectively.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   639
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   640
<p>For <code>Spinner</code>, there is nothing special we need to do in the <code>initializer</code> (attribute setup is already taken care of), but it's left in the example to round out the lifecycle discussion.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   641
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   642
<p>The <code>destructor</code> takes care of detaching any event listeners <code>Spinner</code> adds outside of the bounding box (event listeners on/inside the bounding box are purged by <code>Widget</code>'s <code>destructor</code>).</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   643
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   644
<pre class="code prettyprint">&#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   645
 * initializer is part of the lifecycle introduced by 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   646
 * the Widget class. It is invoked during construction,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   647
 * and can be used to set up instance specific state.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   648
 *  
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   649
 * The Spinner class does not need to perform anything
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   650
 * specific in this method, but it is left in as an example.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   651
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   652
initializer: function(config) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   653
    &#x2F;&#x2F; Not doing anything special during initialization
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   654
},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   655
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   656
&#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   657
 * destructor is part of the lifecycle introduced by 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   658
 * the Widget class. It is invoked during destruction,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   659
 * and can be used to clean up instance specific state.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   660
 * 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   661
 * The spinner cleans up any node references it&#x27;s holding
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   662
 * onto. The Widget classes destructor will purge the 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   663
 * widget&#x27;s bounding box of event listeners, so spinner 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   664
 * only needs to clean up listeners it attaches outside of 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   665
 * the bounding box.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   666
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   667
destructor : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   668
    this._documentMouseUpHandle.detach();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   669
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   670
    this.inputNode = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   671
    this.incrementNode = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   672
    this.decrementNode = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   673
}</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   674
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   675
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   676
<h3>Rendering Lifecycle Methods: renderer, renderUI, bindUI, syncUI</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   677
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   678
<p>Widget adds a <code>render</code> method to the <code>init</code> and <code>destroy</code> lifecycle methods provided by Base. The <code>init</code> and <code>destroy</code> methods invoke the corresponding <code>initializer</code> and <code>destructor</code> implementations for the widget. Similarly, the <code>render</code> method invokes the <code>renderer</code> implementation for the widget. Note that the <code>renderer</code> method is not chained automatically, unlike the <code>initializer</code> and <code>destructor</code> methods.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   679
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   680
<p>The <code>Widget</code> class already provides a default <code>renderer</code> implementation, which invokes the following abstract methods in the order shown <em>(with their respective responsibilities)</em>:</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   681
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   682
<ol>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   683
    <li><code>renderUI()</code> : responsible for creating/adding elements to the DOM to render the widget.</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   684
    <li><code>bindUI()</code> : responsible for binding event listeners (both attribute change and DOM event listeners) to 'activate' the rendered UI.</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   685
    <li><code>syncUI()</code> : responsible for updating the rendered UI based on the current state of the widget.</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   686
</ol>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   687
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   688
<p>Since the <code>Spinner</code> class has no need to modify the <code>Widget</code> <code>renderer</code> implementation, it simply implements the above 3 methods to handle the render phase:</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   689
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   690
<pre class="code prettyprint">&#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   691
 * For spinner the method adds the input (if it&#x27;s not already 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   692
 * present in the markup), and creates the increment&#x2F;decrement buttons
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   693
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   694
renderUI : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   695
    this._renderInput();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   696
    this._renderButtons();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   697
},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   698
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   699
&#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   700
 * For spinner, the method:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   701
 *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   702
 * - Sets up the attribute change listener for the &quot;value&quot; attribute
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   703
 *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   704
 * - Binds key listeners for the arrow&#x2F;page keys
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   705
 * - Binds mouseup&#x2F;down listeners on the boundingBox, document respectively.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   706
 * - Binds a simple change listener on the input box.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   707
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   708
bindUI : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   709
    this.after(&quot;valueChange&quot;, this._afterValueChange);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   710
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   711
    var boundingBox = this.get(&quot;boundingBox&quot;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   712
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   713
    &#x2F;&#x2F; Looking for a key event which will fire continuously across browsers 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   714
    &#x2F;&#x2F; while the key is held down. 38, 40 = arrow up&#x2F;down, 33, 34 = page up&#x2F;down
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   715
    var keyEventSpec = (!Y.UA.opera) ? &quot;down:&quot; : &quot;press:&quot;;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   716
    keyEventSpec += &quot;38, 40, 33, 34&quot;;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   717
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   718
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   719
    Y.on(&quot;change&quot;, Y.bind(this._onInputChange, this), this.inputNode);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   720
    Y.on(&quot;key&quot;, Y.bind(this._onDirectionKey, this), boundingBox, keyEventSpec);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   721
    Y.on(&quot;mousedown&quot;, Y.bind(this._onMouseDown, this), boundingBox);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   722
    this._documentMouseUpHandle = Y.on(&quot;mouseup&quot;, Y.bind(this._onDocMouseUp, this), 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   723
                boundingBox.get(&quot;ownerDocument&quot;));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   724
},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   725
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   726
&#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   727
 * For spinner, the method sets the value of the input field,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   728
 * to match the current state of the value attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   729
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   730
syncUI : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   731
    this._uiSetValue(this.get(&quot;value&quot;));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   732
}</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   733
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   734
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   735
<h4>A Note On Key Event Listeners</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   736
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   737
<p>The <code>Spinner</code> uses Event's <code>&quot;key&quot;</code> support, to set up a listener for arrow up/down and page up/down keys on the spinner's bounding box (line 31).</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   738
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   739
<p>Event's <code>&quot;key&quot;</code> support allows <code>Spinner</code> to define a single listener, which is only invoked for the key specification provided. The key specification in the above use case is <code>&quot;down:38, 40, 33, 34&quot;</code> for most browsers, indicating that 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   740
the <code>_onDirectionKey</code> method should only be called if the bounding box receives a keydown event with a character code which is either 38, 40, 33 or 34. <code>&quot;key&quot;</code> specifications can also contain more <a href="http://yuilibrary.com/yui/docs/api/YUI.html#event_key">advanced filter criteria</a>, involving modifiers such as CTRL and SHIFT.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   741
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   742
<p>For the Spinner widget, we're looking for a key event which fires repeatedly while the key is held down. This differs for Opera, so we need to fork for the key event we're interested in. Future versions of <code>&quot;key&quot;</code> support will aim to provide this type of higher level cross-browser abstraction also.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   743
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   744
<h3>Attribute Supporting Methods</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   745
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   746
<p>Since all widgets are attribute-driven, they all follow a pretty similar pattern when it comes to how those attributes are used. For a given attribute, widgets will generally have:</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   747
<ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   748
    <li>A prototype method to listen for changes in the attribute</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   749
    <li>A prototype method to update the state of the rendered UI, to reflect the value of an attribute.</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   750
    <li>A prototype method used to set/get/validate the attribute.</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   751
</ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   752
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   753
<p>These methods are kept on the prototype to facilitate customization at any of the levels - event handling, ui updates, set/get/validation logic.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   754
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   755
<p>For <code>Spinner</code>, these corresponding methods for the <code>value</code> attribute are: <code>_afterValueChange</code>, <code>_uiSetValue</code> and <code>_validateValue</code>:</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   756
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   757
<pre class="code prettyprint">&#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   758
 * value attribute change listener. Updates the 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   759
 * value in the rendered input box, whenever the 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   760
 * attribute value changes.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   761
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   762
_afterValueChange : function(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   763
    this._uiSetValue(e.newVal);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   764
},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   765
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   766
&#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   767
 * Updates the value of the input box to reflect 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   768
 * the value passed in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   769
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   770
_uiSetValue : function(val) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   771
    this.inputNode.set(&quot;value&quot;, val);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   772
},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   773
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   774
&#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   775
 * value attribute default validator. Verifies that
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   776
 * the value being set lies between the min&#x2F;max value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   777
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   778
_validateValue: function(val) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   779
    var min = this.get(&quot;min&quot;),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   780
        max = this.get(&quot;max&quot;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   781
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   782
    return (Lang.isNumber(val) &amp;&amp; val &gt;= min &amp;&amp; val &lt;= max);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   783
}</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   784
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   785
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   786
<p>Since this example focuses on general patterns for widget development, validator/set/get functions are not defined for attributes such as min/max in the interests of keeping the example simple, but could be, in a production ready spinner.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   787
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   788
<h3>Rendering Support Methods</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   789
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   790
<p><code>Spinner</code>'s <code>renderUI</code> method hands off creation of the input field and buttons to the following helpers which use markup templates to generate node instances:</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   791
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   792
<pre class="code prettyprint">&#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   793
 * Creates the input field for the spinner and adds it to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   794
 * the widget&#x27;s content box, if not already in the markup.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   795
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   796
_renderInput : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   797
    var contentBox = this.get(&quot;contentBox&quot;),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   798
        input = contentBox.one(&quot;.&quot; + Spinner.INPUT_CLASS),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   799
        strings = this.get(&quot;strings&quot;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   800
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   801
    if (!input) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   802
        input = Node.create(Spinner.INPUT_TEMPLATE);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   803
        contentBox.appendChild(input);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   804
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   805
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   806
    input.set(&quot;title&quot;, strings.tooltip);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   807
    this.inputNode = input;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   808
},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   809
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   810
&#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   811
 * Creates the button controls for the spinner and adds them to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   812
 * the widget&#x27;s content box, if not already in the markup.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   813
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   814
_renderButtons : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   815
    var contentBox = this.get(&quot;contentBox&quot;),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   816
        strings = this.get(&quot;strings&quot;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   817
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   818
    var inc = this._createButton(strings.increment, this.getClassName(&quot;increment&quot;));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   819
    var dec = this._createButton(strings.decrement, this.getClassName(&quot;decrement&quot;));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   820
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   821
    this.incrementNode = contentBox.appendChild(inc);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   822
    this.decrementNode = contentBox.appendChild(dec);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   823
},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   824
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   825
&#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   826
 * Utility method, to create a spinner button
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   827
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   828
_createButton : function(text, className) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   829
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   830
    var btn = Y.Node.create(Spinner.BTN_TEMPLATE);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   831
    btn.set(&quot;innerHTML&quot;, text);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   832
    btn.set(&quot;title&quot;, text);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   833
    btn.addClass(className);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   834
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   835
    return btn;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   836
}</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   837
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   838
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   839
<h3>DOM Event Listeners</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   840
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   841
<p>The DOM event listeners attached during <code>bindUI</code> are straightforward event listeners, which receive the event facade for the DOM event, and update the spinner state accordingly.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   842
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   843
<p>A couple of interesting points worth noting: In the <code>&quot;key&quot;</code> listener we set up, we can call <code>e.preventDefault()</code> without having to check the character code, since the <code>&quot;key&quot;</code> event specifier will only invoke the listener 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   844
if one of the specified keys is pressed (arrow/page up/down)</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   845
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   846
<p>Also, to allow the spinner to update its value while the mouse button is held down, we set up a timer, which gets cleared out when we receive a mouseup event on the document.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   847
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   848
<pre class="code prettyprint">&#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   849
 * Bounding box Arrow up&#x2F;down, Page up&#x2F;down key listener.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   850
 *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   851
 * Increments&#x2F;Decrements the spinner value, based on the key pressed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   852
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   853
_onDirectionKey : function(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   854
    e.preventDefault();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   855
    ...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   856
    switch (e.charCode) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   857
        case 38:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   858
            newVal += minorStep;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   859
            break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   860
        case 40:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   861
            newVal -= minorStep;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   862
            break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   863
        case 33:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   864
            newVal += majorStep;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   865
            newVal = Math.min(newVal, this.get(&quot;max&quot;));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   866
            break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   867
        case 34:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   868
            newVal -= majorStep;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   869
            newVal = Math.max(newVal, this.get(&quot;min&quot;));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   870
            break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   871
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   872
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   873
    if (newVal !== currVal) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   874
        this.set(&quot;value&quot;, newVal);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   875
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   876
},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   877
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   878
&#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   879
 * Bounding box mouse down handler. Will determine if the mouse down
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   880
 * is on one of the spinner buttons, and increment&#x2F;decrement the value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   881
 * accordingly.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   882
 * 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   883
 * The method also sets up a timer, to support the user holding the mouse
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   884
 * down on the spinner buttons. The timer is cleared when a mouse up event
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   885
 * is detected.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   886
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   887
_onMouseDown : function(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   888
    var node = e.target
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   889
    ...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   890
    if (node.hasClass(this.getClassName(&quot;increment&quot;))) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   891
        this.set(&quot;value&quot;, currVal + minorStep);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   892
        ...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   893
    } else if (node.hasClass(this.getClassName(&quot;decrement&quot;))) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   894
        this.set(&quot;value&quot;, currVal - minorStep);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   895
        ...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   896
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   897
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   898
    if (handled) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   899
        this._setMouseDownTimers(dir);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   900
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   901
},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   902
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   903
&#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   904
 * Document mouse up handler. Clears the timers supporting
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   905
 * the &quot;mouse held down&quot; behavior.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   906
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   907
_onDocMouseUp : function(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   908
    this._clearMouseDownTimers();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   909
},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   910
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   911
&#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   912
 * Simple change handler, to make sure user does not input an invalid value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   913
 *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   914
_onInputChange : function(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   915
    if (!this._validateValue(this.inputNode.get(&quot;value&quot;))) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   916
        &#x2F;&#x2F; If the entered value is not valid, re-display the stored value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   917
        this.syncUI();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   918
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   919
}</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   920
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   921
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   922
<h3>ClassName Support Methods</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   923
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   924
<p>A key part of developing widgets which work with the DOM is defining class names which it will use to mark the nodes it renders. These class names could be used to mark a node for later retrieval/lookup, for CSS application (both functional as well as cosmetic) or to indicate the current state of the widget.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   925
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   926
<p>The widget infrastructure uses the <code>ClassNameManager</code> utility, to generate consistently named classes to apply to the nodes it adds to the page:</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   927
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   928
<pre class="code prettyprint">Y.ClassNameManager.getClassName(Spinner.NAME, &quot;value&quot;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   929
...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   930
this.getClassName(&quot;increment&quot;);</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   931
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   932
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   933
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   934
Class names generated by the Widget's <code>getClassName</code> prototype method use the NAME field of the widget, to generate a prefixed classname through <code>ClassNameManager</code> - e.g. for spinner the <code>this.getClassName(&quot;increment&quot;)</code> above will generate the class name <code>yui3-spinner-increment</code> ("yui" being the system level prefix, "spinner" being the widget name).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   935
When you need to generate standard class names in static code (where you don't have a reference to <code>this.getClassName()</code>), you can use the ClassNameManager directly, as shown in line 1 above, to achieve the same results.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   936
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   937
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   938
<h3>CSS Considerations</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   939
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   940
<p>Since widget uses the <code>getClassName</code> method to generate state-related class names and to mark the bounding box/content box of the widget (e.g. "yui3-[widgetname]-content", "yui3-[widgetname]-hidden", "yui3-[widgetname]-disabled"), we need to provide the default CSS handling for states we're interested in handling for the new Spinner widget. The "yui3-[widgetname]-hidden" class is probably one state class, which all widgets will provide implementations for.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   941
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   942
<pre class="code prettyprint">&#x2F;* Progressive enhancement support, to hide the text box, if JavaScript is enabled, while we instantiate the rich control *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   943
.yui3-js-enabled .yui3-spinner-loading {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   944
    display:none;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   945
}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   946
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   947
&#x2F;* Controlling show&#x2F;hide state using display (since this control is inline-block) *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   948
.yui3-spinner-hidden {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   949
    display:none;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   950
}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   951
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   952
&#x2F;* Bounding Box - Set the bounding box to be &quot;inline block&quot; for spinner *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   953
.yui3-spinner {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   954
    display:inline-block;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   955
    zoom:1;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   956
    *display:inline;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   957
}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   958
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   959
&#x2F;* Content Box - Start adding visual treatment for the spinner *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   960
.yui3-spinner-content {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   961
    padding:1px;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   962
}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   963
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   964
&#x2F;* Input Text Box, generated through getClassName(&quot;value&quot;) *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   965
.yui3-spinner-value {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   966
    ...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   967
}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   968
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   969
&#x2F;* Button controls, generated through getClassName(&quot;increment&quot;) *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   970
.yui3-spinner-increment, .yui3-spinner-decrement {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   971
    ...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   972
}</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   973
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   974
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   975
<h3>Using The Spinner Widget</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   976
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   977
<p>For the example, we have an input field already on the page, which we'd like to enhance to create a Spinner instance. We mark it with a yui3-spinner-loading class, so that if JavaScript is enabled, we can hide it while we're instantiating the rich control:</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   978
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   979
<pre class="code prettyprint">&lt;input type=&quot;text&quot; id=&quot;numberField&quot; class=&quot;yui3-spinner-loading&quot; value=&quot;20&quot;&gt;</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   980
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   981
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   982
<p>We provide the constructor for the Spinner with the <code>srcNode</code> which contains the input field with our initial value. The <code>HTML_PARSER</code> code we saw earlier will extract the value from the input field, and use it as the initial value for the Spinner instance:</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   983
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   984
<pre class="code prettyprint">&#x2F;&#x2F; Create a new Spinner instance, drawing its 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   985
&#x2F;&#x2F; starting value from an input field already on the 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   986
&#x2F;&#x2F; page (the #numberField text input box)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   987
var spinner = new Spinner({
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   988
    srcNode: &quot;#numberField&quot;,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   989
    max:100,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   990
    min:0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   991
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   992
spinner.render();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   993
spinner.focus();</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   994
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   995
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   996
<p>The custom widget class structure discussed above is captured in this <a href="../assets/widget/mywidget.js.txt">"MyWidget" template file</a>, which you can use as a starting point to develop your own widgets.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   997
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   998
<h2>Complete Example Source</h2>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   999
<pre class="code prettyprint">&lt;div id=&quot;widget-extend-example&quot;&gt;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1000
    A basic spinner widget: &lt;input type=&quot;text&quot; id=&quot;numberField&quot; class=&quot;yui3-spinner-loading&quot; value=&quot;20&quot; &#x2F;&gt;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1001
    &lt;p class=&quot;hint&quot;&gt;Click the buttons, or the arrow up&#x2F;down and page up&#x2F;down keys on your keyboard to change the spinner&#x27;s value&lt;&#x2F;p&gt;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1002
&lt;&#x2F;div&gt;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1003
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1004
&lt;script type=&quot;text&#x2F;javascript&quot;&gt;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1005
YUI().use(&quot;event-key&quot;, &quot;widget&quot;, function(Y) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1006
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1007
    var Lang = Y.Lang,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1008
        Widget = Y.Widget,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1009
        Node = Y.Node;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1010
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1011
    &#x2F;* Spinner class constructor *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1012
    function Spinner(config) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1013
        Spinner.superclass.constructor.apply(this, arguments);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1014
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1015
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1016
    &#x2F;* 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1017
     * Required NAME static field, to identify the Widget class and 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1018
     * used as an event prefix, to generate class names etc. (set to the 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1019
     * class name in camel case). 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1020
     *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1021
    Spinner.NAME = &quot;spinner&quot;;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1022
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1023
    &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1024
     * The attribute configuration for the Spinner widget. Attributes can be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1025
     * defined with default values, get&#x2F;set functions and validator functions
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1026
     * as with any other class extending Base.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1027
     *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1028
    Spinner.ATTRS = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1029
        &#x2F;&#x2F; The minimum value for the spinner.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1030
        min : {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1031
            value:0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1032
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1033
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1034
        &#x2F;&#x2F; The maximum value for the spinner.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1035
        max : {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1036
            value:100
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1037
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1038
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1039
        &#x2F;&#x2F; The current value of the spinner.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1040
        value : {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1041
            value:0,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1042
            validator: function(val) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1043
                return this._validateValue(val);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1044
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1045
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1046
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1047
        &#x2F;&#x2F; Amount to increment&#x2F;decrement the spinner when the buttons or arrow up&#x2F;down keys are pressed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1048
        minorStep : {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1049
            value:1
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1050
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1051
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1052
        &#x2F;&#x2F; Amount to increment&#x2F;decrement the spinner when the page up&#x2F;down keys are pressed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1053
        majorStep : {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1054
            value:10
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1055
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1056
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1057
        &#x2F;&#x2F; override default (&quot;null&quot;), required for focus()
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1058
        tabIndex: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1059
            value: 0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1060
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1061
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1062
        &#x2F;&#x2F; The strings for the spinner UI. This attribute is 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1063
        &#x2F;&#x2F; defined by the base Widget class but has an empty value. The
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1064
        &#x2F;&#x2F; spinner is simply providing a default value for the attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1065
        strings: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1066
            value: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1067
                tooltip: &quot;Press the arrow up&#x2F;down keys for minor increments, page up&#x2F;down for major increments.&quot;,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1068
                increment: &quot;Increment&quot;,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1069
                decrement: &quot;Decrement&quot;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1070
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1071
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1072
    };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1073
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1074
    &#x2F;* Static constant used to identify the classname applied to the spinners value field *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1075
    Spinner.INPUT_CLASS = Y.ClassNameManager.getClassName(Spinner.NAME, &quot;value&quot;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1076
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1077
    &#x2F;* Static constants used to define the markup templates used to create Spinner DOM elements *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1078
    Spinner.INPUT_TEMPLATE = &#x27;&lt;input type=&quot;text&quot; class=&quot;&#x27; + Spinner.INPUT_CLASS + &#x27;&quot;&gt;&#x27;;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1079
    Spinner.BTN_TEMPLATE = &#x27;&lt;button type=&quot;button&quot;&gt;&lt;&#x2F;button&gt;&#x27;;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1080
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1081
    &#x2F;* 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1082
     * The HTML_PARSER static constant is used by the Widget base class to populate 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1083
     * the configuration for the spinner instance from markup already on the page.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1084
     *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1085
     * The Spinner class attempts to set the value of the spinner widget if it
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1086
     * finds the appropriate input element on the page.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1087
     *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1088
    Spinner.HTML_PARSER = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1089
        value: function (srcNode) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1090
            var val = parseInt(srcNode.get(&quot;value&quot;)); 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1091
            return Y.Lang.isNumber(val) ? val : null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1092
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1093
    };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1094
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1095
    &#x2F;* Spinner extends the base Widget class *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1096
    Y.extend(Spinner, Widget, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1097
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1098
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1099
         * initializer is part of the lifecycle introduced by 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1100
         * the Widget class. It is invoked during construction,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1101
         * and can be used to setup instance specific state.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1102
         * 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1103
         * The Spinner class does not need to perform anything
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1104
         * specific in this method, but it is left in as an example.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1105
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1106
        initializer: function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1107
            &#x2F;&#x2F; Not doing anything special during initialization
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1108
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1109
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1110
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1111
         * destructor is part of the lifecycle introduced by 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1112
         * the Widget class. It is invoked during destruction,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1113
         * and can be used to cleanup instance specific state.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1114
         * 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1115
         * The spinner cleans up any node references it&#x27;s holding
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1116
         * onto. The Widget classes destructor will purge the 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1117
         * widget&#x27;s bounding box of event listeners, so spinner 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1118
         * only needs to clean up listeners it attaches outside of 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1119
         * the bounding box.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1120
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1121
        destructor : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1122
            this._documentMouseUpHandle.detach();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1123
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1124
            this.inputNode = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1125
            this.incrementNode = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1126
            this.decrementNode = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1127
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1128
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1129
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1130
         * renderUI is part of the lifecycle introduced by the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1131
         * Widget class. Widget&#x27;s renderer method invokes:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1132
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1133
         *     renderUI()
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1134
         *     bindUI()
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1135
         *     syncUI()
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1136
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1137
         * renderUI is intended to be used by the Widget subclass
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1138
         * to create or insert new elements into the DOM. 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1139
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1140
         * For spinner the method adds the input (if it&#x27;s not already 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1141
         * present in the markup), and creates the inc&#x2F;dec buttons
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1142
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1143
        renderUI : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1144
            this._renderInput();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1145
            this._renderButtons();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1146
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1147
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1148
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1149
         * bindUI is intended to be used by the Widget subclass 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1150
         * to bind any event listeners which will drive the Widget UI.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1151
         * 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1152
         * It will generally bind event listeners for attribute change
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1153
         * events, to update the state of the rendered UI in response 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1154
         * to attribute value changes, and also attach any DOM events,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1155
         * to activate the UI.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1156
         * 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1157
         * For spinner, the method:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1158
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1159
         * - Sets up the attribute change listener for the &quot;value&quot; attribute
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1160
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1161
         * - Binds key listeners for the arrow&#x2F;page keys
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1162
         * - Binds mouseup&#x2F;down listeners on the boundingBox, document respectively.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1163
         * - Binds a simple change listener on the input box.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1164
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1165
        bindUI : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1166
            this.after(&quot;valueChange&quot;, this._afterValueChange);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1167
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1168
            var boundingBox = this.get(&quot;boundingBox&quot;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1169
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1170
            &#x2F;&#x2F; Looking for a key event which will fire continuously across browsers while the key is held down. 38, 40 = arrow up&#x2F;down, 33, 34 = page up&#x2F;down
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1171
            var keyEventSpec = (!Y.UA.opera) ? &quot;down:&quot; : &quot;press:&quot;;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1172
            keyEventSpec += &quot;38, 40, 33, 34&quot;;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1173
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1174
            Y.on(&quot;key&quot;, Y.bind(this._onDirectionKey, this), boundingBox, keyEventSpec);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1175
            Y.on(&quot;mousedown&quot;, Y.bind(this._onMouseDown, this), boundingBox);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1176
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1177
            this._documentMouseUpHandle = Y.on(&quot;mouseup&quot;, Y.bind(this._onDocMouseUp, this), boundingBox.get(&quot;ownerDocument&quot;));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1178
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1179
            Y.on(&quot;change&quot;, Y.bind(this._onInputChange, this), this.inputNode);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1180
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1181
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1182
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1183
         * syncUI is intended to be used by the Widget subclass to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1184
         * update the UI to reflect the current state of the widget.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1185
         * 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1186
         * For spinner, the method sets the value of the input field,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1187
         * to match the current state of the value attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1188
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1189
        syncUI : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1190
            this._uiSetValue(this.get(&quot;value&quot;));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1191
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1192
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1193
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1194
         * Creates the input control for the spinner and adds it to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1195
         * the widget&#x27;s content box, if not already in the markup.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1196
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1197
        _renderInput : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1198
            var contentBox = this.get(&quot;contentBox&quot;),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1199
                input = contentBox.one(&quot;.&quot; + Spinner.INPUT_CLASS),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1200
                strings = this.get(&quot;strings&quot;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1201
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1202
            if (!input) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1203
                input = Node.create(Spinner.INPUT_TEMPLATE);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1204
                contentBox.appendChild(input);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1205
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1206
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1207
            input.set(&quot;title&quot;, strings.tooltip);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1208
            this.inputNode = input;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1209
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1210
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1211
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1212
         * Creates the button controls for the spinner and add them to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1213
         * the widget&#x27;s content box, if not already in the markup.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1214
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1215
        _renderButtons : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1216
            var contentBox = this.get(&quot;contentBox&quot;),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1217
                strings = this.get(&quot;strings&quot;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1218
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1219
            var inc = this._createButton(strings.increment, this.getClassName(&quot;increment&quot;));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1220
            var dec = this._createButton(strings.decrement, this.getClassName(&quot;decrement&quot;));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1221
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1222
            this.incrementNode = contentBox.appendChild(inc);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1223
            this.decrementNode = contentBox.appendChild(dec);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1224
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1225
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1226
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1227
         * Utility method, to create a spinner button
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1228
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1229
        _createButton : function(text, className) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1230
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1231
            var btn = Y.Node.create(Spinner.BTN_TEMPLATE);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1232
            btn.set(&quot;innerHTML&quot;, text);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1233
            btn.set(&quot;title&quot;, text);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1234
            btn.addClass(className);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1235
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1236
            return btn;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1237
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1238
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1239
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1240
         * Bounding box mouse down handler. Will determine if the mouse down
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1241
         * is on one of the spinner buttons, and increment&#x2F;decrement the value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1242
         * accordingly.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1243
         * 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1244
         * The method also sets up a timer, to support the user holding the mouse
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1245
         * down on the spinner buttons. The timer is cleared when a mouse up event
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1246
         * is detected.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1247
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1248
        _onMouseDown : function(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1249
            var node = e.target,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1250
                dir,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1251
                handled = false,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1252
                currVal = this.get(&quot;value&quot;),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1253
                minorStep = this.get(&quot;minorStep&quot;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1254
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1255
            if (node.hasClass(this.getClassName(&quot;increment&quot;))) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1256
                this.set(&quot;value&quot;, currVal + minorStep);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1257
                dir = 1;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1258
                handled = true;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1259
            } else if (node.hasClass(this.getClassName(&quot;decrement&quot;))) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1260
                this.set(&quot;value&quot;, currVal - minorStep);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1261
                dir = -1;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1262
                handled = true;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1263
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1264
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1265
            if (handled) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1266
                this._setMouseDownTimers(dir, minorStep);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1267
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1268
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1269
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1270
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1271
         * Override the default content box value, since we don&#x27;t want the srcNode
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1272
         * to be the content box for spinner.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1273
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1274
        _defaultCB : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1275
            return null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1276
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1277
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1278
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1279
         * Document mouse up handler. Clears the timers supporting
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1280
         * the &quot;mouse held down&quot; behavior.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1281
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1282
        _onDocMouseUp : function(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1283
            this._clearMouseDownTimers();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1284
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1285
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1286
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1287
         * Bounding box Arrow up&#x2F;down, Page up&#x2F;down key listener.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1288
         *
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1289
         * Increments&#x2F;Decrement the spinner value, based on the key pressed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1290
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1291
        _onDirectionKey : function(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1292
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1293
            e.preventDefault();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1294
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1295
            var currVal = this.get(&quot;value&quot;),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1296
                newVal = currVal,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1297
                minorStep = this.get(&quot;minorStep&quot;),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1298
                majorStep = this.get(&quot;majorStep&quot;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1299
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1300
            switch (e.charCode) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1301
                case 38:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1302
                    newVal += minorStep;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1303
                    break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1304
                case 40:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1305
                    newVal -= minorStep;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1306
                    break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1307
                case 33:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1308
                    newVal += majorStep;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1309
                    newVal = Math.min(newVal, this.get(&quot;max&quot;));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1310
                    break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1311
                case 34:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1312
                    newVal -= majorStep;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1313
                    newVal = Math.max(newVal, this.get(&quot;min&quot;));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1314
                    break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1315
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1316
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1317
            if (newVal !== currVal) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1318
                this.set(&quot;value&quot;, newVal);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1319
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1320
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1321
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1322
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1323
         * Simple change handler, to make sure user does not input an invalid value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1324
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1325
        _onInputChange : function(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1326
            if (!this._validateValue(this.inputNode.get(&quot;value&quot;))) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1327
                this.syncUI();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1328
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1329
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1330
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1331
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1332
         * Initiates mouse down timers, to increment slider, while mouse button
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1333
         * is held down
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1334
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1335
        _setMouseDownTimers : function(dir, step) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1336
            this._mouseDownTimer = Y.later(500, this, function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1337
                this._mousePressTimer = Y.later(100, this, function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1338
                    this.set(&quot;value&quot;, this.get(&quot;value&quot;) + (dir * step));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1339
                }, null, true)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1340
            });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1341
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1342
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1343
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1344
         * Clears timers used to support the &quot;mouse held down&quot; behavior
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1345
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1346
        _clearMouseDownTimers : function() {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1347
            if (this._mouseDownTimer) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1348
                this._mouseDownTimer.cancel();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1349
                this._mouseDownTimer = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1350
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1351
            if (this._mousePressTimer) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1352
                this._mousePressTimer.cancel();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1353
                this._mousePressTimer = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1354
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1355
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1356
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1357
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1358
         * value attribute change listener. Updates the 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1359
         * value in the rendered input box, whenever the 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1360
         * attribute value changes.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1361
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1362
        _afterValueChange : function(e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1363
            this._uiSetValue(e.newVal);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1364
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1365
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1366
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1367
         * Updates the value of the input box to reflect 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1368
         * the value passed in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1369
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1370
        _uiSetValue : function(val) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1371
            this.inputNode.set(&quot;value&quot;, val);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1372
        },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1373
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1374
        &#x2F;*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1375
         * value attribute default validator. Verifies that
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1376
         * the value being set lies between the min&#x2F;max value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1377
         *&#x2F;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1378
        _validateValue: function(val) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1379
            var min = this.get(&quot;min&quot;),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1380
                max = this.get(&quot;max&quot;);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1381
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1382
            return (Lang.isNumber(val) &amp;&amp; val &gt;= min &amp;&amp; val &lt;= max);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1383
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1384
    });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1385
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1386
    &#x2F;&#x2F; Create a new Spinner instance, drawing it&#x27;s 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1387
    &#x2F;&#x2F; starting value from an input field already on the 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1388
    &#x2F;&#x2F; page (the #numberField text box)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1389
    var spinner = new Spinner({
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1390
        srcNode: &quot;#numberField&quot;,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1391
        max:100,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1392
        min:0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1393
    });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1394
    spinner.render();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1395
    spinner.focus();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1396
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1397
&lt;&#x2F;script&gt;</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1398
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1399
</div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1400
            </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1401
        </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1402
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1403
        <div class="yui3-u-1-4">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1404
            <div class="sidebar">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1405
                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1406
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1407
                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1408
                    <div class="sidebox">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1409
                        <div class="hd">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1410
                            <h2 class="no-toc">Examples</h2>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1411
                        </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1412
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1413
                        <div class="bd">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1414
                            <ul class="examples">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1415
                                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1416
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1417
                                        <li data-description="Shows how to extend the base widget class, to create your own Widgets.">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1418
                                            <a href="widget-extend.html">Extending the Base Widget Class</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1419
                                        </li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1420
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1421
                                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1422
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1423
                                        <li data-description="Shows how to use Base.create and mix/match extensions to create custom Widget classes.">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1424
                                            <a href="widget-build.html">Creating Custom Widget Classes With Extensions</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1425
                                        </li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1426
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1427
                                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1428
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1429
                                        <li data-description="Shows how to create an IO plugin for Widget.">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1430
                                            <a href="widget-plugin.html">Creating a Widget Plugin</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1431
                                        </li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1432
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1433
                                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1434
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1435
                                        <li data-description="Shows how to extend the Widget class, and add WidgetPosition and WidgetStack to create a Tooltip widget class.">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1436
                                            <a href="widget-tooltip.html">Creating a Simple Tooltip Widget With Extensions</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1437
                                        </li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1438
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1439
                                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1440
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1441
                                        <li data-description="Shows how to extend the Widget class, and add WidgetParent and WidgetChild to create a simple ListBox widget.">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1442
                                            <a href="widget-parentchild-listbox.html">Creating a Hierarchical ListBox Widget</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1443
                                        </li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1444
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1445
                                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1446
                            </ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1447
                        </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1448
                    </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1449
                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1450
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1451
                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1452
            </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1453
        </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1454
    </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1455
</div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1456
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1457
<script src="../assets/vendor/prettify/prettify-min.js"></script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1458
<script>prettyPrint();</script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1459
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1460
<script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1461
YUI.Env.Tests = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1462
    examples: [],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1463
    project: '../assets',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1464
    assets: '../assets/widget',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1465
    name: 'widget-extend',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1466
    title: 'Extending the Base Widget Class',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1467
    newWindow: '',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1468
    auto:  false 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1469
};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1470
YUI.Env.Tests.examples.push('widget-extend');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1471
YUI.Env.Tests.examples.push('widget-build');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1472
YUI.Env.Tests.examples.push('widget-plugin');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1473
YUI.Env.Tests.examples.push('widget-tooltip');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1474
YUI.Env.Tests.examples.push('widget-parentchild-listbox');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1475
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1476
</script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1477
<script src="../assets/yui/test-runner.js"></script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1478
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1479
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1480
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1481
</body>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1482
</html>