package range_charts.extended_series
{
import mx.charts.HitData;
import mx.charts.chartClasses.CartesianTransform;
import mx.charts.series.LineSeries;
import mx.charts.series.items.LineSeriesItem;
import mx.graphics.IStroke;
import mx.graphics.LinearGradientStroke;
import mx.graphics.Stroke;

public class CustomLineSeries extends LineSeries
{
 override public function
findDataPoints(x:Number,y:Number,sensitivity:Number):Array
    {
        // esg, 8/7/06: if your mouse is over a series when it gets added
and displayed for the first time, this can get called
        // before updateData, and before and render data is constructed. The
right long term fix is to make sure a stubbed out
        // render data is _always_ present, but that's a little disruptive
right now.
        if (interactive == false || !renderData)
            return [];
        var pr:Number = getStyle("radius");
        var minDist2:Number  = pr + sensitivity;
        minDist2 *= minDist2;
        var minItem:LineSeriesItem = null;
        var pr2:Number = pr * pr;

        var len:int = renderData.filteredCache.length;
        if (len == 0)
            return [];
        if(sortOnXField == true)
        {
            var low:Number = 0;
            var high:Number = len;
            var cur:Number = Math.floor((low+high)/2);

            var bFirstIsNaN:Boolean = isNaN(renderData.filteredCache[0]);

            while (true)
            {
                var v:LineSeriesItem = renderData.filteredCache[cur];
                if (!isNaN(v.yFilter) && !isNaN(v.xFilter))
                {
                    //var dist:Number = (v.x  - x)*(v.x  - x) + (v.y -
y)*(v.y -y);
                    var dist:Number = (v.x - x)*(v.x - x) ;
                    if (dist <= minDist2)
                    {
                        minDist2 = dist;
                        minItem = v;
                    }
                }

if (v.x < x || (isNaN(v.x) && bFirstIsNaN))
                {
                    low = cur;
                    cur = Math.floor((low + high)/2);
                    if (cur == low)
                        break;
                }
                else
                {
                    high = cur;
                    cur = Math.floor((low + high)/2);
                    if (cur == high)
                        break;
                }
            }
        }
        else
        {
            var i:uint;
            for (i=0;i<len;i++)
            {
               v = renderData.filteredCache[i];
               if (!isNaN(v.yFilter) && !isNaN(v.xFilter))
                {
                   //dist = (v.x  - x)*(v.x  - x) + (v.y - y)*(v.y -y);
                   dist = (v.x - x)*(v.x - x) ;
                   if (dist <= minDist2)
                   {
                       minDist2 = dist;
                       minItem = v;
                   }
                }
           }
        }

        if (minItem)
        {
            var hd:HitData = new
HitData(createDataID(minItem.index),Math.sqrt(minDist2),minItem.x,minItem.y,minItem);
            var istroke:IStroke = getStyle("lineStroke");
            if (istroke is Stroke)
                hd.contextColor = Stroke(istroke).color;
            else if (istroke is LinearGradientStroke)
            {
                var gb:LinearGradientStroke = LinearGradientStroke(istroke);
                if (gb.entries.length > 0)
                    hd.contextColor = gb.entries[0].color;
            }
            hd.dataTipFunction = formatDataTip;
            return [ hd ];
        }
        return [];
    }


    private function formatDataTip(hd:HitData):String
    {
        var dt:String = "";

        var n:String = displayName;
        if (n && n != "")
            dt += "<b>" + n + "</b><BR/>";
        var xName:String =
dataTransform.getAxis(CartesianTransform.HORIZONTAL_AXIS).displayName;
        if (xName != "")
            dt += "<i>" + xName+ ":</i> ";
        dt +=
dataTransform.getAxis(CartesianTransform.HORIZONTAL_AXIS).formatForScreen(
            LineSeriesItem(hd.chartItem).xValue) + "\n";

        var yName:String =
dataTransform.getAxis(CartesianTransform.VERTICAL_AXIS).displayName;
        if (yName != "")
            dt += "<i>" + yName + ":</i> ";
        dt +=
dataTransform.getAxis(CartesianTransform.VERTICAL_AXIS).formatForScreen(
            LineSeriesItem(hd.chartItem).yValue) + "\n";

        return dt;
    }


}
}



<custom_series:CustomLineSeries id="baseSeries" name="Reading Value"
xField="readingDate" yField="reading" displayName="Reading Value"
stroke="{new Stroke(0xFF0000, 0)}"
               fill="{new SolidColor(0xFF0000, 0.6)}" lineStroke="{new
Stroke(0xFF0000, 1)}" form="curve" interpolateValues="false"
                lineSegmentRenderer="mx.charts.renderers.LineRenderer"
radius="2"
                   />





On Fri, Nov 21, 2008 at 1:48 PM, Sefi Ninio <[EMAIL PROTECTED]> wrote:

>   Hi Brendan,
>
> Could you maybe paste your implementation of the extending class?
>
> Thanks,
> Sefi
>
> On Fri, Nov 21, 2008 at 8:41 PM, Sefi Ninio <[EMAIL PROTECTED]> wrote:
>
>> Hi Brendan
>>
>> Thanks for the reply, I'll give it a try.
>>
>> Sefi
>>
>>
>> On Fri, Nov 21, 2008 at 6:34 PM, Brendan Meutzner <[EMAIL PROTECTED]>wrote:
>>
>>>   Claude Hussenet has come up with a solution for this.  Here's the past
>>> post.
>>>
>>> http://tech.groups.yahoo.com/group/flexcoders/message/90045
>>>
>>> I've used and it works great.
>>>
>>>
>>> Brendan
>>>
>>>
>>>
>>> On Fri, Nov 21, 2008 at 4:56 AM, Sefi Ninio <[EMAIL PROTECTED]>wrote:
>>>
>>>>   Hey,
>>>>
>>>> I have a chart set up and using dataTipFunction to format the datatips.
>>>> It works great.
>>>> However, what I'd really like, is to display the datatips for all the
>>>> series for the current x axis value the mouse pointer is over (and only
>>>> those).
>>>> Example: if the mouse pointer is over x value 10, and I have 3 line
>>>> series in that chart, then all 3 points correlating to x value 10 will have
>>>> their datatips visible.
>>>>
>>>> There are a few issues with this:
>>>> 1. I don't have an easy way to translate mouse pointer location on mouse
>>>> over to the relevant x axis value.
>>>> 2. Once I (hopefully) get the x value, I'd also have to have all y
>>>> values for the series (relatively simple).
>>>> 3. If I get here, I'll have to think of a way to cause the points to
>>>> show their datatip and ofcourse clear all previous open datatips...
>>>>
>>>> any ideas on either of those points?
>>>>
>>>> Thanks,
>>>> Sefi
>>>>
>>>>
>>>
>>>
>>> --
>>> Brendan Meutzner
>>> http://www.meutzner.com/blog/
>>>
>>
>>
>  
>



-- 
Brendan Meutzner
http://www.meutzner.com/blog/

Reply via email to