This issue has been fixed in 3.0.  Can you upgrade?

 

________________________________

From: [email protected] [mailto:[EMAIL PROTECTED] On
Behalf Of j_lentzz
Sent: Thursday, November 08, 2007 5:57 AM
To: [email protected]
Subject: [flexcoders] Re: Bouncing Focus in DataGrid

 

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
<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] <mailto:flexcoders%40yahoogroups.com>
, "Alex Harui" <[EMAIL PROTECTED]> 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:flexcoders%40yahoogroups.com>
[mailto:[email protected] <mailto:flexcoders%40yahoogroups.com>
] On
> Behalf Of j_lentzz
> Sent: Wednesday, November 07, 2007 5:03 PM
> To: [email protected] <mailto:flexcoders%40yahoogroups.com> 
> 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>
<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:flexcoders%40yahoogroups.com>
> 
> [mailto:[email protected]
<mailto:flexcoders%40yahoogroups.com>
<mailto:flexcoders%40yahoogroups.com>
> ] On
> > Behalf Of j_lentzz
> > Sent: Wednesday, November 07, 2007 9:14 AM
> > To: [email protected] <mailto:flexcoders%40yahoogroups.com>
<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> <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:flexcoders%
> 40yahoogroups.com>
> > [mailto:[email protected]
<mailto:flexcoders%40yahoogroups.com> 
> <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>
> <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>
> > <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: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 3:41 PM
> > > > To: [email protected]
<mailto:flexcoders%40yahoogroups.com> 
> <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>
> > > <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:flexcoders%40yahoogroups.com> 
> > > > [mailto:[email protected]
<mailto:flexcoders%40yahoogroups.com> 
> <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>
> > > <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