--- In [email protected], "j_lentzz" <[EMAIL PROTECTED]> wrote:
>
> Ok, I have a simple example.  When you run the app, click on the lower
> right cell, the upper left cell with get focus first.  Thanks for all
> the help.  John
> *** DGTest.mxml ***
> <?xml version="1.0" encoding="utf-8"?>
> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml";
> layout="absolute" xmlns:n1="FAB_widgets/widgets">
> 
>       <mx:Script>
>               <![CDATA[
>                       import mx.collections.ArrayCollection;
>                       import mx.events.DataGridEvent;
>               
>                       [Bindable]
>                       protected var _listData:ArrayCollection = new
> ArrayCollection([{name:'AA', phone:'555-555-1234',email:'BB'},
>                                                                               
>                                                                    
> {name:'BB', phone:'555-555-4321',email:'AA'}]);
> 
>                       private function 
> fireEditEvent(event:DataGridEvent):void {
>                               if (dg.itemEditorInstance is ComboBoxRenderer) {
> //                                    event.preventDefault();
>                                       
>                                       // copy selected value (data) from 
> combobox to renderer 
>                                       var selData:String =
> ComboBoxRenderer(event.currentTarget.itemEditorInstance).text;
>                                       var selData2:Object =
> ComboBoxRenderer(event.currentTarget.itemEditorInstance).selectedItem;
>                                       if (selData2 != null) {
>                                               
> dg.editedItemRenderer.data[event.dataField] = selData2.data;
> /*EXPENSIVE!!!!       *///                            
> dg.dataProvider.itemUpdated(event.itemRenderer.data);
>                                       }
> 
>                                       dg.destroyItemEditor();
>                               }                       
>                       }
> 
>                       protected function 
> itemEditBeginHandler(event:DataGridEvent):void {
>                               _listData[event.rowIndex].rowChanged = true;
>                               dispatchEvent(new Event("change"));
>                               dg.invalidateList();
>                               trace('itemEditBeginHandler - ListWithoutAdd');
>                       }
>                       
>               ]]>
>       </mx:Script>
> 
> 
>       <mx:DataGrid headerHeight="21" editable="true" rowHeight = "30"
> id="dg" dataProvider="{_listData}" visible="true"  selectable="false"
> itemEditEnd="fireEditEvent(event)"
> itemEditBegin="itemEditBeginHandler(event)">
>               <mx:columns>
>                       <mx:DataGridColumn dataField="name" headerText="Name"
> itemEditor="ComboBoxRenderer" itemRenderer="LabelWithDownArrow"/>
>                       <mx:DataGridColumn dataField="phone" 
> headerText="Phone"/>
>                       <mx:DataGridColumn dataField="email" headerText="Email"
> itemEditor="ComboBoxRenderer" itemRenderer="LabelWithDownArrow"/>
>               </mx:columns>
>       </mx:DataGrid>
>       
> </mx:Application>
> 
> *** LabelWithDownArrow.as ***
> 
> package 
> {
>       
>       import mx.controls.Label;
>       import mx.events.FlexEvent;
>       import mx.controls.dataGridClasses.DataGridListData;
>       import mx.controls.dataGridClasses.DataGridColumn;
>       import mx.controls.DataGrid;
>       import mx.collections.ArrayCollection;
>       import flash.display.Graphics;
> 
>       public class LabelWithDownArrow extends Label
>       {
>           
>               public function LabelWithDownArrow()
>               {
>                       super();
>                       addEventListener(mx.events.FlexEvent.SHOW, 
> showEventHandler);
>               }
> 
>               
>               private function showEventHandler(e:FlexEvent):void {
>                       trace('LabelWithDownArrow showEventHandler');
>                       listData.label = 
> data[DataGridListData(listData).dataField];
>                       
>                       var cbr:ComboBoxRenderer;       // will contain 
> renderer for this cell
>                       var dgc:DataGridColumn;         // will contain column 
> info for the one
> this cell is in
>                       var columnArray:Array;          // columns of datagrid
>                       var dg:DataGrid;                        // reference to 
> grid containing this cell
>                       var dp:ArrayCollection;         // dataProvider of 
> selected cell's comboBox
>                       var dgld:DataGridListData = listData as 
> DataGridListData;
> 
>                       if (dgld != null) {                     
>                               dg = DataGrid(listData.owner);
>                               columnArray = dg.columns;
>                               
>                               // iterate through columns to find one that 
> matches to this cell
>                               var columnArrayLen:int = columnArray.length;
>                               
>                               for (var i:int=0; i< columnArrayLen; i++) {
>                                       if 
> (DataGridColumn(columnArray[i]).dataField == dgld.dataField) {
> // column found
>                                               if 
> (dg.columns[i].itemEditor.newInstance() is ComboBoxRenderer) {
>                                                       cbr = 
> dg.columns[i].itemEditor.newInstance();
>                                                       dp = cbr.dataProvider 
> as ArrayCollection;
>                                                       // now iterate through 
> dp to find a matching data value, when
> found put its label in the Label widget                                       
>                                                       var dpLen:int = 
> dp.length;
>                                                       for (var j:int=0; 
> j<dpLen; j++) {
>                                                               if 
> (dp.getItemAt(j).data == data[dgld.dataField]) { // found
match
>                                                                       
> this.text = dp.getItemAt(j).label; // + " " +
> dp.getItemAt(j).data;
>                                                                       
> trace('found showEvent LabelWithDownArrow');
>                                                                       return;
>                                                               }
>                                                       }
>                                               }
>                                       }
>                               }
>                               // not found, so show comboBox prompt
>                               this.text = cbr.prompt;
>                               trace('not found showEvent LabelWithDownArrow');
>                       }
>                       
>                       trace('showEvent');     
>               }
>               
>               override protected function updateDisplayList(w:Number,
h:Number):void {
>                       super.updateDisplayList(w-15, h); // subtract from 
> width to allow
> for down arrow
> 
>                       var g:Graphics = graphics;
>       
>                       g.clear();
>                       
>                       // add arrow to box
>                       // Draw the triangle.
>                       g.beginFill(0x000000); // black
>                       g.moveTo(w - 11.5, h / 2 + 3);
>                       g.lineTo(w - 15, h / 2 - 2);
>                       g.lineTo(w - 8, h / 2 - 2);
>                       g.lineTo(w - 11.5, h / 2 + 3);
>                       g.endFill();
>               }
> 
>               // method used to change what is displayed
>               [Bindable]
>               override public function set data(value:Object):void {
>                       super.data = value;
>                       
>                       var cbr:ComboBoxRenderer;       // will contain 
> renderer for this cell
>                       var dgc:DataGridColumn;         // will contain column 
> info for the one
> this cell is in
>                       var columnArray:Array;          // columns of datagrid
>                       var dg:DataGrid;                        // reference to 
> grid containing this cell
>                       var dp:ArrayCollection;         // dataProvider of 
> selected cell's comboBox
>                       var dgld:DataGridListData = listData as 
> DataGridListData;
> 
>                       if (dgld != null) {                     
>                               dg = DataGrid(listData.owner);
>                               columnArray = dg.columns;
>                               
>                               // iterate through columns to find one that 
> matches to this cell
>                               var columnArrayLen:int = columnArray.length;
>                               
>                               for (var i:int=0; i< columnArrayLen; i++) {
>                                       if 
> (DataGridColumn(columnArray[i]).dataField == dgld.dataField) {
> // column found
>                                               if 
> (dg.columns[i].itemEditor.newInstance() is ComboBoxRenderer) {
>                                                       cbr = 
> dg.columns[i].itemEditor.newInstance();
>                                                       dp = cbr.dataProvider 
> as ArrayCollection;
>                                                       // now iterate through 
> dp to find a matching data value, when
> found put its label in the Label widget                                       
>                                                       var dpLen:int = 
> dp.length;
>                                                       for (var j:int=0; 
> j<dpLen; j++) {
>                                                               if 
> (dp.getItemAt(j).data == data[dgld.dataField]) { // found
match
>                                                                       
> this.text = dp.getItemAt(j).label; // + " " +
> dp.getItemAt(j).data;
>                                                                       
> trace('found LabelWithDownArrow');
>                                                                       return;
>                                                               }
>                                                       }
>                                               }
>                                       }
>                               }
>                               // not found, so show comboBox prompt
>                               this.text = cbr.prompt;
>                               trace('not found LabelWithDownArrow');
>                       }
>               }
>       }
> }
> 
> *** ComboBoxRenderer.as ***
> 
> package 
> {
> 
>       import mx.controls.ComboBox;
>       import flash.events.FocusEvent;
>       import mx.collections.ArrayCollection;
>       import mx.controls.dataGridClasses.DataGridListData;
> 
>       public class ComboBoxRenderer extends ComboBox
>       {
>               public function ComboBoxRenderer()
>               {
>                       super();
> 
>                       this.toolTip = this.text;
>                       this.dataProvider = DropDown_Names;
>                       addEventListener(flash.events.FocusEvent.FOCUS_IN,
focusEventHandler);
>               }
>               
>               private var DropDown_Names:ArrayCollection = new
> ArrayCollection([{data:'AA', label: 'Adam Adams'},{data:'BB', label:
> 'Bob Bobs'}]);
>       
>               override public function get data():Object {
>                       trace('get data cbr renderere');
>                       return super.data;
>               }
>       
>               // this affects what is displayed by widget
>               [Bindable]
>               override public function set data(value:Object):void {
>                       trace('********** set cbr data ***********');
>                       var rowData:DataGridListData = this.listData as 
> DataGridListData;
>                       if (value != null) {
>                               var stringToFind:String = null;
>                               var selected:int = -1;  
> 
>                               if (listData.label != null)
>                                       stringToFind = 
> listData.label.toUpperCase();    
> 
>                                       for (var i:int=0; i< 
> dataProvider.length;i++) {
>                                               var item:String = 
> String(dataProvider[i].data).toUpperCase();
>                                               if (item == stringToFind) {
>                                                       selectedIndex = i;
>                                                       trace('found it cbr');
>                                                       return;
>                                               }
>                                       }       
>                               selectedIndex = selected;
>                       }
>                       trace('not found cb renderer');
>               }
>       
>               private function focusEventHandler(e:FocusEvent):void {
>                               open();
>               }
>       }
> }
> 
> --- In [email protected], "Alex Harui" <aharui@> wrote:
> >
> > When the focus moves to the selected cell, the ComboBox shows up?
> > 
> >  
> > 
> > If the renderer is not an extended Label do you still see the problem?
> > 
> >  
> > 
> > Is there no way to make a simple DG using your extended renderer and
> > editor and post it?
> > 
> >  
> > 
> > ________________________________
> > 
> > From: [email protected]
[mailto:[EMAIL PROTECTED] On
> > Behalf Of j_lentzz
> > Sent: Wednesday, November 07, 2007 5:03 PM
> > To: [email protected]
> > Subject: [flexcoders] Re: Bouncing Focus in DataGrid
> > 
> >  
> > 
> > Sorry about that. The editor is an extended ComboBox. The renderer 
> > is an extended Label. Clicking on a cell in the datagrid makes the 
> > first cell on the first row briefly get the focus, then the focus 
> > moves to the selected cell. It only does this the very first time 
> > you click in the grid - either after initially loading it with data, 
> > or after adding a row to it. After the first click, it does not 
> > briefly go to the first cell on the first row.
> > 
> > I hope this is clearer. I appreciate the help.
> > 
> > John
> > --- In [email protected]
<mailto:flexcoders%40yahoogroups.com>
> > , "Alex Harui" <aharui@> wrote:
> > >
> > > OK, I'm lost. Please re-state your findings so far. Note also 
> > that if
> > > your ComboBox editor is wrapped by a Container it isn't a true
> > > IFocusManagerComponent
> > > 
> > > 
> > > 
> > > ________________________________
> > > 
> > > From: [email protected]
<mailto:flexcoders%40yahoogroups.com>
> > 
> > [mailto:[email protected]
<mailto:flexcoders%40yahoogroups.com>
> > ] On
> > > Behalf Of j_lentzz
> > > Sent: Wednesday, November 07, 2007 9:14 AM
> > > To: [email protected]
<mailto:flexcoders%40yahoogroups.com> 
> > > Subject: [flexcoders] Re: Bouncing Focus in DataGrid
> > > 
> > > 
> > > 
> > > Sorry, I mistyped my last response. The Label is the renderer - not
> > > editor. I have the Label (or the extended version 
> > LabelWithDownArrow)
> > > as the renderer. The editor is my extended ComboBox. So, I'm not
> > > editing with a Label, but I am clicking on it to switch to the 
> > ComboBox.
> > > 
> > > John
> > > --- In [email protected]
> > <mailto:flexcoders%40yahoogroups.com>  <mailto:flexcoders%
> > 40yahoogroups.com>
> > > , "Alex Harui" <aharui@> wrote:
> > > >
> > > > If the editor is not an IFocusManagerComponent, it is not 
> > a 'legal'
> > > > editor.
> > > > 
> > > > 
> > > > 
> > > > ________________________________
> > > > 
> > > > From: [email protected]
> > <mailto:flexcoders%40yahoogroups.com>  <mailto:flexcoders%
> > 40yahoogroups.com>
> > > [mailto:[email protected]
> > <mailto:flexcoders%40yahoogroups.com>  <mailto:flexcoders%
> > 40yahoogroups.com>
> > > ] On
> > > > Behalf Of j_lentzz
> > > > Sent: Wednesday, November 07, 2007 4:39 AM
> > > > To: [email protected]
<mailto:flexcoders%40yahoogroups.com>
> > <mailto:flexcoders%
> > 40yahoogroups.com> 
> > > > Subject: [flexcoders] Re: Bouncing Focus in DataGrid
> > > > 
> > > > 
> > > > 
> > > > Unfortunately not, it is a dynamically created datagrid. However, 
> > I
> > > > did discover some interesting things. If I use my custom renderer 
> > and
> > > > set rendererIsEditor=true, it doesn't do the bouncing focus 
> > thing. If
> > > > I go back to my original code and set the renderer as a 
> > TextInput, it
> > > > doesn't do the bouncing thing. When I set the editor to either a
> > > > Label or my LabelWithDownArrow (an extended Label with the 
> > combobox
> > > > down arrow), I get the bouncing focus. Could it somehow be 
> > because a
> > > > Label isn't editable? If so, any ideas how to get around it?
> > > > 
> > > > Thanks a lot.
> > > > 
> > > > John
> > > > --- In [email protected]
> > <mailto:flexcoders%40yahoogroups.com> 
> > > <mailto:flexcoders%40yahoogroups.com>
> > > <mailto:flexcoders%40yahoogroups.com>
> > > > , "Alex Harui" <aharui@> wrote:
> > > > >
> > > > > Can you post a small test case?
> > > > > 
> > > > > 
> > > > > 
> > > > > ________________________________
> > > > > 
> > > > > From: [email protected]
> > <mailto:flexcoders%40yahoogroups.com> 
> > > <mailto:flexcoders%40yahoogroups.com>
> > > <mailto:flexcoders%40yahoogroups.com>
> > > > [mailto:[email protected]
> > <mailto:flexcoders%40yahoogroups.com> 
> > > <mailto:flexcoders%40yahoogroups.com>
> > > <mailto:flexcoders%40yahoogroups.com>
> > > > ] On
> > > > > Behalf Of j_lentzz
> > > > > Sent: Tuesday, November 06, 2007 3:41 PM
> > > > > To: [email protected]
> > <mailto:flexcoders%40yahoogroups.com>  <mailto:flexcoders%
> > 40yahoogroups.com>
> > > <mailto:flexcoders%40yahoogroups.com> 
> > > > > Subject: [flexcoders] Re: Bouncing Focus in DataGrid
> > > > > 
> > > > > 
> > > > > 
> > > > > It happens also when I first populate the datagrid or add a 
> > row. In
> > > > > either case, nothing is selected in the datagrid. When I select
> > > > > something, the top most left cell briefly gets the focus and
> > > switches
> > > > > the component to an editor then back to a renderer and then the
> > > > > selected item becomes an editor.
> > > > > 
> > > > > John
> > > > > --- In [email protected]
> > <mailto:flexcoders%40yahoogroups.com> 
> > > <mailto:flexcoders%40yahoogroups.com> 
> > > > <mailto:flexcoders%40yahoogroups.com>
> > > > <mailto:flexcoders%40yahoogroups.com>
> > > > > , George <yahoo@> wrote:
> > > > > >
> > > > > > When you add a new row, dataProvider changed so DG will be
> > > refreshed
> > > > 
> > > > > > totally, your item editing process will be eliminated at that
> > > time.
> > > > > > You need a callLater() to reselect .selectedIndex to the new 
> > row,
> > > it
> > > > 
> > > > > > will be highlighted. Then try to move focus back to the 
> > renderer.
> > > > > > 
> > > > > > George
> > > > > > 
> > > > > > Alex Harui wrote:
> > > > > > > Are the renderers also editors? rendererIsEditor="true". If 
> > so,
> > > > > is the
> > > > > > > renderer an IFocusManagerComponent?
> > > > > > > ________________________________
> > > > > > >
> > > > > > > From: [email protected]
> > <mailto:flexcoders%40yahoogroups.com> 
> > > <mailto:flexcoders%40yahoogroups.com> 
> > > > <mailto:flexcoders%40yahoogroups.com> 
> > > > > <mailto:flexcoders%40yahoogroups.com> 
> > > > > [mailto:[email protected]
> > <mailto:flexcoders%40yahoogroups.com> 
> > > <mailto:flexcoders%40yahoogroups.com> 
> > > > <mailto:flexcoders%40yahoogroups.com>
> > > > <mailto:flexcoders%40yahoogroups.com>
> > > > > ] On
> > > > > > > Behalf Of j_lentzz
> > > > > > > Sent: Tuesday, November 06, 2007 6:06 AM
> > > > > > > To: [email protected]
> > <mailto:flexcoders%40yahoogroups.com> 
> > > <mailto:flexcoders%40yahoogroups.com> 
> > > > <mailto:flexcoders%40yahoogroups.com>
> > > > <mailto:flexcoders%40yahoogroups.com>
> > > > > 
> > > > > > > Subject: [flexcoders] Bouncing Focus in DataGrid
> > > > > > >
> > > > > > > Hello All,
> > > > > > >
> > > > > > > I have an app that allows the user to add rows to a 
> > datagrid.
> > > The
> > > > > > > rows contain components that have separate item editors and
> > > > > renderers.
> > > > > > > What is happening is that after a new row is added to the
> > > datagrid
> > > > > > > and the user clicks on a cell that is not the first cell in 
> > the
> > > > > first
> > > > > > > row, the focus briefly goes to the first cell in the first 
> > row
> > > and
> > > > > > > then to the actual cell selected. It doesn't stay there 
> > long,
> > > but
> > > > > > > long enough to see the cell switch to the item editor and 
> > then
> > > > back
> > > > > to
> > > > > > > the renderer. Has anyone else seen this or have a way to 
> > prevent
> > > > it?
> > > > > > >
> > > > > > > Thanks,
> > > > > > >
> > > > > > > John
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>


Reply via email to