internal override void RebuildGrid()
        {
            FGrid.fMeasures.InitMeasures();
            var       LA        = FGrid.FLayout;
            ChartAxis colorAxis = null;

            fColorAxisDescriptor = new ChartAxisDescriptor();
            fColorGridMembers    = null;

            SortedDictionary <int, Member>
            f_ColorGridMembers = null;     // <ID, index in the corresponding Members collection>

            if (LA.fColorAxisItem != null)
            {
                if (LA.fColorAxisItem is Measure)
                {
                    fColorAxisDescriptor.fDescriptor = LA.fColorAxisItem;
                    colorAxis = new ChartAxis(this, ChartAxisFormat.Continuous, fColorAxisDescriptor);
                }
                if (LA.fColorAxisItem is Hierarchy)
                {
                    var H = (Hierarchy)LA.fColorAxisItem;
                    H.DefaultInit(1);
                    fColorAxisDescriptor.fDescriptor = ((Hierarchy)LA.fColorAxisItem).FirstVisibleLevel();
                    if (fColorAxisDescriptor.fDescriptor != null)
                    {
                        fColorGridMembers = new List <Member>(((Level)fColorAxisDescriptor.fDescriptor).Members);
                        colorAxis         = new ChartAxis(this, ChartAxisFormat.Discrete, fColorAxisDescriptor);
                    }
                }
            }


            fForeColorAxisDescriptor = new ChartAxisDescriptor();
            fForeColorGridMembers    = null;
            SortedDictionary <int, Member>
            f_ForeColorChartMembers = null;     // <ID, index in the corresponding Members collection>

            if (LA.fColorForeAxisItem != null)
            {
                if (LA.fColorForeAxisItem is Measure)
                {
                    fForeColorAxisDescriptor.fDescriptor = LA.fColorForeAxisItem;
                    colorAxis = new ChartAxis(this, ChartAxisFormat.Continuous, fForeColorAxisDescriptor);
                }

                if (LA.fColorForeAxisItem is Hierarchy)
                {
                    var H = (Hierarchy)LA.fColorForeAxisItem;
                    H.DefaultInit(1);
                    fForeColorAxisDescriptor.fDescriptor = ((Hierarchy)LA.fColorForeAxisItem).FirstVisibleLevel();
                    if (fForeColorAxisDescriptor.fDescriptor != null)
                    {
                        fForeColorGridMembers =
                            new List <Member>(((Level)fForeColorAxisDescriptor.fDescriptor).Members);
                        colorAxis = new ChartAxis(this, ChartAxisFormat.Discrete, fForeColorAxisDescriptor);
                    }
                }
            }

            //// making the cartesian product of used levels

            //List<Level> ldecart = new List<Level>();
            //SortedList<string, Level> l_keys = new SortedList<string, Level>(); // list of levels to hold the IChartCell array
            //for (int i = 0; i < LA.fColumnLevels.Count; i++)
            //{
            //    Level l = LA.fColumnLevels[i];
            //    //if ((i < LA.fColumnLevels.Count - 1) &&
            //    //    (LA.fColumnLevels[i + 1].Hierarchy == l.Hierarchy)) continue;
            //    ldecart.Add(l);
            //}

            //for (int i = 0; i < LA.fRowLevels.Count; i++)
            //{
            //    Level l = LA.fRowLevels[i];

            //    //if ((i < LA.fRowLevels.Count - 1) &&
            //    //    (LA.fRowLevels[i + 1].Hierarchy == l.Hierarchy)) continue;
            //    ldecart.Add(l);
            //}


            //if (LA.fColorAxisItem is Hierarchy)
            //{
            //    Level l = ((Hierarchy)LA.fColorAxisItem).FirstVisibleLevel();
            //    ldecart.Add(l);
            //    CheckLevelForFetchedParents(l);
            //}


            //// fetching ascendants of members of used levels if it is necessary (it should be done BEFORE fetching the lines)

            //foreach (Level l in LA.fRowLevels)
            //{
            //    CheckLevelForFetchedParents(l);
            //}

            //foreach (Level l in LA.fColumnLevels)
            //{
            //    CheckLevelForFetchedParents(l);
            //}


            //// fetching the data for size and color modifiers

            //Line colorLine = null;
            //ChartAxis colorAxis = null;
            //if (LA.fColorAxisItem is Measure)
            //{
            //    colorLine = FGrid.FEngine.RetrieveRelatedLine(ldecart, (Measure)LA.fColorAxisItem);
            //    colorAxis = new ChartAxis(this, ChartAxisFormat.Continuous, fColorAxisDescriptor);
            //}
            //else
            //{
            //    if (LA.fColorAxisItem is Hierarchy)
            //    {
            //        colorAxis = new ChartAxis(this, ChartAxisFormat.Discrete, fColorAxisDescriptor);
            //    }
            //}

            //List<Level> clue = new List<Level>();

            //// fetching the data
            //SortedList<string, List<CubeDataNumeric>> datalist = new SortedList<string, List<CubeDataNumeric>>();
            //SortedList<string, Line> datalist2 = new SortedList<string, Line>();
            //Line xLine = null;

            //foreach (Measure m in FGrid.fMeasures)
            //{
            //    if (m.Visible == false)
            //        continue;
            //    datalist2.Add(m.UniqueName, FGrid.FEngine.RetrieveRelatedLine(ldecart, m));
            //}
            //// all the data has been prepared for fetching

            //if (!FGrid.DeferLayoutUpdate)
            //    FGrid.FEngine.DoRetrieveData();


            //foreach (KeyValuePair<string, Line> dl2 in datalist2)
            //    datalist.Add(dl2.Key, FGrid.FEngine.RetrieveCubeData(dl2.Value, out clue));


            //int coloraxis_idx = -1;
            //if (LA.fColorAxisItem is Hierarchy)
            //{
            //    coloraxis_idx = clue.IndexOf(((Hierarchy)LA.fColorAxisItem).FirstVisibleLevel());
            //    ((Hierarchy)LA.fColorAxisItem).FirstVisibleLevel().SetSortPosition();
            //}

            //if (FGrid.fMeasures.Count > 0)
            //{
            //    foreach (Measure m in FGrid.fMeasures)
            //    {
            //        if (m.Visible == false)
            //            continue;

            //        List<CubeDataNumeric> data;
            //        datalist.TryGetValue(m.UniqueName, out data);

            //        foreach (CubeDataNumeric dn in data)
            //        {

            //            ChartCellDetails CD = new ChartCellDetails(FGrid, clue, dn.MemberIDs);
            //            Member colorMember = null;

            //            if (colorLine != null)
            //            {
            //                double sd;
            //                if (colorLine.GetNumericData(dn.LineIdx, out sd, out CD._ColorValueFormatted))
            //                {
            //                    CD._ColorValue = sd;
            //                    colorAxis.fMax = Math.Max(colorAxis.fMax, sd);
            //                    colorAxis.fMin = Math.Min(colorAxis.fMin, sd);
            //                }
            //            }
            //            else
            //            {
            //                if (LA.fColorAxisItem is Hierarchy)
            //                {
            //                    Member mc = clue[coloraxis_idx].GetMemberByID(dn.MemberIDs[coloraxis_idx]);
            //                    colorMember = mc;
            //                    if (!f_ColorGridMembers.ContainsKey(mc.FSortPosition))
            //                        f_ColorGridMembers.Add(mc.FSortPosition, mc);
            //                }
            //            }
            //        }
            //    }
            //}
            //else
            //{
            //    if (datalist.Count > 0)
            //    {
            //        List<CubeDataNumeric> data = datalist.Values[0];

            //        foreach (CubeDataNumeric dn in data)
            //        {
            //            Member colorMember = null;
            //            ChartCellDetails CD = new ChartCellDetails(FGrid, clue, dn.MemberIDs);

            //            if (colorLine != null)
            //            {
            //                double sd;
            //                if (colorLine.GetNumericData(dn.LineIdx, out sd, out CD._ColorValueFormatted))
            //                {
            //                    CD._ColorValue = sd;
            //                    colorAxis.fMax = Math.Max(colorAxis.fMax, sd);
            //                    colorAxis.fMin = Math.Min(colorAxis.fMin, sd);
            //                }
            //            }
            //            else
            //            {
            //                if (LA.fColorAxisItem is Hierarchy)
            //                {
            //                    Member mc = clue[0].GetMemberByID(dn.MemberIDs[0]);
            //                    colorMember = mc;
            //                    if (!f_ColorGridMembers.ContainsKey(mc.FSortPosition))
            //                        f_ColorGridMembers.Add(mc.FSortPosition, mc);
            //                }
            //            }
            //        }
            //    }
            //}


            //if (f_ColorGridMembers != null)
            //{
            //    fColorGridMembers = new List<Member>(f_ColorGridMembers.Values);
            //}
        }
 internal override void ClearMembers()
 {
     base.ClearMembers();
     fColorAxisDescriptor     = null;
     fForeColorAxisDescriptor = null;
 }