Hi all,

I have a command object which toggles the value of a boolean property 
"showLabel".
I also have a qx.ui.menu.CheckBox, which toggles "showLabel" indirectly 
by using the command object.

Whenever the property value is changed, whether that's done by the 
command object, the checkbox or some external source, I need the 
checkbox state to reflect the new value. Obviously, this is easy to do 
using data binding. Everything is fine when the property change is 
initiated from the command object, or from the outside world.

But trouble arises when the change is initiated from the CheckBox. The 
CheckBox automatically changes its checked state whenever its execute 
event is fired. However, since the CheckBox uses the command object, the 
execute itself changes the value of "showLabel", which (due to the data 
binding) changes the checked state of the CheckBox. Chicken or the egg? 
Not surprisingly, this results in strange/unwanted behaviour.

To prevent this the unwanted behaviour, I want to suppress the checkbox 
behaviour of changing its checked state on execution. This can be done 
by removing its internal "execute" listener right after creating the 
checkbox:

       button.removeListener("execute", button._onExecute, button, false);

This works, but since this makes use of unexposed CheckBox interiors: is 
there's a better way of handling it?




Code example below:
********************************************************


qx.Class.define("test.Window", {

   extend : qx.ui.window.Window,

   construct : function() {
     this.base(arguments);

     this.setLayout(new qx.ui.layout.Canvas());
     this.setWidth(300);
     this.setHeight(200);

     this._label = new qx.ui.basic.Label("Rightclick or press L to hide 
this text.");
     this.add(this._label);

     this._command = new qx.ui.core.Command("L");
     this._command.addListener("execute", this.toggleShowLabel, this);

     this.initShowLabel(true);

     this.setContextMenu(this._getMenu());
   },

   properties :
   {
     showLabel : {
       deferredInit: true,
       check: "Boolean",
       apply: "_applyShowLabel",
       event: "showLabelChanged"
     }
   },

   members :
   {
     _label: null,
     _command : null,

     _applyShowLabel : function(value, old) {
       this._label.setVisibility(value ? "visible" : "excluded");
     },

     _getMenu : function() {
       var menu = new qx.ui.menu.Menu;

       var button = new qx.ui.menu.CheckBox("Show label");

       //suppress default behaviour of toggling checked value on execute
       button.removeListener("execute", button._onExecute, button, false);

       button.setCommand(this._command);
       this.bind("showLabel", button, "value");

       menu.add(button);
       return menu;
     }
   }
});

********************************************************

If you comment out the removeListener line, you will notice that the 
checkbox state will not be updated on the first "showLabel" change. All 
subsequent showLabel changes will be passed to the checkbox, but its 
state will be inverted.


Thanks,

Marc


------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
qooxdoo-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel

Reply via email to