This is an automated email from the ASF dual-hosted git repository.

piotrz pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git


The following commit(s) were added to refs/heads/develop by this push:
     new 7cbb30fa87 Jewel DataGrid: Add ability to dynamically assign 
itemRenderer to DataGridColumn
7cbb30fa87 is described below

commit 7cbb30fa87c2b534e9dd8221ec3a95903da34cfb
Author: Piotr Zarzycki <[email protected]>
AuthorDate: Fri Jun 21 17:08:41 2024 +0200

    Jewel DataGrid: Add ability to dynamically assign itemRenderer to 
DataGridColumn
    
    - Dispatch event "itemRendererChanged" in DataGridColumn
    - Swapping existing itemRenderer in column by removing specific cell and in 
that place creating new one with fresh item renderer
    - Copying some properties from old cell to new one
---
 .../royale/jewel/beads/views/DataGridView.as       | 113 +++++++++++++--------
 .../supportClasses/datagrid/DataGridColumn.as      |  24 +++++
 2 files changed, 97 insertions(+), 40 deletions(-)

diff --git 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/DataGridView.as
 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/DataGridView.as
index 2d1ddb313e..48ca6d14a3 100644
--- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/DataGridView.as
+++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/DataGridView.as
@@ -234,52 +234,15 @@ package org.apache.royale.jewel.beads.views
          */
         protected function createLists():void
         {
-            // get the name of the class to use for the columns
-            var columnClass:Class = ValuesManager.valuesImpl.getValue(host, 
"columnClass") as Class;
             var len:uint = sharedModel.columns.length;
             for (var i:int=0; i < len; i++)
             {
                 ignoreSizeChange = i != len-1;
                 var dataGridColumn:IDataGridColumn = sharedModel.columns[i] as 
IDataGridColumn;
                 
IEventDispatcher(dataGridColumn).addEventListener("labelChanged", 
labelChangedHandler);
+                
IEventDispatcher(dataGridColumn).addEventListener("itemRendererChanged", 
itemRendererChangedHandler);
 
-                var list:IDataGridColumnList = new columnClass();
-                list.columnInfo = dataGridColumn;
-                
-                list.datagrid = _dg;
-                list.emphasis = (_dg as IEmphasis).emphasis;
-                
-                if (i == 0) {
-                    list.className = "first";
-                }
-                else if (i == len-1) {
-                    list.className = "last";
-                }
-                else {
-                    list.className = "middle";
-                }
-                
-                // by default make columns get the 1/n of the maximun space 
available
-                // (list as ILayoutChild).percentWidth = 100 / len;
-                
-                // need to add itemRenderer interface to DataGrid
-                if((_dg as IItemRendererProvider).itemRenderer)
-                    list.itemRenderer = (_dg as 
IItemRendererProvider).itemRenderer;
-                else
-                    list.itemRenderer = dataGridColumn.itemRenderer;
-                list.labelField = dataGridColumn.dataField;
-                if(dataGridColumn.labelFunction)
-                {
-                    var lf:LabelFunction = new LabelFunction();
-                    lf.labelFunction = dataGridColumn.labelFunction;
-                    list.addBead(lf);
-                }
-                list.addEventListener('rollOverIndexChanged', 
handleColumnListRollOverChange);
-                list.addEventListener('selectionChanged', 
handleColumnListSelectionChange);
-                list.addEventListener('beadsAdded', 
configureColumnListPresentationModel);
-                (list as StyledUIBase).tabIndex = -1;
-                setColumnHeight(list as StyledUIBase);
-                
+                var list:IDataGridColumnList = createColumnList(i, len, 
dataGridColumn);
 
                 (_listArea as IParent).addElement(list as IChild);
 
@@ -324,6 +287,49 @@ package org.apache.royale.jewel.beads.views
             columnLists.length = 0;
         }
 
+        protected function createColumnList(index:int, len:int, 
dataGridColumn:IDataGridColumn):IDataGridColumnList
+        {
+            // get the name of the class to use for the columns
+            var columnClass:Class = ValuesManager.valuesImpl.getValue(host, 
"columnClass") as Class;
+            var list:IDataGridColumnList = new columnClass();
+                list.columnInfo = dataGridColumn;
+
+                list.datagrid = _dg;
+                list.emphasis = (_dg as IEmphasis).emphasis;
+
+                if (index == 0) {
+                    list.className = "first";
+                }
+                else if (index == len-1) {
+                    list.className = "last";
+                }
+                else {
+                    list.className = "middle";
+                }
+
+                // by default make columns get the 1/n of the maximun space 
available
+                // (list as ILayoutChild).percentWidth = 100 / len;
+
+                // need to add itemRenderer interface to DataGrid
+                if((_dg as IItemRendererProvider).itemRenderer)
+                    list.itemRenderer = (_dg as 
IItemRendererProvider).itemRenderer;
+                else
+                    list.itemRenderer = dataGridColumn.itemRenderer;
+                list.labelField = dataGridColumn.dataField;
+                if(dataGridColumn.labelFunction)
+                {
+                    var lf:LabelFunction = new LabelFunction();
+                    lf.labelFunction = dataGridColumn.labelFunction;
+                    list.addBead(lf);
+                }
+                list.addEventListener('rollOverIndexChanged', 
handleColumnListRollOverChange);
+                list.addEventListener('selectionChanged', 
handleColumnListSelectionChange);
+                list.addEventListener('beadsAdded', 
configureColumnListPresentationModel);
+                (list as StyledUIBase).tabIndex = -1;
+                setColumnHeight(list as StyledUIBase);
+             return list;
+        }
+
         /**
                 *  finish setup
                 *
@@ -497,7 +503,8 @@ package org.apache.royale.jewel.beads.views
             sharedModel.rollOverIndex = list.rollOverIndex;
             var columnLists:Array = this.columnLists;
             for(var i:int=0; i < columnLists.length; i++) {
-                if (list != columnLists[i]) {
+                if (list != columnLists[i])
+                {
                     var otherList:IDataGridColumnList = columnLists[i] as 
IDataGridColumnList;
                     otherList.rollOverIndex = list.rollOverIndex;
                 }
@@ -524,6 +531,32 @@ package org.apache.royale.jewel.beads.views
             }
             _header.dataProvider = new ArrayList(_sharedModel.columns);
         }
+
+        private function itemRendererChangedHandler(event:Event):void
+        {
+            var columnListLength:int = columnLists.length;
+            for(var i:int=0; i < columnLists.length; i++)
+            {
+                var dataGridColumnList:IDataGridColumnList = columnLists[i] as 
IDataGridColumnList;
+                if (dataGridColumnList.columnInfo == event.currentTarget)
+                {
+                    var elementIndex:int = (_listArea as 
IParent).getElementIndex(dataGridColumnList as IChild);
+                     (_listArea as IParent).removeElement(dataGridColumnList 
as IChild);
+
+                     var newDataGridColumnList:IDataGridColumnList = 
createColumnList(elementIndex, columnListLength, sharedModel.columns[i]);
+
+                     (newDataGridColumnList as 
IChild).element.style["minWidth"] = (dataGridColumnList as 
IChild).element.style["minWidth"];
+                     (newDataGridColumnList as 
IChild).element.style["maxWidth"] = (dataGridColumnList as 
IChild).element.style["maxWidth"];
+                     (newDataGridColumnList as IChild).element.style["width"] 
= (dataGridColumnList as IChild).element.style["width"];
+                     (newDataGridColumnList as IChild).element.style["flex"] = 
(dataGridColumnList as IChild).element.style["flex"];
+
+                     (_listArea as IParent).addElementAt(newDataGridColumnList 
as IChild, elementIndex);
+                     columnLists[elementIndex] = newDataGridColumnList;
+
+                     newDataGridColumnList.dataProvider = dp;
+                }
+            }
+        }
     }
 }
 
diff --git 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/supportClasses/datagrid/DataGridColumn.as
 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/supportClasses/datagrid/DataGridColumn.as
index 39ca5753b6..7941ed60f7 100644
--- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/supportClasses/datagrid/DataGridColumn.as
+++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/supportClasses/datagrid/DataGridColumn.as
@@ -20,6 +20,7 @@ package org.apache.royale.jewel.supportClasses.datagrid
 {
 import org.apache.royale.core.IStyledUIBase;
 import org.apache.royale.jewel.supportClasses.table.TableColumn;
+import org.apache.royale.core.IFactory;
 
 /**
  *  The DataGridColumn class is the collection of properties that describe
@@ -47,8 +48,31 @@ public class DataGridColumn extends TableColumn implements 
IDataGridColumn
        {
        }
 
+    private var _itemRenderer:IFactory;
        
+    /**
+     *  The itemRenderer class or factory to use to make instances of 
itemRenderers for
+     *  display of data.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion Royale 0.9.11
+     */
+    override public function get itemRenderer():IFactory
+    {
+        return _itemRenderer;
+    }
 
+    override public function set itemRenderer(value:IFactory):void
+    {
+        if (_itemRenderer != value)
+        {
+            _itemRenderer = value;
+
+            dispatchEvent(new Event('itemRendererChanged'));
+        }
+    }
 
        private var _visible:Boolean = true;
        public function set visible(value:Boolean):void{

Reply via email to