For those following this thread, I was able to get around one of my
noted issues with a small hack.  

As noted previously, the FlexEvent.DATA_CHANGE event is not being
fired reliably, resulting in my item renderer not being updated.  To
remidy this, in my dataGrid itemEditEnd event handler I call the
itemRender via editedItemRenderer and execute a method that forces the
itemRenderer to be updated.

Not pretty, but it works.

If I could now just nail down the focus issue with the popup.... :)


Mike



--- In [email protected], "mcaplan_labnet" <[EMAIL PROTECTED]> wrote:
>
> Hi Alex,
> 
> That would be super appreciated!
> 
> Best,
> 
> Mike
> 
> 
> --- In [email protected], "Alex Harui" <aharui@> wrote:
> >
> > I might have time to look at this over the weekend.
> > 
> >  
> > 
> > ________________________________
> > 
> > From: [email protected]
[mailto:[EMAIL PROTECTED] On
> > Behalf Of mcaplan_labnet
> > Sent: Tuesday, December 11, 2007 6:47 PM
> > To: [email protected]
> > Subject: [flexcoders] Re: Use a Popup as itemEditor in Datagrids
> > 
> >  
> > 
> > I seem to keep on banging my head against a wall on this issue. I've
> > been plugging away at this issue for several days now with little
> > progress.
> > 
> > I set the popup.owner property as recommended by Alex. This seemed to
> > have helped, but issues still persist. 
> > 
> > I "cheated" and created an inPopup flag in the parent document to try
> > and thwart popup loops (see code snips below). I say cheated, because
> > I gathered from Alex's suggestion that I should not need to do that. 
> > 
> > Regardless, that hack worked marginally well, but I'm having
> > additional issue, and I know it is because I am just not getting it. 
> > My hunch is that these additional issues are side effects to my
> > improper implementation of the popup in the itemEditor.
> > 
> > These "side effect" issues I am seeing include:
> > 
> > - My itemRenderer is not being reliably updated. To be clear, the
> > data from the itemEditor is being properly trapped, and the
> > dataProvider updated. The itemRender is not being updated because it
> > appears that the dataChange event on the itemRenderer is not being
> > dispatched -- at least not reliably. It is being dispatched and the
> > itemRenderer updated when I edit a different column in the datagrid. 
> > 
> > - If I click outside of my modal popup, focus is lost on the current
> > itemEditor cell resulting in the first row itemEditor being executed
> > immediately following the close of my initial popup. I've _covered_
> > my popup with focusEnabled = false statements which work great in the
> > popup. But outside popup clicks messes the focus.
> > 
> > For my first flex project, I've bitten off much more than I can chew
> > here. :) I've gone through the Flex 3 docs, flexcoders, and google
> > end-to-end, and I'm just not seeing a solution.
> > 
> > Any kind gurus out there that can offer some guidance? I've included
> > code snippets for all the components below.
> > 
> > Thanks!
> > 
> > Mike
> > 
> > <?xml version="1.0" encoding="utf-8"?>
> > <!-- modules.Case -->
> > <comp:ModuleTitleWindow xmlns:mx="http://www.adobe.com/2006/mxml
> > <http://www.adobe.com/2006/mxml> "
> > layout="absolute" xmlns:comp="components.*" initialize="init();"
> > verticalScrollPolicy="off" horizontalScrollPolicy="off" title="Case
> > {caseNumber}" showCloseButton="true" close="closePopUp();"
> > borderAlpha="1" width="100%" height="100%"
> > implements="modules.Case.ICase">
> > <mx:Script>
> > <![CDATA[
> > import mx.events.DataGridEventReason;
> > import mx.events.DataGridEvent;
> > 
> > /**
> > * Flag for modules.Case.TeethEditor to ensure there is no
> > popup loop
> > */
> > public var inPopup:Boolean = false;
> > 
> > /**
> > * procedures datagrid itemEditEnd event handler
> > */
> > private function procedureUpdate(event:DataGridEvent):void
> > {
> > if (event.reason == DataGridEventReason.CANCELLED) {
> > return;
> > }
> > 
> > switch (event.dataField) {
> > case "macro_id" :
> > // Disable copying data back to the control.
> > event.preventDefault();
> > 
> > // Get new city from editor.
> > procedures.selectedItem.description =
> >
MacroIdEditor(DataGrid(event.target).itemEditorInstance).selectedItem.de
> > scription;
> > 
> > // Close the cell editor.
> > procedures.destroyItemEditor();
> > 
> > // Notify the list control to update its display.
> > 
> > procedures.dataProvider.itemUpdated(event.itemRenderer.data);
> > break;
> > 
> > case "teeth" :
> > // Disable copying data back to the control.
> > event.preventDefault();
> > 
> > if (!inPopup) { // Check to see that the popup
> > is not active
> > 
> > // Get new city from editor.
> > procedures.selectedItem.teeth =
> > TeethEditor(DataGrid(event.target).itemEditorInstance).teeth;
> > 
> > // Notify the list control to update its
> > display.
> > 
> > procedures.dataProvider.itemUpdated(event.itemRenderer.data);
> > 
> > // Close the cell editor.
> > procedures.destroyItemEditor();
> > }
> > break;
> > }
> > }
> > 
> > ]]>
> > </mx:Script>
> > 
> > <mx:DataGrid id="procedures" editable="true"
> > itemEditEnd="procedureUpdate(event);">
> > <mx:dataProvider>
> > <mx:ArrayCollection>
> > <mx:source>
> > <mx:Object macro_id="D2456" teeth="11" />
> > <mx:Object macro_id="D2445" teeth="12,13" />
> > <mx:Object macro_id="D2658" teeth="21,22" />
> > </mx:source>
> > </mx:ArrayCollection>
> > </mx:dataProvider>
> > <mx:columns>
> > <mx:DataGridColumn dataField="macro_id" editable="true"
> > itemEditor="modules.Case.MacroIdEditor" />
> > <mx:DataGridColumn dataField="teeth" editable="true"
> > itemEditor="modules.Case.TeethEditor" editorDataField="teeth"
> > itemRenderer="modules.Case.TeethRenderer" />
> > </mx:columns>
> > </mx:DataGrid>
> > 
> > </comp:ModuleTitleWindow>
> > 
> > <?xml version="1.0" encoding="utf-8"?>
> > <!-- modules.Case.TeethEditor -->
> > <mx:TextInput xmlns:mx="http://www.adobe.com/2006/mxml
> > <http://www.adobe.com/2006/mxml> "
> > creationComplete="_init()" text="{_converted}" editable="false">
> > <mx:Script>
> > <![CDATA[
> > import modules.Case;
> > import mx.managers.PopUpManager;
> > import modules.Case.TeethSelector;
> > import mx.events.FlexEvent;
> > import mx.utils.StringUtil;
> > 
> > /**
> > * Teeth selected
> > */
> > [Bindable]
> > public function get teeth():String
> > {
> > return _teeth;
> > }
> > public function set teeth(value:String):void
> > {
> > _teeth = value;
> > data.teeth = _teeth;
> > }
> > private var _teeth:String;
> > 
> > /**
> > * text to display in textarea 
> > * @ private
> > */
> > [Bindable]
> > private var _converted:String;
> > 
> > /**
> > * Tooth selector popup instance
> > */
> > private var _popup:TeethSelector;
> > 
> > /**
> > * Reference to the parent document which contains the datagrid
> > */
> > private var _c:Case;
> > 
> > 
> > /**
> > * creationComplete event handler
> > */
> > private function _init():void
> > {
> > teeth = data.teeth;
> > 
> > addEventListener(FlexEvent.DATA_CHANGE, _dataChanged);
> > 
> > _updateText(data.teeth);
> > 
> > _c = parentDocument as Case;
> > 
> > // Only show the popup teeth selector 
> > // if the popup isn't already displayed
> > if (!_c.inPopup) {
> > _c.inPopup = true;
> > _popTeethSelector();
> > }
> > }
> > 
> > /**
> > * Display popup teeth selector
> > */
> > private function _popTeethSelector():void
> > {
> > _popup = new TeethSelector();
> > _popup.teeth = teeth;
> > 
> > // handle popup updated event
> > _popup.addEventListener("updated", _updateTeeth);
> > 
> > // handle popup closing event
> > _popup.addEventListener("closing", _closePopup);
> > 
> > _popup.focusEnabled = false;
> > PopUpManager.addPopUp(_popup,
> > _c.procedures.editedItemRenderer as DisplayObject, true);
> > 
> > // popup owner is the current datagrid item renderer
> > _popup.owner = _c.procedures.editedItemRenderer as
> > DisplayObjectContainer; 
> > PopUpManager.centerPopUp(_popup);
> > }
> > 
> > /**
> > * Handle the updated event of the popup teeth 
> > * selector by grabbing the newly selected teeth and
> > * and removing the popup
> > */
> > private function _updateTeeth(e:Event):void
> > {
> > teeth = _popup.teeth;
> > _c.inPopup = false;
> > _updateText(teeth);
> > PopUpManager.removePopUp(_popup);
> > }
> > 
> > /**
> > * Handle the closing event of the poup teeth
> > * selector by closing the popup
> > */
> > private function _closePopup(e:Event):void
> > {
> > _c.inPopup = false;
> > PopUpManager.removePopUp(_popup);
> > }
> > 
> > /**
> > * Update the displayed textarea text 
> > */
> > private function _updateText(teeth:String):void
> > {
> > // updates _converted ...
> > }
> > 
> > /**
> > * dataChanged event handler - this updates the displayed
> > * textarea text
> > */
> > private function _dataChanged(e:Event):void
> > {
> > teeth = data.teeth;
> > _updateText(data.teeth);
> > }
> > 
> > ]]>
> > </mx:Script> 
> > </mx:TextInput>
> > 
> > <?xml version="1.0" encoding="utf-8"?>
> > <!-- modules.Case.TeethSelector -->
> > <mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml
> > <http://www.adobe.com/2006/mxml> " title="Tooth
> > Selector" creationComplete="_init()" showCloseButton="true"
> > close="this.dispatchEvent( new Event('closing') );"
> > focusEnabled="false">
> > 
> > <mx:Metadata>
> > [Event("updated")]
> > </mx:Metadata>
> > <mx:Metadata>
> > [Event("closing")]
> > </mx:Metadata>
> > <mx:Script>
> > <![CDATA[
> > import mx.managers.PopUpManager;
> > import mx.controls.CheckBox;
> > import mx.utils.StringUtil;
> > 
> > public var teeth:String;
> > 
> > /**
> > * creationComplete event handler
> > */
> > private function _init():void
> > {
> > // set selected teeth
> > }
> > 
> > /**
> > * Save function. Updates the teeth variable
> > * and dispatches the updated event 
> > */
> > private function _done():void
> > {
> > teeth = // ....
> > 
> > this.dispatchEvent( new Event("updated") );
> > }
> > ]]>
> > </mx:Script>
> > 
> > <mx:Canvas>
> > <mx:CheckBox x="28.2" y="111" id="t28" styleName="t28"
> > focusEnabled="false"/>
> > <mx:CheckBox x="152.2" y="141.3" id="t48" styleName="t48"
> > focusEnabled="false"/>
> > <!-- ... -->
> > </mx:Canvas>
> > </mx:TitleWindow>
> > 
> > <?xml version="1.0" encoding="utf-8"?>
> > <!-- modules.Case.TeethRenderer -->
> > <mx:Label xmlns:mx="http://www.adobe.com/2006/mxml
> > <http://www.adobe.com/2006/mxml> " width="100%"
> > creationComplete="_init()" text="{_converted}">
> > <mx:Script>
> > <![CDATA[
> > import mx.utils.StringUtil;
> > import mx.events.FlexEvent;
> > 
> > /**
> > * label text
> > */
> > [Bindable]
> > private var _converted:String;
> > 
> > /**
> > * creationComplete event handler
> > */
> > private function _init():void
> > {
> > _updateText();
> > addEventListener(FlexEvent.DATA_CHANGE, _dataChanged);
> > }
> > 
> > /**
> > * update label displayed text
> > */
> > private function _updateText():void
> > {
> > // update _converted var here ...
> > }
> > 
> > /**
> > * dataChanged event handler. Updates the label text
> > */
> > private function _dataChanged(e:Event):void
> > {
> > _updateText();
> > }
> > ]]>
> > </mx:Script>
> > </mx:Label>
> >
>


Reply via email to