--- 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
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>