I add initial support for checkable field of QxFieldSet. This is standard
de facto for common widgets libraries, such as QT, GTK, Win32 GUI...
Known problems:
- setChecked not call toggle routine to enable/disable childs.
- when toggling, some widgets such as edit/listbox/combobox will not
  switch to enabled/disabled state when it placed on HorizontalBoxLayout or
  VerticalBoxLayout.
- need code cleanup & optimizations. I novice to QooxDoo.
- checkbox icon switching only visible while clicking on legend label.

--
mouse

--- source/script/widgets/QxFieldSet.js.orig    2005-11-01 17:44:20 +0300
+++ source/script/widgets/QxFieldSet.js 2005-11-01 17:35:36 +0300
@@ -26,10 +26,11 @@
 /* ****************************************************************************
 
 #package(form)
+#require(QxInputCheckIcon)
 
 **************************************************************************** */
 
-function QxFieldSet(vLegend, vIcon)
+function QxFieldSet(vLegend, vIcon, vCheckable, vChecked)
 {
   QxCanvasLayout.call(this);
   
@@ -70,19 +70,103 @@
   //   INIT
   // ***********************************************************************
   this.setLegend(vLegend);
-  this.setIcon(vIcon);
+  this._checkable = false;
+
+  if (isValidBoolean(vCheckable) && vCheckable) {
+    this.setCheckable(vCheckable);
+    if (isValidBoolean(vChecked)) {
+      this.setChecked(vChecked);
+    }
+  } else {
+    this.setIcon(vIcon);
+  }
 
 
   // ***********************************************************************
   //   REMAPPING
   // ***********************************************************************
   this.remapChildrenHandlingTo(this._frame);
+
 };
 
 QxFieldSet.extend(QxCanvasLayout, "QxFieldSet");
 
 
 
+/*
+  
-------------------------------------------------------------------------------
+    MODIFIER
+  
-------------------------------------------------------------------------------
+*/
+
+QxCheckBox.removeProperty({ name : "icon" });
+
+/*!
+  The HTML name of the form element used by the widget
+*/
+QxFieldSet.addProperty({ name : "name", type : QxGlobal.TYPEOF_STRING });
+
+/*!
+  The HTML value of the form element used by the widget
+*/
+QxFieldSet.addProperty({ name : "value", type : QxGlobal.TYPEOF_STRING });
+
+/*!
+  If the widget is checked
+*/
+QxFieldSet.addProperty({ name : "checked", type : QxGlobal.TYPEOF_BOOLEAN, 
defaultValue : false, getAlias : "isChecked" });
+
+
+/*
+  
-------------------------------------------------------------------------------
+    ICON HANDLING
+  
-------------------------------------------------------------------------------
+*/
+
+proto.INPUT_TYPE = "checkbox";
+
+proto._createIcon = function()
+{
+  var i = this._icon = new QxInputCheckIcon;
+
+  i.setType(this.INPUT_TYPE);
+  i.setChecked(this.isChecked());
+  i.setEnabled(this.isEnabled());
+  i.setAnonymous(true);
+};
+
+
+
+
+
+
+/*
+  
-------------------------------------------------------------------------------
+    MODIFIER
+  
-------------------------------------------------------------------------------
+*/
+
+
+proto._modifyChecked = function(propValue, propOldValue, propData)
+{
+  if (this._icon) {
+    this._icon.setChecked(propValue);
+    var childs = this.getChildren();
+    for (w in childs) {
+      if (typeof childs[w] == "object" && childs[w] != this._legend && 
childs[w] != this._icon) {
+       childs[w].setEnabled(propValue);
+      }
+    }
+  };
+
+  return true;
+};
+
+proto._toggleChecked = function() {
+
+};
+
+
 
 
 /*
@@ -126,6 +210,103 @@
   this._legend.getIcon();
 };
 
+proto.setCheckable = function(vCheckable) {
+  if (vCheckable) {
+    this._createIcon();
+    this._legend.addAtBegin(this._icon);
+    this._checkable = true;
+
+    this._legend.addEventListener(QxGlobal.EVENT_TYPE_CLICK, this._onclick);
+    this._legend.addEventListener(QxGlobal.EVENT_TYPE_KEYDOWN, 
this._onkeydown);
+    this._legend.addEventListener(QxGlobal.EVENT_TYPE_KEYUP, this._onkeyup);
+  } else if (this._checkable) {
+    this._checkable = false;
+
+    if (this._icon) {
+      this.remove(this._icon);
+    };
+
+    this._legend.removeEventListener(QxGlobal.EVENT_TYPE_CLICK, this._onclick);
+    this._legend.removeEventListener(QxGlobal.EVENT_TYPE_KEYDOWN, 
this._onkeydown);
+    this._legend.removeEventListener(QxGlobal.EVENT_TYPE_KEYUP, this._onkeyup);
+  }
+};
+
+proto.getCheckable = function() {
+  return this._checkable;
+};
+
+/*proto.setChecked = function(vChecked) {
+  this._icon.setChecked(vChecked); 
+};
+
+proto.getChecked = proto.isChecked = function() {
+  this._icon.getChecked();
+};*/
+
+
+/*
+------------------------------------------------------------------------------------
+  HANDLER
+------------------------------------------------------------------------------------
+*/
+
+proto._handleIcon = function()
+{
+  //FIXME: not used code?
+  switch(this.getShow())
+  {
+    case QxAtom.SHOW_ICON:
+    case QxAtom.SHOW_BOTH:
+      this._iconIsVisible = true;
+      break;
+
+    default:
+      this._iconIsVisible = false;
+  };
+
+  if (!this._iconIsVisible)
+  {
+    if (this._icon) {
+      this.remove(this._icon);
+    };
+  }
+  else
+  {
+    this._createIcon();
+
+    if (this._icon.getParent() != this) {
+      this._legend.addAtBegin(this._icon);
+    };
+  };
+};
+
+
+
+
+/*
+  
-------------------------------------------------------------------------------
+    EVENT-HANDLER
+  
-------------------------------------------------------------------------------
+*/
+
+proto._onclick = function(e) {
+  this.getParent().toggleChecked();
+};
+
+proto._onkeydown = function(e)
+{
+  if(e.getKeyCode() == QxKeyEvent.keys.enter && !e.getAltKey()) {
+    this.getParent().toggleChecked();
+  };
+};
+
+proto._onkeyup = function(e)
+{
+  if(e.getKeyCode() == QxKeyEvent.keys.space) {
+    this.getParent().toggleChecked();
+  };
+};
 
 
 
@@ -142,9 +323,15 @@
   if (this.getDisposed()) {
     return true;
   };
-  
+
   if (this._legend) 
   {
+    if (this._checkable) {
+      this._legend.removeEventListener(QxGlobal.EVENT_TYPE_CLICK, 
this._onclick);
+      this._legend.removeEventListener(QxGlobal.EVENT_TYPE_KEYDOWN, 
this._onkeydown);
+      this._legend.removeEventListener(QxGlobal.EVENT_TYPE_KEYUP, 
this._onkeyup);
+    }
+
     this._legend.dispose();
     this._legend = null;
   };

Reply via email to