Hi Alex,

That would be super appreciated!

Best,

Mike


--- In [email protected], "Alex Harui" <[EMAIL PROTECTED]> 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