Support of attaching to basic events from JSON specification
authorSergey I. Sharybin <g.ulairi@gmail.com>
Sun, 28 Nov 2010 22:19:11 +0000 (03:19 +0500)
committerSergey I. Sharybin <g.ulairi@gmail.com>
Sun, 28 Nov 2010 22:19:11 +0000 (03:19 +0500)
src/ui/elem/UIViewport.js
src/ui/elem/UIWindow.js
src/ui/intern/UIAbstractList.js
src/ui/intern/UICreator.js
src/ui/intern/UIWidget.js
src/ui/widgets/UIButton.js
src/ui/widgets/UIComboBox.js
src/ui/widgets/UIEntry.js
src/ui/widgets/UISpinButton.js

index a0050e5..edcdb5e 100644 (file)
@@ -246,6 +246,8 @@ function UIViewport (opts)
 
   this.panels = [];
   this.items = [];
+
+  this.events = this.events.concat (['onItemEndMove']);
 }
 
 UIViewport.prototype = new _UIViewport;
index fd2ae9a..403ebf8 100644 (file)
@@ -534,6 +534,9 @@ function UIWindow (opts)
   this.abortClose   = false;
   this.isMaximized  = false;
   this.animateSpeed = 100;
+
+  this.events = this.events.concat (['onShow', 'onHide', 'onRaise', 'onClose', 'onCLosed',
+                                     'onResize', 'onMaximized', 'onRestored', 'onMimimized']);
 }
 
 UIWindow.prototype = new _UIWindow;
index bffcfff..ec35b0b 100644 (file)
@@ -150,6 +150,8 @@ function UIAbstractList (opts)
 
   /* Array of DOM nodes for all items */
   this.itemsDom = [];
+
+  this.events = this.events.concat (['onItemSelected', 'onItemClicked']);
 }
 
 UIAbstractList.prototype = new _UIAbstractList;
index 2f44bdb..593fff7 100644 (file)
@@ -47,6 +47,11 @@ function _UICreator ()
             }
         }
 
+      if (json['events'])
+        {
+          widget.attachEvents (json['events']);
+        }
+
       json._uiWidget = widget;
       return widget;
     };
index 3db9636..e4f2cea 100644 (file)
@@ -441,6 +441,46 @@ function _UIWidget ()
 
       return null;
     };
+
+  this.attachEvents = function (events)
+    {
+      for (var name in events)
+        {
+          var evt = events[name];
+          var handler = null;
+          var path = (evt['handler']).split ('.');
+
+          if (indexOf (this.events, name) < 0)
+            {
+              /* event is not allowed for attaching */
+              continue;
+            }
+
+          var cur = window;
+          for (var i = 0; i < path.length; ++i)
+            {
+              if (cur[path[i]])
+                {
+                  cur = cur[path[i]];
+                }
+              else
+                {
+                  cur = null;
+                }
+            }
+          handler = cur != window ? cur : null;
+
+         if (!handler)
+           {
+             continue;
+           }
+
+          this[name] = function (widget, userData) { return function () {
+                  handler (widget, userData, arguments);
+                }
+              } (this, evt.userData);
+        }
+    };
 }
 
 /***
@@ -484,6 +524,14 @@ function UIWidget (opts)
 
   /* Should widget fill whole parent's client area? */
   this.fill   = defVal (opts['fill'], false);
+
+  /* events avaliable for attaching */
+  this.onParentChanged = function () {};
+  this.onVisibleChanged = function () {};
+  this.onSensitiveChanged = function () {};
+  this.onFocus = function () {};
+
+  this.events = ['onParentChanged', 'onVisibleChanged', 'onSensitiveChanged', 'onFocus'];
 }
 
 UIWidget.prototype = new _UIWidget;
index 4878b49..c7e7c9b 100644 (file)
@@ -179,6 +179,9 @@ function UIButton (opts)
   this.imageElement = null; /* DOM element for image */
 
   this.insensitiveClassName = 'UIButtonInsensitive';
+
+  /* events avaliable for attaching */
+  this.events = this.events.concat (['onClick', 'onPress', 'OnRelease']);
 }
 
 UIButton.prototype = new _UIButton;
index 3bacf75..28a9996 100644 (file)
@@ -446,6 +446,8 @@ function UIComboBox (opts)
   this.hideListOnMouseout = defVal (opts['hideListOnMouseout'], true);
 
   this.insensitiveClassName = 'UIComboBoxInsensitive';
+
+  this.events = this.events.concat (['onItemSelected', 'onItemClicked']);
 }
 
 UIComboBox.prototype = new _UIComboBox;
index bc2e482..9ef620c 100644 (file)
@@ -277,6 +277,8 @@ function UIEntry (opts)
   /* Text, displayed in entry when it's empty */
   this.shadowText = isUnknown (opts['shadowText']) ? '' : opts['shadowText'];
   this.shadowElement = null;
+
+  this.events = this.events.concat (['onChanged']);
 }
 
 UIEntry.prototype = new _UIEntry;
index 2c361d4..40ad355 100644 (file)
@@ -328,6 +328,8 @@ function UISpinButton (opts)
 
   /* Maximum value */
   this.max = defVal (opts['max'], 100);
+
+  this.events = this.events.concat (['onValueChanged']);
 }
 
 UISpinButton.FIRST_AFFECT_TIME = 700;