Hello,

I'm writing some tools to automate clicking items in datagrids through 
mouse events.  Right now that means scrolling to an index, and calling 
mouseDown, then mouseUp on datagrid.indexToItemRenderer(idx).  The 
problem is if the physical mouse cursor happens to be below the 
datagrid when the mouseDown is called, the datagrid will nudge scroll 
before the mouseUp is called if there's any delay whatsoever.

I don't want to necessarily disable nudge scrolling for the grid; this 
is merely for automation purposes, so I was wondering if there was any 
way on the fly to either force the mouse to move into the datagrid so 
it won't nudge scroll, or to somehow disable nudge scrolling on the fly 
quickly, so I can run the automation.

I've put together a simple (and poorly written, sorry!) app showing the 
behavior.  If you click the button, it dispatches a mouseDown event to 
item 0 in the datagrid, then sets up a 10 ms timer.  When that timer 
fires, it checks if the item is still visible before firing the mouseUp.


<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"; 
layout="absolute">
    <mx:Script>
        <![CDATA[
            import mx.controls.Text;
            import flash.sampler.NewObjectSample;
            import flash.utils.setInterval;
            function onButtonClick(event:MouseEvent):void {
                textArea.text = "";
                var mouseDown:MouseEvent = new MouseEvent
(MouseEvent.MOUSE_DOWN, true, false, 0, 0, null, false, false, false, 
true);
                datagrid.scrollToIndex(0);
                var obj:Object = datagrid.indexToItemRenderer(0);
                if(obj == null) {
                    textArea.text += "Object was null!\n";
                }
                else {
                    textArea.text += "Object: " + obj.toString() + "\n";
                    obj.dispatchEvent(mouseDown);
                }
                
                
                var t:Timer = new Timer(10, 1);
                t.addEventListener(TimerEvent.TIMER, timerHandler);
                t.start();
            }
            
            function timerHandler(evt:Object) {
                var mouseUp:MouseEvent = new MouseEvent
(MouseEvent.MOUSE_UP, true, false, 0, 0, null, false, false, false, 
false);
                var obj2:Object = datagrid.indexToItemRenderer(0);
                if(obj2 == null) {
                    textArea.text += "Object2 was null!\n";
                }
                else {
                    textArea.text += "Object2: " + obj2.toString() 
+ "\n";
                    obj2.dispatchEvent(mouseUp);
                }
            }
        ]]>
    </mx:Script>
    <mx:DataGrid id="datagrid" y="10" width="501" horizontalCenter="-9">
        <mx:dataProvider>
            <mx:Object col1="a" col2="a"/>
            <mx:Object col1="b" col2="b"/>
            <mx:Object col1="c" col2="b"/>
            <mx:Object col1="d" col2="b"/>
            <mx:Object col1="e" col2="b"/>
            <mx:Object col1="f" col2="b"/>
            <mx:Object col1="g" col2="b"/>
            <mx:Object col1="h" col2="h"/>
            <mx:Object col1="i" col2="i"/>
            <mx:Object col1="j" col2="j"/>
        </mx:dataProvider>
        <mx:columns>
            <mx:DataGridColumn headerText="Column 1" dataField="col1"/>
            <mx:DataGridColumn headerText="Column 2" dataField="col2"/>
        </mx:columns>
    </mx:DataGrid>
    <mx:Button id="button" y="479" label="Click Me!" 
click="onButtonClick(event)" horizontalCenter="0"/>
    <mx:TextArea id="textArea" y="216" width="501" height="255" 
horizontalCenter="-9"/>
    
</mx:Application>



Reply via email to