void initPivotGridButton_Click(object sender, RoutedEventArgs e)
		{
			// pivotGridControl.URL = WSDataUrl;
			pivotGridControl.Connection = ConnectionStringId;
			pivotGridControl.Query = tbMdxQuery.Text;
			pivotGridControl.UpdateScript = tbUpdateScript.Text;
			pivotGridControl.MembersViewMode = (Ranet.AgOlap.Controls.ViewModeTypes)cbMembersViewMode.SelectedIndex;
			pivotGridControl.MemberVisualizationType = (Ranet.Olap.Core.Data.MemberVisualizationTypes)cbMemberVisualizationType.SelectedIndex;
			pivotGridControl.DataReorganizationType = (Ranet.Olap.Core.Providers.DataReorganizationTypes)cbDataReorganizationType.SelectedIndex;
			pivotGridControl.DefaultMemberAction = (Ranet.AgOlap.Controls.MemberClickBehaviorTypes)cbDefaultMemberAction.SelectedIndex;
			pivotGridControl.ColumnTitleClickBehavior = (Ranet.AgOlap.Controls.ColumnTitleClickBehavior)cbColumnTitleClickBehavior.SelectedIndex;
			pivotGridControl.DrillDownMode = (Ranet.AgOlap.Controls.DrillDownMode)cbDrillDownMode.SelectedIndex;
			pivotGridControl.IsUpdateable = ckbIsUpdateable.IsChecked.Value;
			pivotGridControl.AutoWidthColumns = ckbAutoWidthColumns.IsChecked.Value;
			pivotGridControl.ColumnsIsInteractive = ckbColumnsIsInteractive.IsChecked.Value;
			pivotGridControl.RowsIsInteractive = ckbRowsIsInteractive.IsChecked.Value;
			pivotGridControl.UseColumnsAreaHint = ckbUseColumnsAreaHint.IsChecked.Value;
			pivotGridControl.UseRowsAreaHint = ckbUseRowsAreaHint.IsChecked.Value;
			pivotGridControl.UseCellsAreaHint = ckbUseCellsAreaHint.IsChecked.Value;
			pivotGridControl.UseCellConditionsDesigner = ckbUseCellConditionsDesigner.IsChecked.Value;
			if (!pivotGridControl.UseCellConditionsDesigner)
			{
				var conds = new CellConditionsDescriptor("[Measures].[Internet Sales Amount]");
				var cellApp = new CellAppearanceObject(Colors.Cyan, Colors.Black, Colors.Black);
				cellApp.Options.UseBackColor = true;
				// cellApp.Options.UseBorderColor=true;
				var cond = new CellCondition(CellConditionType.GreaterOrEqual, 1000000.0, 1000000.0, cellApp);
				conds.Conditions.Add(cond);
				pivotGridControl.CustomCellsConditions = new List<CellConditionsDescriptor>();
				pivotGridControl.CustomCellsConditions.Add(conds);
			}
			pivotGridControl.Initialize();
		}
        public void Initialize(CellConditionsDescriptor descriptor)
        {
            m_Descriptor = descriptor;

            IsEnabled          = Descriptor != null;
            MemberControl.Text = Descriptor != null ? Descriptor.MemberUniqueName : String.Empty;
            ConditionsList.Initialize(Descriptor != null ? Descriptor.Conditions.ToList <CellCondition>() : null);
            ConditionDetails.Initialize((Descriptor != null && Descriptor.Conditions.Count > 0) ? Descriptor.Conditions[0] : null);
        }
        public void Initialize(CellConditionsDescriptor descriptor)
        {
            m_Descriptor = descriptor;

            IsEnabled = Descriptor != null;
            MemberControl.Text = Descriptor != null ? Descriptor.MemberUniqueName : String.Empty;
            ConditionsList.Initialize(Descriptor != null ? Descriptor.Conditions.ToList<CellCondition>() : null);
            ConditionDetails.Initialize((Descriptor != null && Descriptor.Conditions.Count > 0) ? Descriptor.Conditions[0] : null);
        }
        public static CellConditionsDescriptor Deserialize(String str)
        {
            if (!String.IsNullOrEmpty(str))
            {
                StringReader str_reader = new StringReader(str);
                XmlReader    reader     = XmlReader.Create(str_reader);

                return(CellConditionsDescriptor.Deserialize(reader));
            }
            else
            {
                return(null);
            }
        }
        /// <summary>
        /// Возвращает список условий, который удовлетворяет значение ячейки
        /// </summary>
        /// <param name="value">Значение ячейки. double.NaN если значение равно NULL</param>
        /// <param name="conditions"></param>
        /// <returns></returns>
        public static List <CellCondition> TestToConditions(double value, CellConditionsDescriptor conditionDescriptor)
        {
            if (conditionDescriptor == null)
            {
                return(null);
            }

            List <CellCondition> list = new List <CellCondition>();

            foreach (CellCondition cond in conditionDescriptor.Conditions)
            {
                // Если значение ячейки равно null, то value == double.NaN
                // В этом случае пройдут только условия CellConditionType.None. Остальные во избежание казусов прокидываем
                if (value == double.NaN && cond.ConditionType != CellConditionType.None)
                {
                    continue;
                }

                double val1, val2;
                try
                {
                    val1 = Convert.ToDouble(cond.Value1);
                    val2 = Convert.ToDouble(cond.Value2);
                }
                catch
                {
                    continue;
                }

                bool ok = false;
                switch (cond.ConditionType)
                {
                case CellConditionType.Between:
                    if (val1 < value && value < val2)
                    {
                        ok = true;
                    }
                    break;

                case CellConditionType.NotBetween:
                    if (value <= val1 || val2 <= value)
                    {
                        ok = true;
                    }
                    break;

                case CellConditionType.Equal:
                    if (val1 == value)
                    {
                        ok = true;
                    }
                    break;

                case CellConditionType.Greater:
                    if (value > val1)
                    {
                        ok = true;
                    }
                    break;

                case CellConditionType.GreaterOrEqual:
                    if (value >= val1)
                    {
                        ok = true;
                    }
                    break;

                case CellConditionType.Less:
                    if (value < val1)
                    {
                        ok = true;
                    }
                    break;

                case CellConditionType.LessOrEqual:
                    if (value <= val1)
                    {
                        ok = true;
                    }
                    break;

                case CellConditionType.NotEqual:
                    if (value != val1)
                    {
                        ok = true;
                    }
                    break;

                case CellConditionType.None:
                    ok = true;
                    break;
                }

                if (ok)
                {
                    list.Add(cond);
                }
            }
            return(list);
        }
        static CellConditionsDescriptor Deserialize(XmlReader reader)
        {
            if (reader != null)
            {
                try
                {
                    CellConditionsDescriptor target = null;

                    if (!(reader.NodeType == XmlNodeType.Element &&
                          reader.Name == XML_CellConditionsDescriptor))
                    {
                        reader.ReadToFollowing(XML_CellConditionsDescriptor);
                    }

                    if (reader.NodeType == XmlNodeType.Element &&
                        reader.Name == XML_CellConditionsDescriptor)
                    {
                        target = new CellConditionsDescriptor();
                        reader.Read();

                        var data = Jayrock.Json.Conversion.JsonConvert.Import(reader.Value) as JsonArray;
                        target.MemberUniqueName = data[0] != null?CellSetData.ConvertFromJson(data[0]).ToString() : String.Empty;

                        var conditions = data.GetArray(1);
                        for (int i = 0; i < conditions.Length; i++)
                        {
                            var cond_data = conditions.GetArray(i);

                            CellCondition cond = new CellCondition();
                            String        type = cond_data.GetValue(0) != null?cond_data.GetValue(0).ToString() : CellConditionType.None.ToString();

                            cond.ConditionType = (CellConditionType)(CellConditionType.Parse(typeof(CellConditionType), type, true));
                            cond.Value1        = Convert.ToDouble(cond_data.GetValue(1));
                            cond.Value2        = Convert.ToDouble(cond_data.GetValue(2));

                            var cellAppearance = cond_data.GetArray(3);
                            cond.Appearance.BackColor      = FromJsonColor(cellAppearance.GetArray(0));
                            cond.Appearance.BorderColor    = FromJsonColor(cellAppearance.GetArray(1));
                            cond.Appearance.ForeColor      = FromJsonColor(cellAppearance.GetArray(2));
                            cond.Appearance.CustomImageUri = Convert.ToString(cellAppearance.GetValue(3));

                            var options = cellAppearance.GetArray(4);
                            cond.Appearance.Options.IgnoreAllOptions = Convert.ToBoolean(options[0]);
                            cond.Appearance.Options.ShowValue        = Convert.ToBoolean(options[1]);
                            cond.Appearance.Options.UseAllOptions    = Convert.ToBoolean(options[2]);
                            cond.Appearance.Options.UseBackColor     = Convert.ToBoolean(options[3]);
                            cond.Appearance.Options.UseBorderColor   = Convert.ToBoolean(options[4]);
                            cond.Appearance.Options.UseForeColor     = Convert.ToBoolean(options[5]);
                            cond.Appearance.Options.UseImage         = Convert.ToBoolean(options[6]);
                            cond.Appearance.Options.UseProgressBar   = Convert.ToBoolean(options[7]);

                            var progressBarOptions = cellAppearance.GetArray(5);
                            cond.Appearance.ProgressBarOptions.StartColor      = FromJsonColor(progressBarOptions.GetArray(0));
                            cond.Appearance.ProgressBarOptions.EndColor        = FromJsonColor(progressBarOptions.GetArray(1));
                            cond.Appearance.ProgressBarOptions.MinValue        = Convert.ToDouble(progressBarOptions.GetValue(2));
                            cond.Appearance.ProgressBarOptions.MaxValue        = Convert.ToDouble(progressBarOptions.GetValue(3));
                            cond.Appearance.ProgressBarOptions.IsIndeterminate = Convert.ToBoolean(progressBarOptions.GetValue(4));

                            target.Conditions.Add(cond);
                        }

                        if (reader.NodeType == XmlNodeType.EndElement &&
                            reader.Name == XML_CellConditionsDescriptor)
                        {
                            reader.ReadEndElement();
                        }
                    }
                    return(target);
                }
                catch (XmlException ex)
                {
                    throw ex;
                    //return null;
                }
            }
            return(null);
        }
        /// <summary>
        /// Возвращает список условий, который удовлетворяет значение ячейки
        /// </summary>
        /// <param name="value">Значение ячейки. double.NaN если значение равно NULL</param>
        /// <param name="conditions"></param>
        /// <returns></returns>
        public static List<CellCondition> TestToConditions(double value, CellConditionsDescriptor conditionDescriptor)
        {
            if (conditionDescriptor == null)
                return null;

            List<CellCondition> list = new List<CellCondition>();
            foreach (CellCondition cond in conditionDescriptor.Conditions)
            {
                // Если значение ячейки равно null, то value == double.NaN
                // В этом случае пройдут только условия CellConditionType.None. Остальные во избежание казусов прокидываем
                if (value == double.NaN && cond.ConditionType != CellConditionType.None)
                    continue;

                double val1, val2;
                try
                {
                    val1 = Convert.ToDouble(cond.Value1);
                    val2 = Convert.ToDouble(cond.Value2);
                }
                catch
                {
                    continue;
                }

                bool ok = false;
                switch (cond.ConditionType)
                {
                    case CellConditionType.Between:
                        if (val1 < value && value < val2)
                            ok = true;
                        break;
                    case CellConditionType.NotBetween:
                        if (value <= val1 || val2 <= value)
                            ok = true;
                        break;
                    case CellConditionType.Equal:
                        if (val1 == value)
                            ok = true;
                        break;
                    case CellConditionType.Greater:
                        if (value > val1)
                            ok = true;
                        break;
                    case CellConditionType.GreaterOrEqual:
                        if (value >= val1)
                            ok = true;
                        break;
                    case CellConditionType.Less:
                        if (value < val1)
                            ok = true;
                        break;
                    case CellConditionType.LessOrEqual:
                        if (value <= val1)
                            ok = true;
                        break;
                    case CellConditionType.NotEqual:
                        if (value != val1)
                            ok = true;
                        break;
                    case CellConditionType.None:
                        ok = true;
                        break;
                }

                if (ok)
                    list.Add(cond);
            }
            return list;
        }
        static CellConditionsDescriptor Deserialize(XmlReader reader)
        {
            if (reader != null)
            {
                try
                {
                    CellConditionsDescriptor target = null;

                    if (!(reader.NodeType == XmlNodeType.Element &&
                        reader.Name == XML_CellConditionsDescriptor))
                    {
                        reader.ReadToFollowing(XML_CellConditionsDescriptor);
                    }

                    if (reader.NodeType == XmlNodeType.Element &&
                        reader.Name == XML_CellConditionsDescriptor)
                    {
                        target = new CellConditionsDescriptor();
                        reader.Read();

                        var data = Jayrock.Json.Conversion.JsonConvert.Import(reader.Value) as JsonArray;
                        target.MemberUniqueName = data[0] != null ? CellSetData.ConvertFromJson(data[0]).ToString() : String.Empty;

                        var conditions = data.GetArray(1);
                        for (int i = 0; i < conditions.Length; i++)
                        {
                            var cond_data = conditions.GetArray(i);

                            CellCondition cond = new CellCondition();
                            String type = cond_data.GetValue(0) != null ? cond_data.GetValue(0).ToString() : CellConditionType.None.ToString();
                            cond.ConditionType = (CellConditionType)(CellConditionType.Parse(typeof(CellConditionType), type, true));
                            cond.Value1 = Convert.ToDouble(cond_data.GetValue(1));
                            cond.Value2 = Convert.ToDouble(cond_data.GetValue(2));

                            var cellAppearance = cond_data.GetArray(3);
                            cond.Appearance.BackColor = FromJsonColor(cellAppearance.GetArray(0));
                            cond.Appearance.BorderColor = FromJsonColor(cellAppearance.GetArray(1));
                            cond.Appearance.ForeColor = FromJsonColor(cellAppearance.GetArray(2));
                            cond.Appearance.CustomImageUri = Convert.ToString(cellAppearance.GetValue(3));

                            var options = cellAppearance.GetArray(4);
                            cond.Appearance.Options.IgnoreAllOptions = Convert.ToBoolean(options[0]);
                            cond.Appearance.Options.ShowValue = Convert.ToBoolean(options[1]);
                            cond.Appearance.Options.UseAllOptions = Convert.ToBoolean(options[2]);
                            cond.Appearance.Options.UseBackColor = Convert.ToBoolean(options[3]);
                            cond.Appearance.Options.UseBorderColor = Convert.ToBoolean(options[4]);
                            cond.Appearance.Options.UseForeColor = Convert.ToBoolean(options[5]);
                            cond.Appearance.Options.UseImage = Convert.ToBoolean(options[6]);
                            cond.Appearance.Options.UseProgressBar = Convert.ToBoolean(options[7]);

                            var progressBarOptions = cellAppearance.GetArray(5);
                            cond.Appearance.ProgressBarOptions.StartColor = FromJsonColor(progressBarOptions.GetArray(0));
                            cond.Appearance.ProgressBarOptions.EndColor = FromJsonColor(progressBarOptions.GetArray(1));
                            cond.Appearance.ProgressBarOptions.MinValue = Convert.ToDouble(progressBarOptions.GetValue(2));
                            cond.Appearance.ProgressBarOptions.MaxValue = Convert.ToDouble(progressBarOptions.GetValue(3));
                            cond.Appearance.ProgressBarOptions.IsIndeterminate = Convert.ToBoolean(progressBarOptions.GetValue(4));

                            target.Conditions.Add(cond);
                        }

                        if (reader.NodeType == XmlNodeType.EndElement &&
                            reader.Name == XML_CellConditionsDescriptor)
                        {
                            reader.ReadEndElement();
                        }
                    }
                    return target;
                }
                catch (XmlException ex)
                {
                    throw ex;
                    //return null;
                }
            }
            return null;
        }