Hi

I have created a DataGrid which has an overriding setFocusedCell() 
method (copy and pasted from DataGrid.as), with the following 
changes.

1) I had to remove a reference to 'roundUp' as the compiler didnt 
like it.
2) I want my cellEditor to be a ComboBox rather than a TextInput. So 
I replaced the following line 

        cellEditor = listContent.createClassObject
(mx.controls.TextInput, editorName, EDITORDEPTH, {styleName:col, 
listOwner:this});

with 

        var dp = ["s1", "s2", "s3", "s4"];
        cellEditor = listContent.createClassObject
(mx.controls.ComboBox, editorName, EDITORDEPTH, {styleName:col, 
listOwner:this, dataProvider:dp, editable:true});


The problem i have is, the combobox dropdown doesnt close, when you 
click elsewhere on the Datagrid.
There is no problem if combobox.editable = false (initial parameter 
passed to craeteClassObject)

I appreciate any help. Code is below.

BTW. I dont want to use a custom cell renderer. This is only a 
simple example to highlight my problem.

Regards
bod(bhaq1972)



test.mxml
---------
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"; 
xmlns:nx="*" backgroundColor="#C0DCC2">

  <mx:Script>
    <![CDATA[

      var dp = [        { one:"one", two:"two", three:"three" },
                                                { one:"four", 
two:"five", three:"six" },
                                                { one:"seven", 
two:"eight", three:"nine" },
                                                { one:"ten", 
two:"eleven", three:"twelve" },
                                        { one:"thirteen", 
two:"fourteen", three:"fifteen" }];

    ]]>
  </mx:Script>

  <mx:TextArea width="200" height="100" text="Select a cell from the 
datagrid. Then click the arrow to get the dropdown, and then mouse 
focus elsewhere "/>
  <nx:DataGridCombo editable="true" id="dg" dataProvider="{ dp }">
        <nx:columns>
                <mx:Array>
                        <mx:DataGridColumn columnName="one"/>
                        <mx:DataGridColumn columnName="two" />
                        <mx:DataGridColumn columnName="three"/>
                </mx:Array>
        </nx:columns>
  </nx:DataGridCombo>

</mx:Application>



DataGridCombo
-------------
<?xml version="1.0" encoding="utf-8"?>
<mx:DataGrid xmlns:mx="http://www.macromedia.com/2003/mxml";>

<mx:Script>
<![CDATA[
        import mx.controls.gridclasses.DataGridColumn;
        import mx.controls.gridclasses.DataGridRow;
        import mx.core.UIObject;

        function setFocusedCell(coord:Object, broadCast) : Void
        {
                if (!enabled || !editable) return;

                // allow setting of undefined to dispose cell editor
                if (coord==undefined && cellEditor!=undefined) {
                        disposeEditor();
                        return;
                }
                // get all details for the cell to be focused.
                var index : Number = coord.itemIndex;
                var colIdx : Number = coord.columnIndex;
                if (index==undefined) index = 0;
                if (colIdx==undefined) colIdx = 0;
                var colName :String = __columns[colIdx].columnName;



                // scroll so the cell is in view
                if (__vPosition>index) {
                        setVPosition(index);
                } else {
//var delt = index-__vPosition-__rowCount+roundUp+1;
var delt = index-__vPosition-__rowCount+1;
                        if (delt>0) {
                                setVPosition(__vPosition+delt);
                        }
                }

                // get the actual references for the column, row, 
and cell
                var col : DataGridColumn = __columns[colIdx];
                var row : DataGridRow = rows[index-__vPosition];
                var cell = row.cells[colIdx];

                // scroll so the cell is in view (cont'd)
                if (cell._x>__hPosition+displayWidth || 
cell._x<__hPosition) {
                        setHPosition(cell._x);
                }


                // try to get the right data for editing
                var editText = __dataProvider.getEditingData(index, 
colName);
                if (editText==undefined)
                        editText = __dataProvider.getItemAt(index)
[colName];
                if (editText==undefined)
                        editText=" ";

                // isCellEditor is part of the cellRenderer 
interface. It allows the cell itself to do the editing
                if (cell.isCellEditor!=true) {
                        // if this isn't implemented, use an input 
control as editor
                        if (cellEditor==undefined) {
//cellEditor = listContent.createClassObject(mx.controls.TextInput, 
editorName, EDITORDEPTH, {styleName:col, listOwner:this});
var dp = ["truckmount", "pda", "rf", "mobile"];
cellEditor = listContent.createClassObject(mx.controls.ComboBox, 
editorName, EDITORDEPTH, {styleName:col, listOwner:this, 
dataProvider:dp, editable:true});
                        }
                        // give it the right size, look and placement
                        cellEditor.backgroundColor = 0xffffff;
                        cellEditor._visible = true;
                        cellEditor.setSize(col.__width, 
__rowHeight+2);
                        cellEditor._x = cell._x-1;
                        cellEditor.text = editText;

                        // set up a mask for our cute little wipe 
effect for the editor
                        editorMask = listContent.attachMovie
("BoundingBox", "editorMask", 60001, {_alpha:0});
                        cellEditor.setMask(editorMask);
                        editorMask._width = cellEditor.width;
                        editorMask._height = cellEditor.height;
                        editorMask._y = cellEditor._y = row._y-1;
                        editorMask._x = cellEditor._x-
editorMask._width;
                        // start the wipe - see onTweenUpdate/end 
for the results
                        editTween = new mx.effects.Tween(this, 
cellEditor._x-editorMask._width, cellEditor._x, 150);

                        // Block all layout, responses from web 
service, and other background
                        // processing until the tween finishes 
executing.
                        UIObject.suspendBackgroundProcessing();

                } else {
                        // if the cell is a cellEditor, we'll use it
                        cellEditor = cell;
                        cellEditor.setValue(editText, 
__dataProvider.getItemAt(index));
                }

                // set focus to the cellEditor. It is now 
essentially in control of input until the Mouse
                // is clicked away, or ESC/ENTER/TAB are hit
                var fM = getFocusManager();
                fM.setFocus(cellEditor);
                fM.defaultPushButtonEnabled = false;

                if (cell.isCellEditor!=true) {
                        // only for text input - tends to scroll 
after focused, so we scroll it back
                        cellEditor.hPosition = 0;
                        cellEditor.redraw();            // This 
makes sure that the text is in the label TextField, so setSelection 
will always work.
                        Selection.setSelection(0, cellEditor.length);

                }
                // store the value
                __focusedCell = coord;

                // tricky business. Steal the focusManager's method 
of catching tabs,
                // and replace it with our own, which will do *our* 
bidding <nefarious laughter>.
                if (__tabHandlerCache == undefined)
                {
                        __tabHandlerCache = fM.tabHandler;
                        fM.tabHandler = tabHandler;
                }

                // give the fM a reference to us (our tabHandler 
needs it)
                fM.activeGrid = this;

                // listen for keyStrokes on the cellEditor (which 
lets the grid supervise for ESC/ENTER)
                cellEditor.addEventListener("keyDown", 
this.editorKeyDown);

                // broadcast the focus event
                if (broadCast) {
                        dispatchEvent({type:"cellFocusIn", 
itemIndex: index, columnIndex: colIdx});
                }
        }

]]>
</mx:Script>
</mx:DataGrid>




 
Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/flexcoders/

<*> To unsubscribe from this group, send an email to:
    [EMAIL PROTECTED]

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/
 


Reply via email to