[Laszlo-checkins] r10662 - in openlaszlo/trunk/WEB-INF/lps/lfc: kernel/dhtml kernel/swf kernel/swf9 services

bargull@openlaszlo.org bargull at openlaszlo.org
Tue Aug 12 09:15:12 PDT 2008


Author: bargull
Date: 2008-08-12 09:15:05 -0700 (Tue, 12 Aug 2008)
New Revision: 10662

Modified:
   openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzContextMenuKernel.lzs
   openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js
   openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzContextMenuKernel.lzs
   openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzContextMenuKernel.lzs
   openlaszlo/trunk/WEB-INF/lps/lfc/services/LzContextMenu.lzs
Log:
Change 20080805-bargull-iDO by bargull at dell--p4--2-53 on 2008-08-05 00:12:17
    in /home/Admin/src/svn/openlaszlo/trunk
    for http://svn.openlaszlo.org/openlaszlo/trunk

Summary: various contextmenu fixes

New Features: LPP-4887

Bugs Fixed: LPP-5404, LPP-5405, LPP-6671, LPP-6725, LPP-6749, LPP-6752

Technical Reviewer: hminsky
QA Reviewer: max
Doc Reviewer: (pending)

Documentation:

Release Notes:

Details:
LzContextMenu:
 - added typing
 - added "showBuiltInItems()" as the counterpart to "hideBuiltInItems()" (LPP-5405)
 - added kernel-call at "clearItems()" (LPP-6752)
 - added tagname, because LzContextMenu is a subclass of LzNode
LzContextMenuItem:
 - added typing
 - added tagname, because LzContextMenuItem is a subclass of LzNode
LzContextMenuKernel (dhtml):
 - implemented "showBuiltInItems()" (LPP-5405)
 - adjusted "addItem(..)" and "clearItems()" (LPP-6749)
 - simplified swf-compat mode in "__show()"
 - added href to workaround IE-'curiosities' in "__show()" (LPP-6725)
 - don't show empty menu in "__show()" (LPP-5404)
 - execute delegate with proper argument in "__show()" (LPP-6671)
LzContextMenuItemKernel (dhtml):
 - first execute delegate, then fire onselect-event (parity with swf) in "__select()"
 - execute delegate with proper argument in "__select()" (LPP-6671)
LzSprite (dhtml):
 - added css-cursor style for contextmenu-item (LPP-4887)
LzContextMenuKernel (swf8):
 - implemented "showBuiltInItems()" (LPP-5405)
LzContextMenuKernel (swf9): 
 - implemented "showBuiltInItems()" (LPP-5405)
 - added even more typing

    

Tests:



Modified: openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzContextMenuKernel.lzs
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzContextMenuKernel.lzs	2008-08-12 16:05:43 UTC (rev 10661)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzContextMenuKernel.lzs	2008-08-12 16:15:05 UTC (rev 10662)
@@ -14,12 +14,10 @@
   */
 class LzContextMenuKernel {
 
-function LzContextMenuKernel (newowner:LzContextMenu)
-{
+function LzContextMenuKernel (newowner:LzContextMenu) {
     this.owner = newowner;
 
-    // set callback for "oncontextmenu" event
-    this.__LZmousedowndel = new LzDelegate( this , "__hide");
+    this.__LZmousedowndel = new LzDelegate(this, "__hide");
 }
 
 var owner:LzContextMenu = null;
@@ -40,7 +38,6 @@
     this._delegate = delegate;
 }
 
-
 /**
   * LzContextMenu.addItem
   * Adds a menu items into a menu
@@ -48,6 +45,10 @@
   * @access private
   */
 function addItem (item) {
+    if (LzMouseKernel.__showncontextmenu === this) {
+        this.__hide();
+        this.__show(false);
+    }
 }
 
 /**
@@ -59,15 +60,27 @@
 }
 
 /**
+  * LzContextMenu.showBuiltInItems
+  * @access private
+  */
+function showBuiltInItems () {
+    this.showbuiltins = true;
+}
+
+/**
   * LzContextMenu.clearItems
   * Remove all custom items from a menu
   * @access private
   */
 function clearItems () {
+    if (LzMouseKernel.__showncontextmenu === this) {
+        this.__hide();
+        this.__show(false);
+    }
 }
 
 /** @access private */
-function __show () {
+function __show (send=true) {
     var s = document.getElementById('lzcontextmenu')
     if (! s) {
         s = document.createElement('div');
@@ -75,62 +88,69 @@
         lz.embed.__setAttr(s, 'style', 'display: none');
         document.body.appendChild(s);
     }
-    if (this.owner.onmenuopen.ready) this.owner.onmenuopen.sendEvent(this.owner);
+    var owner = this.owner;
+    if (send && owner.onmenuopen.ready) owner.onmenuopen.sendEvent(owner);
 
     var o = '';
-    var items = this.owner.getItems();
+    var shownItems = 0;
+    var items = owner.getItems();
+    var _items = {};
     for (var i = 0; i < items.length; i++) {
         var cm = items[i].kernel;
         var v = cm.cmenuitem;
         if (v.visible != true) continue; 
         if (v.separatorBefore) o += '<br/>';
 
+        var caption = v.caption;
         // Don't display the same item twice (matches swf behavior)
-        var duplicate = false;
-        for (var j=0; j<i; j++) {
-            if (cm._equals(items[j].kernel)) {
-              duplicate = true;
-              break;
-            }
-        }
-        if (duplicate)
-            continue;
+        if (caption in _items) continue;
+        // Mark as displayed
+        _items[caption] = true;
+        shownItems += 1;
 
         if (v.enabled) {
-            o += '<a onmousedown="javascript:LzMouseKernel.__showncontextmenu.__select(' + i + ');return false;"'
-            o +='>' + v.caption + '</a>';
+            o += '<a href="" onmousedown="javascript:LzMouseKernel.__showncontextmenu.__select(' + i + ');return false;">'
+                    + caption + '</a>';
         } else {
-            o += v.caption;
+            o += caption;
         }
     }
+    
     LzMouseKernel.__showncontextmenu = this;
 
     s.innerHTML = o;
-    s.style.left = LzMouseKernel.__x + 'px';
-    s.style.top = LzMouseKernel.__y + 'px';
-    s.style.display = 'block';
+    if (send) {
+        s.style.left = LzMouseKernel.__x + 'px';
+        s.style.top = LzMouseKernel.__y + 'px';
+    }
+    
+    // Only show menu if there are any visible items
+    if (shownItems) {
+        s.style.display = 'block';
+    }
 
     this.__LZmousedowndel.register(lz.GlobalMouse, 'onmousedown');
 
-    if (this._delegate != null) this._delegate.execute(this);
+    var del = this._delegate;
+    if (send && del != null) del.execute(owner);
 }
 
 /** @access private */
-function __hide(ignore) {
+function __hide (ignore) {
     var s = document.getElementById('lzcontextmenu')
     if (! s) return;
     s.style.display = 'none';
     this.__LZmousedowndel.unregisterAll();
+    LzMouseKernel.__showncontextmenu = null;
 }
 
 /** @access private */
-function __select(i) {
+function __select (i) {
     this.__hide();
     var items = this.owner.getItems();
     if (items[i]) items[i].kernel.__select();
 }
 
-
 }; // End of LzContextMenuKernel
 
 
@@ -140,11 +160,10 @@
   */
 class LzContextMenuItemKernel {
 
-function LzContextMenuItemKernel (newowner:LzContextMenuItem, title, del)
-{
+function LzContextMenuItemKernel (newowner:LzContextMenuItem, title, del) {
     this.owner = newowner;
     this.cmenuitem = {visible: true, enabled: true, separatorBefore: false, caption: title};
-    this.setDelegate (del);
+    this.setDelegate(del);
 }
 
 var owner:LzContextMenuItem = null;
@@ -214,26 +233,19 @@
 }
 
 /** @access private */
-function __select() {
-    if (this.owner.onselect.ready) this.owner.onselect.sendEvent(this.owner);
-    if (this._delegate != null) {
-        if (this._delegate instanceof LzDelegate) {
-            this._delegate.execute(this);
-        } else if (typeof this._delegate == 'function') {
-            this._delegate(this);
-        } else {
-            if ($debug) {
-                Debug.error("LzContextMenuItem.setDelegate must be passed a delegate", this, this._delegate);
-            }
+function __select () {
+    var owner = this.owner;
+    var delegate = this._delegate;
+    if (delegate != null) {
+        if (delegate instanceof LzDelegate) {
+            delegate.execute(owner);
+        } else if (typeof delegate == 'function') {
+            delegate();
+        } else if ($debug) {
+            Debug.error("LzContextMenuItem.setDelegate must be passed a delegate", owner, delegate);
         }
     }
+    if (owner.onselect.ready) owner.onselect.sendEvent(owner);
 }
 
-/** @access private */
-// Must match the behavior of swf (only the caption is matched)
-function _equals (cm) {
-  return (cm != null) && (this.cmenuitem.caption == cm.cmenuitem.caption);
-}
-
-
 }; // End of LzContextMenuItemKernel

Modified: openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js	2008-08-12 16:05:43 UTC (rev 10661)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js	2008-08-12 16:15:05 UTC (rev 10662)
@@ -246,7 +246,8 @@
 LzSprite.prototype.__defaultStyles['#lzcontextmenu a'] = {
    color: '#000',
    display: 'block',
-   textDecoration: 'none'
+   textDecoration: 'none',
+   cursor: 'default'
 };
 LzSprite.prototype.__defaultStyles['#lzcontextmenu a:hover'] = {
    color: '#FFF',

Modified: openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzContextMenuKernel.lzs
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzContextMenuKernel.lzs	2008-08-12 16:05:43 UTC (rev 10661)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf/LzContextMenuKernel.lzs	2008-08-12 16:15:05 UTC (rev 10662)
@@ -14,11 +14,9 @@
   */
 class LzContextMenuKernel {
 
-function LzContextMenuKernel (newowner:LzContextMenu)
-{
+function LzContextMenuKernel (newowner:LzContextMenu) {
     this.owner = newowner;
 
-    // set callback for Flash "onSelect" event
     this.cm = new ContextMenu();
     this.cm.hideBuiltInItems();
 }
@@ -37,14 +35,13 @@
   */
 function setDelegate (delegate) {
     var __litem__ = this.owner;
-    var callback =  function (mc,cmitem) {
+    var callback = function (mc, cmitem) {
         if (delegate != null) delegate.execute(__litem__);
         if (__litem__.onmenuopen.ready) __litem__.onmenuopen.sendEvent(__litem__);
     };
     this.cm.onSelect = callback;
 }
 
-
 /**
   * LzContextMenu.addItem
   * Adds a menu items into a menu
@@ -64,6 +61,18 @@
 }
 
 /**
+  * LzContextMenu.showBuiltInItems
+  * @access private
+  */
+function showBuiltInItems () :void {
+    var builtins:Object = this.cm.builtInItems;
+    // display only 'useful' items in respect of a RIA!
+    builtins.print = true;
+    builtins.quality = true;
+    builtins.zoom = true;
+}
+
+/**
   * LzContextMenu.clearItems
   * Remove all custom items from a menu
   * @access private
@@ -90,11 +99,10 @@
   */
 class LzContextMenuItemKernel {
 
-function LzContextMenuItemKernel (newowner:LzContextMenuItem, title, del)
-{
+function LzContextMenuItemKernel (newowner:LzContextMenuItem, title, del) {
     this.owner = newowner;
     this.cmenuitem = new ContextMenuItem(title);
-    this.setDelegate (del);
+    this.setDelegate(del);
 }
 
 var owner:LzContextMenuItem = null;
@@ -111,14 +119,14 @@
   */
 function setDelegate (delegate) {
   var __litem__ = this.owner;
-  var callback =  function (mc,cmitem) {
+  var callback = function (mc, cmitem) {
       if (delegate != null) {
           if (typeof(delegate) == 'function') {
               delegate();
           } else if (delegate instanceof LzDelegate) {
               delegate.execute(__litem__);
-          } else {
-              Debug.error("LzContextMenuItem.setDelegate must be passed a delegate or function", this, delegate);
+          } else if ($debug) {
+              Debug.error("LzContextMenuItem.setDelegate must be passed a delegate or function", __litem__, delegate);
           }
       }
       if (__litem__.onselect.ready) __litem__.onselect.sendEvent(__litem__);

Modified: openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzContextMenuKernel.lzs
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzContextMenuKernel.lzs	2008-08-12 16:05:43 UTC (rev 10661)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzContextMenuKernel.lzs	2008-08-12 16:15:05 UTC (rev 10662)
@@ -23,11 +23,9 @@
     import flash.ui.*;
     }#
 
-function LzContextMenuKernel (newowner:LzContextMenu)
-{
+function LzContextMenuKernel (newowner:LzContextMenu) {
     this.owner = newowner;
 
-    // set callback for Flash "onSelect" event
     this.cm = new ContextMenu();
     this.cm.hideBuiltInItems();
 }
@@ -44,23 +42,22 @@
   * 
   * @access private
   */
-function setDelegate (delegate) {
+function setDelegate (delegate) :void {
   var __litem__ = this.owner;
-  var callback =  function (mc,cmitem) {
+  var callback = function (mc, cmitem) {
       if (delegate != null) delegate.execute(__litem__);
       if (__litem__.onmenuopen.ready) __litem__.onmenuopen.sendEvent(__litem__);
   };
-  this.cm.addEventListener(ContextMenuEvent.MENU_SELECT , callback);
+  this.cm.addEventListener(ContextMenuEvent.MENU_SELECT, callback);
 }
 
-
 /**
   * LzContextMenu.addItem
   * Adds a menu items into a menu
   * @param LzContextMenuItem item: LzContextMenuItem to install on this menu
   * @access private
   */
-function addItem (item) {
+function addItem (item) :void {
     this.cm.customItems.push(item.kernel.cmenuitem);
 }
 
@@ -68,16 +65,28 @@
   * LzContextMenu.hideBuiltInItems
   * @access private
   */
-function hideBuiltInItems () {
+function hideBuiltInItems () :void {
     this.cm.hideBuiltInItems();
 }
 
 /**
+  * LzContextMenu.showBuiltInItems
+  * @access private
+  */
+function showBuiltInItems () :void {
+    var builtins:ContextMenuBuiltInItems = this.cm.builtInItems;
+    // display only 'useful' items in respect of a RIA!
+    builtins.print = true;
+    builtins.quality = true;
+    builtins.zoom = true;
+}
+
+/**
   * LzContextMenu.clearItems
   * Remove all custom items from a menu
   * @access private
   */
-function clearItems () {
+function clearItems () :void {
     this.cm.customItems = [];
 }
 
@@ -87,7 +96,7 @@
   * Returns Flash ContextMenu object
   * @access private
   */
-function __LZcontextMenu () {
+function __LZcontextMenu () :ContextMenu {
    return this.cm;
 }
 
@@ -109,11 +118,10 @@
     import flash.ui.*;
     }#
 
-function LzContextMenuItemKernel (newowner:LzContextMenuItem, title, del)
-{
+function LzContextMenuItemKernel (newowner:LzContextMenuItem, title, del) {
     this.owner = newowner;
     this.cmenuitem = new ContextMenuItem(title);
-    this.setDelegate (del);
+    this.setDelegate(del);
 }
 
 var owner:LzContextMenuItem = null;
@@ -128,21 +136,22 @@
   * 
   * @access private
   */
-function setDelegate (delegate) {
+function setDelegate (delegate:*) :void {
   var __litem__ = this.owner;
-  var callback =  function (mc,cmitem) {
+  var callback = function (mc, cmitem) {
       if (delegate != null) {
-          if (typeof(delegate) == 'function') {
+          if (delegate is Function) {
               delegate();
-          } else if (delegate instanceof LzDelegate) {
+          } else if (delegate is LzDelegate) {
               delegate.execute(__litem__);
-          } else {
-              Debug.error("LzContextMenuItem.setDelegate must be passed a delegate or function", this, delegate);
+          } else if ($debug) {
+              Debug.error("LzContextMenuItem.setDelegate must be passed a delegate or function", __litem__, delegate);
           }
       }
       if (__litem__.onselect.ready) __litem__.onselect.sendEvent(__litem__);
   };
-  this.cmenuitem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT , callback);}
+  this.cmenuitem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, callback);
+}
 
 /**
   * LzContextMenuItem.setCaption
@@ -150,7 +159,7 @@
   * @param String caption: text string to display
   * @access public
   */
-function setCaption (caption) {
+function setCaption (caption:String) :void {
     this.cmenuitem.caption = caption;
 }
 
@@ -159,17 +168,16 @@
   * Gets the text string which is displayed for the menu item
   * @access public
   */
-function getCaption () {
+function getCaption () :String {
     return this.cmenuitem.caption;
 }
 
-
 /**
   * LzContextMenuItem.setEnabled
   * @param boolean val: if false, menu item is grayed out and will not respond to clicks
   * @access public
   */
-function setEnabled (val) {
+function setEnabled (val:Boolean) :void {
     this.cmenuitem.enabled = val;
 }
 
@@ -180,7 +188,7 @@
   * @access public
   */
 
-function setSeparatorBefore (val) {
+function setSeparatorBefore (val:Boolean) :void {
     this.cmenuitem.separatorBefore = val;
 }
 
@@ -190,7 +198,7 @@
   * @param boolean val: sets visibility
   * @access public
   */
-function setVisible (val) {
+function setVisible (val:Boolean) :void {
     this.cmenuitem.visible = val;
 }
 

Modified: openlaszlo/trunk/WEB-INF/lps/lfc/services/LzContextMenu.lzs
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/services/LzContextMenu.lzs	2008-08-12 16:05:43 UTC (rev 10661)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/services/LzContextMenu.lzs	2008-08-12 16:15:05 UTC (rev 10662)
@@ -19,18 +19,23 @@
   */
 class LzContextMenu extends LzNode {
 
-function LzContextMenu (del=null) {
+function LzContextMenu (del:LzDelegate = null) {
     this.kernel = new LzContextMenuKernel(this);
 
     this.items = [];
+    // set callback
     this.setDelegate(del);
 }
 
-//var onselect = LzDeclaredEvent;
+/** @access private
+  * @modifiers override 
+  */
+static var tagname = 'contextmenu';
+
 /**
   * @lzxtype event
   */
-var onmenuopen = LzDeclaredEvent;
+var onmenuopen:LzDeclaredEventClass = LzDeclaredEvent;
 
 var kernel:LzContextMenuKernel = null;
 var items:Array = null;
@@ -43,8 +48,8 @@
   * 
   * @access public
   */
-function setDelegate (delegate) {
-    this.kernel.setDelegate (delegate);
+function setDelegate (delegate:LzDelegate) :void {
+    this.kernel.setDelegate(delegate);
 }
 
 /**
@@ -52,32 +57,41 @@
   * @param LzContextMenuItem item: LzContextMenuItem to install on this menu
   * @access public
   */
-function addItem (item) {
+function addItem (item:LzContextMenuItem) :void {
     this.items.push(item);
-    this.kernel.addItem (item);
+    this.kernel.addItem(item);
 }
 
 /**
   * Removes Flash-installed default menu items
   * @access public
   */
-function hideBuiltInItems () {
-    this.kernel.hideBuiltInItems ();
+function hideBuiltInItems () :void {
+    this.kernel.hideBuiltInItems();
 }
 
 /**
+  * Shows Flash-installed default menu items
+  * @access public
+  */
+function showBuiltInItems () :void {
+    this.kernel.showBuiltInItems();
+}
+
+/**
   * Remove all custom items from a menu
   * @access public
   */
-function clearItems () {
+function clearItems () :void {
     this.items = [];
+    this.kernel.clearItems();
 }
 
 /**
   * Return list of custom items
   * @access public
   */
-function getItems () {
+function getItems () :Array {
     return this.items;
 }
 
@@ -87,13 +101,13 @@
   * @param function callback:  delegate to execute when item is selected
   * @access public
   */
-function makeMenuItem (title, callback) {
-  var item = new LzContextMenuItem(title, callback);
+function makeMenuItem (title:String, callback:*) :LzContextMenuItem {
+  var item:LzContextMenuItem = new LzContextMenuItem(title, callback);
   return item;
 }
 
 }; // End of LzContextMenu
-lz.ContextMenu = LzContextMenu;  // publish
+lz[LzContextMenu.tagname] = LzContextMenu;  // publish
 
 
 
@@ -106,12 +120,17 @@
   */
 class LzContextMenuItem extends LzNode {
 
-function LzContextMenuItem (title, del) {
+function LzContextMenuItem (title:String, del:*) {
     this.kernel = new LzContextMenuItemKernel(this, title, del);
 };
 
-var onselect = LzDeclaredEvent;
+/** @access private
+  * @modifiers override 
+  */
+static var tagname = 'contextmenuitem';
 
+var onselect:LzDeclaredEventClass = LzDeclaredEvent;
+
 var kernel:LzContextMenuItemKernel = null;
 
 
@@ -123,8 +142,8 @@
   * 
   * @access public
   */
-function setDelegate (delegate) {
-    this.kernel.setDelegate (delegate);
+function setDelegate (delegate:*) :void {
+    this.kernel.setDelegate(delegate);
 }
 
 /**
@@ -133,8 +152,8 @@
   * @param String caption: text string to display
   * @access public
   */
-function setCaption (caption) {
-    this.kernel.setCaption (caption);
+function setCaption (caption:String) :void {
+    this.kernel.setCaption(caption);
 }
 
 /**
@@ -142,18 +161,17 @@
   * Gets the text string which is displayed for the menu item
   * @access public
   */
-function getCaption () {
+function getCaption () :String {
     return this.kernel.getCaption();
 }
 
-
 /**
   * LzContextMenuItem.setEnabled
   * @param boolean val: if false, menu item is grayed out and will not respond to clicks
   * @access public
   */
-function setEnabled (val) {
-    this.kernel.setEnabled (val);
+function setEnabled (val:Boolean) :void {
+    this.kernel.setEnabled(val);
 }
 
 /**
@@ -163,8 +181,8 @@
   * @access public
   */
 
-function setSeparatorBefore (val) {
-    this.kernel.setSeparatorBefore (val);
+function setSeparatorBefore (val:Boolean) :void {
+    this.kernel.setSeparatorBefore(val);
 }
 
 /**
@@ -173,9 +191,9 @@
   * @param boolean val: sets visibility
   * @access public
   */
-function setVisible (val) {
-    this.kernel.setVisible (val);
+function setVisible (val:Boolean) :void {
+    this.kernel.setVisible(val);
 }
 
 }; // End of LzContextMenuItem
-lz.ContextMenuItem = LzContextMenuItem;  // publish
+lz[LzContextMenuItem.tagname] = LzContextMenuItem;  // publish



More information about the Laszlo-checkins mailing list