public PivotGridItem(PivotGridControl owner)
            : this()
        {
            if (owner == null)
                throw new ArgumentNullException("owner");

            Owner = owner;
        }
        public PivotDataAnalizer(PivotGridControl pivotGrid)
        {
            if (pivotGrid == null)
                throw new ArgumentNullException("pivotGrid");
            m_PivotGrid = pivotGrid;

            BuildCellsAnalytic();
        }
        public ColumnMemberControl(PivotGridControl owner, MemberInfo info, int drillDownDepth)
            : base(owner, info)
        {
            Margin = new Thickness(0, drillDownDepth * owner.DRILLDOWN_SPACE_HEIGHT * Scale, 0, 0);

//            Border border = LayoutRoot;
            
//            int right_Offs = Member.DrilledDownChildren.Count > 0 ? 0 : MembersAreaContol.SPLITTER_SIZE;    
//            border.BorderThickness = new Thickness(0, 0, 1 + right_Offs, 1 + MembersAreaContol.SPLITTER_SIZE);
            

            if (drillDownDepth > 0)
            {
                ShowUpBorder(true);
            }
        }
        public RowMemberControl(PivotGridControl owner, MemberInfo info, int drillDownDepth) 
            : base(owner, info)
        {
            Margin = new Thickness(drillDownDepth * owner.DRILLDOWN_SPACE_WIDTH * Scale, 0, 0, 0);

//            Border border = LayoutRoot;
//            border.BorderThickness = new Thickness(0, 0, 1 + MembersAreaContol.SPLITTER_SIZE, 1 + MembersAreaContol.SPLITTER_SIZE);

            //if(Member.DrilledDownChildren.Count > 0)
            //{
            //    RootPanel.VerticalAlignment = VerticalAlignment.Top;
            //}

            if (drillDownDepth > 0)
            {
                ShowLeftBorder(true);
            }
        }
        public CellControl(PivotGridControl owner)
            : base(owner)
        {
            DefaultStyleKey = typeof(CellControl);
            HorizontalAlignment = HorizontalAlignment.Stretch;
            VerticalAlignment = VerticalAlignment.Stretch;
            HorizontalContentAlignment = HorizontalAlignment.Stretch;
            VerticalContentAlignment = VerticalAlignment.Stretch;

            this.Click += new RoutedEventHandler(CellControl_Click);

            m_LayoutPanel = new Grid();
            m_LayoutPanel.Margin = new Thickness(0);
            m_LayoutPanel.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });
            m_LayoutPanel.ColumnDefinitions.Add(new ColumnDefinition());
            m_LayoutPanel.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });

            resDoubleClickTimer = new Storyboard();
            resDoubleClickTimer.Duration = new Duration(new TimeSpan(0, 0, 0, 0, 250));
            resDoubleClickTimer.Completed += new EventHandler(Storyboard_Completed);
            m_LayoutPanel.Resources.Add("resDoubleClickTimer", resDoubleClickTimer);

            // Текст
            m_Caption_Text = new TextBlock();
            m_Caption_Text.FontSize = Owner.DefaultFontSize * Scale;
            m_Caption_Text.HorizontalAlignment = HorizontalAlignment.Stretch;
            m_Caption_Text.VerticalAlignment = VerticalAlignment.Center;
            m_Caption_Text.TextAlignment = TextAlignment.Right;
            m_Caption_Text.Margin = new Thickness(0, 0, 3 * Scale, 0);
            m_LayoutPanel.Children.Add(m_Caption_Text);
            Grid.SetColumn(m_Caption_Text, 1);

            this.Content = m_LayoutPanel;

        }
		public UpdateablePivotGridControl()
		{
			RowDefinition row0 = new RowDefinition();
			row0.Height = GridLength.Auto;
			RowDefinition row1 = new RowDefinition();

			LayoutRoot.RowDefinitions.Add(row0);
			LayoutRoot.RowDefinitions.Add(row1);

			RefreshButton = new RanetToolBarButton();
			RefreshButton.Click += new RoutedEventHandler(RefreshButton_Click);
			RefreshButton.Content = UiHelper.CreateIcon(UriResources.Images.Refresh16);
			ToolTipService.SetToolTip(RefreshButton, Localization.PivotGrid_RefreshButton_ToolTip);

			ToBeginButton = new RanetToolBarButton();
			ToBeginButton.Click += new RoutedEventHandler(ToBeginButton_Click);
			ToBeginButton.Content = UiHelper.CreateIcon(UriResources.Images.ToBegin16);
			ToolTipService.SetToolTip(ToBeginButton, Localization.PivotGrid_ToBeginButton_ToolTip);

			BackButton = new RanetToolBarButton();
			BackButton.Click += new RoutedEventHandler(BackButton_Click);
			BackButton.Content = UiHelper.CreateIcon(UriResources.Images.Back16);
			ToolTipService.SetToolTip(BackButton, Localization.PivotGrid_BackButton_ToolTip);

			ForwardButton = new RanetToolBarButton();
			ForwardButton.Click += new RoutedEventHandler(ForwardButton_Click);
			ForwardButton.Content = UiHelper.CreateIcon(UriResources.Images.Forward16);
			ToolTipService.SetToolTip(ForwardButton, Localization.PivotGrid_ForwardButton_ToolTip);

			ToEndButton = new RanetToolBarButton();
			ToEndButton.Click += new RoutedEventHandler(ToEndButton_Click);
			ToEndButton.Content = UiHelper.CreateIcon(UriResources.Images.ToEnd16);
			ToolTipService.SetToolTip(ToEndButton, Localization.PivotGrid_ToEndButton_ToolTip);

			EditButton = new RanetToggleButton();
			ToolTipService.SetToolTip(EditButton, Localization.PivotGrid_EditButton_ToolTip);
			EditButton.Checked += new RoutedEventHandler(EditButton_Click);
			EditButton.Unchecked += new RoutedEventHandler(EditButton_Click);
			EditButton.Content = UiHelper.CreateIcon(UriResources.Images.EditCells16);

			UseChangesCasheButton = new RanetToggleButton();
			ToolTipService.SetToolTip(UseChangesCasheButton, Localization.PivotGrid_UseChangesCasheButton_ToolTip);
			UseChangesCasheButton.Checked += new RoutedEventHandler(UseChangesCasheButton_Checked);
			UseChangesCasheButton.Unchecked += new RoutedEventHandler(UseChangesCasheButton_Checked);
			UseChangesCasheButton.Content = UiHelper.CreateIcon(UriResources.Images.UseChangesCache16);

			CopyToClipboardButton = new RanetToolBarButton();
			ToolTipService.SetToolTip(CopyToClipboardButton, Localization.PivotGrid_CopyToClipboardButton_ToolTip);
			CopyToClipboardButton.Click += new RoutedEventHandler(CopyToClipboardoButton_Click);
			CopyToClipboardButton.Content = UiHelper.CreateIcon(UriResources.Images.Copy16);

			PasteFromClipboardButton = new RanetToolBarButton();
			ToolTipService.SetToolTip(PasteFromClipboardButton, Localization.PivotGrid_PasteFromClipboardButton_ToolTip);
			PasteFromClipboardButton.Click += new RoutedEventHandler(PasteFromClipboardoButton_Click);
			PasteFromClipboardButton.Content = UiHelper.CreateIcon(UriResources.Images.Paste16);

			ConfirmEditButton = new RanetToolBarButton(UriResources.Images.ConfirmEdit16, Localization.PivotGrid_ConfirmEditButton_Caption);
			ToolTipService.SetToolTip(ConfirmEditButton, Localization.PivotGrid_ConfirmEditButton_ToolTip);
			ConfirmEditButton.Click += new RoutedEventHandler(ConfirmEditButton_Click);

			CancelEditButton = new RanetToolBarButton();
			ToolTipService.SetToolTip(CancelEditButton, Localization.PivotGrid_CancelEditButton_ToolTip);
			CancelEditButton.Click += new RoutedEventHandler(CancelEditButton_Click);
			CancelEditButton.Content = UiHelper.CreateIcon(UriResources.Images.CancelEdit16);

			RestoreDefaultSizeButton = new RanetToolBarButton();
			ToolTipService.SetToolTip(RestoreDefaultSizeButton, Localization.PivotGrid_RestoreDefaultSize_ToolTip);
			RestoreDefaultSizeButton.Click += new RoutedEventHandler(RestoreDefaultSizeButton_Click);
			RestoreDefaultSizeButton.Content = UiHelper.CreateIcon(UriResources.Images.RestoreSize16);

			HideEmptyRowsButton = new RanetToggleButton();
			HideEmptyRowsButton.Click += new RoutedEventHandler(HideEmptyRowsButton_Click);
			HideEmptyRowsButton.Content = UiHelper.CreateIcon(UriResources.Images.HideEmptyRows16);
			ToolTipService.SetToolTip(HideEmptyRowsButton, Localization.PivotGrid_HideEmptyRowsButton_ToolTip);

			HideEmptyColumnsButton = new RanetToggleButton();
			HideEmptyColumnsButton.ClickMode = ClickMode.Press;
			HideEmptyColumnsButton.Click += new RoutedEventHandler(HideEmptyColumnsButton_Click);
			HideEmptyColumnsButton.Content = UiHelper.CreateIcon(UriResources.Images.HideEmptyColumns16);
			ToolTipService.SetToolTip(HideEmptyColumnsButton, Localization.PivotGrid_HideEmptyColumnsButton_ToolTip);

			GoToFocusedCellButton = new RanetToolBarButton();
			GoToFocusedCellButton.Click += new RoutedEventHandler(GoToFocusedCellButton_Click);
			GoToFocusedCellButton.Content = UiHelper.CreateIcon(UriResources.Images.ToFocused16);
			ToolTipService.SetToolTip(GoToFocusedCellButton, Localization.PivotGrid_GoToFocusedCellButton_ToolTip);

			ExportToExcelButton = new RanetToolBarButton();
			ToolTipService.SetToolTip(ExportToExcelButton, Localization.PivotGrid_ExportToExcelButton_ToolTip);
			ExportToExcelButton.Click += new RoutedEventHandler(ExportToExcelButton_Click);
			ExportToExcelButton.Content = UiHelper.CreateIcon(UriResources.Images.ExportToExcel16);

			RotateAxesButton = new RanetToggleButton();
			RotateAxesButton.ClickMode = ClickMode.Press;
			RotateAxesButton.Click += new RoutedEventHandler(RotateAxesButton_Click);
			RotateAxesButton.Content = UiHelper.CreateIcon(UriResources.Images.RotateAxes16);
			ToolTipService.SetToolTip(RotateAxesButton, Localization.PivotGrid_RotateAxesButton_ToolTip);

			HideHintsButton = new RanetToggleButton();
			HideHintsButton.ClickMode = ClickMode.Press;
			HideHintsButton.Click += new RoutedEventHandler(HideHintsButton_Click);
			HideHintsButton.Content = UiHelper.CreateIcon(UriResources.Images.HideHint16);
			ToolTipService.SetToolTip(HideHintsButton, Localization.PivotGrid_HideHintsButton_ToolTip);

			ConditionsDesignerButton = new RanetToggleButton();
			ConditionsDesignerButton.ClickMode = ClickMode.Press;
			ConditionsDesignerButton.Click += new RoutedEventHandler(ConditionsDesignerButton_Click);
			ConditionsDesignerButton.Content = UiHelper.CreateIcon(UriResources.Images.CellConditionsDesigner16);
			ConditionsDesignerButton.Visibility = Visibility.Collapsed;
			ToolTipService.SetToolTip(ConditionsDesignerButton, Localization.PivotGrid_CellsConditionsDesignerButton_ToolTip);

			ZoomControl = new ZoomingToolBarControl();
			ToolTipService.SetToolTip(ZoomControl, Localization.PivotGrid_ZoomingControl_ToolTip);
			ZoomControl.ValueChanged += new EventHandler(ZoomControl_ValueChanged);

			ToolBar.AddItem(RefreshButton);
			ToolBar.AddItem(m_NavigationButtons_Splitter);
			ToolBar.AddItem(ToBeginButton);
			ToolBar.AddItem(BackButton);
			ToolBar.AddItem(ForwardButton);
			ToolBar.AddItem(ToEndButton);
			NavigationToolBarSplitter = new RanetToolBarSplitter();
			ToolBar.AddItem(NavigationToolBarSplitter);
			ToolBar.AddItem(EditButton);
			ToolBar.AddItem(CopyToClipboardButton);
			ToolBar.AddItem(PasteFromClipboardButton);
			ToolBar.AddItem(UseChangesCasheButton);
			ToolBar.AddItem(ConfirmEditButton);
			ToolBar.AddItem(CancelEditButton);
			ToolBar.AddItem(new RanetToolBarSplitter());
			ToolBar.AddItem(RestoreDefaultSizeButton);
			ToolBar.AddItem(HideEmptyRowsButton);
			ToolBar.AddItem(HideEmptyColumnsButton);
			ToolBar.AddItem(GoToFocusedCellButton);
			ToolBar.AddItem(RotateAxesButton);
			ToolBar.AddItem(HideHintsButton);
			ToolBar.AddItem(ConditionsDesignerButton);
			ToolBar.AddItem(new RanetToolBarSplitter());
			ToolBar.AddItem(ExportToExcelButton);
			ToolBar.AddItem(ZoomControl);

			LayoutRoot.Children.Add(ToolBar);
			ToolBar.Margin = new Thickness(0, 0, 0, 3);

			// Сводная таблица
			//m_PivotGridPanel = new PivotGridPanel();
			//LayoutRoot.Children.Add(m_PivotGridPanel);
			//Grid.SetRow(m_PivotGridPanel, 1);

			m_PivotGrid = GetPivotGridControl();
			LayoutRoot.Children.Add(m_PivotGrid);
			Grid.SetRow(m_PivotGrid, 1);

			PivotGrid.ExecuteMemberAction += new MemberActionEventHandler(PivotGrid_ExecuteMemberAction);
			PivotGrid.CellValueChanged += new CellValueChangedEventHandler(CellsControl_CellValueChanged);
			PivotGrid.UndoCellChanges += new EventHandler(CellsControl_UndoCellChanges);
			PivotGrid.Cells_ContextMenuCreated += new EventHandler(CellsControl_ContextMenuCreated);
			PivotGrid.Columns_ContextMenuCreated += new EventHandler(ColumnsControl_ContextMenuCreated);
			PivotGrid.Rows_ContextMenuCreated += new EventHandler(RowsControl_ContextMenuCreated);
			PivotGrid.InitializeContextMenu += new EventHandler<CustomContextMenuEventArgs>(PivotGrid_InitializeContextMenu);

			UpdateToolbarButtons(null);
			UpdateEditToolBarButtons();

			grdIsWaiting = new Grid() { Background = new SolidColorBrush(Color.FromArgb(125, 0xFF, 0xFF, 0xFF)) };
			grdIsWaiting.Visibility = Visibility.Collapsed;
			BusyControl m_Waiting = new BusyControl();
			m_Waiting.Text = Localization.Loading;
			grdIsWaiting.Children.Add(m_Waiting);

			LayoutRoot.Children.Add(grdIsWaiting);
			Grid.SetColumnSpan(grdIsWaiting, LayoutRoot.ColumnDefinitions.Count > 0 ? LayoutRoot.ColumnDefinitions.Count : 1);
			Grid.SetRowSpan(grdIsWaiting, LayoutRoot.RowDefinitions.Count > 0 ? LayoutRoot.RowDefinitions.Count : 1);
			this.Content = LayoutRoot;

			PivotGrid.Cells_PerformControlAction += new EventHandler<ControlActionEventArgs<CellInfo>>(CellsControl_PerformControlAction);
			PivotGrid.Members_PerformControlAction += new EventHandler<ControlActionEventArgs<MemberControl>>(MembersArea_PerformControlAction);

			m_OlapDataLoader = GetOlapDataLoader();
			m_OlapDataLoader.DataLoaded += new EventHandler<DataLoaderEventArgs>(OlapDataLoader_DataLoaded);

			m_StorageManager = GetStorageManager();
			m_StorageManager.InvokeCompleted += new EventHandler<DataLoaderEventArgs>(StorageManager_ActionCompleted);

			// Метод Initialize необходимо вызывать для RotVisual элемента
			// всего приложения. Перенес его в ClientApp.
			//ScrollViewerMouseWheelSupport.Initialize(this);
			//m_ScrollableDataControl.ScrollView.AddMouseWheelSupport();

			this.KeyDown += new KeyEventHandler(UpdateablePivotGridControl_KeyDown);

			OlapTransactionManager.AfterCommandComplete += new EventHandler<TransactionCommandResultEventArgs>(AnalysisTransactionManager_AfterCommandComplete);
		}
        public MemberControl(PivotGridControl owner, MemberInfo info)
            : base(owner)
        {
            BorderThickness = new Thickness(0, 0, 1, 1);

            DefaultStyleKey = typeof(MemberControl);
            HorizontalAlignment = HorizontalAlignment.Stretch;
            VerticalAlignment = VerticalAlignment.Stretch;
            HorizontalContentAlignment = HorizontalAlignment.Stretch;
            VerticalContentAlignment = VerticalAlignment.Top;

            if(info == null)
                throw new ArgumentNullException("info");
            
            m_Member = info;

            m_LayoutRoot = new Grid();
            m_LayoutRoot.Margin = new Thickness(2, 2 * Scale, 0, 0);
            m_LayoutRoot.VerticalAlignment = VerticalAlignment.Top;
            m_LayoutRoot.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });
            m_LayoutRoot.ColumnDefinitions.Add(new ColumnDefinition());
            ColumnDefinition column02 = new ColumnDefinition();
            column02.MaxWidth = 0; /* чтобы при сжимании иконка надвигалась на текст макс. ширину будем далее задавать жестко*/
            m_LayoutRoot.ColumnDefinitions.Add(column02);
            m_LayoutRoot.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });
            // Колонка для отображения режима сортировки
            m_LayoutRoot.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });

            if (IsInteractive)
            {
                if (Member.ChildCount > 0 && !Member.IsCalculated && !Member.IsDublicate)
                {
                    var expander = new PlusMinusButton();
                    if (Member.DrilledDown)
                        expander.IsExpanded = true;
                    expander.CheckedChanged += new EventHandler(expander_CheckedChanged);
                    UseExpandingCommands = true;
                    expander.Height = expander.Width = Math.Max(5, 9 * Scale);
                    m_LayoutRoot.Children.Add(expander);
                }
                else
                {
                    ListMemberControl ctrl = new ListMemberControl();
                    ctrl.Opacity = 0.35;
                    ctrl.Height = ctrl.Width = Math.Max(5, 9 * Scale);
                    m_LayoutRoot.Children.Add(ctrl);
                }
            }

            // Название элемента
            m_LayoutRoot.Children.Add(CaptionText);
            Grid.SetColumn(CaptionText, 1);

            // Визуализация DATAMEMBER, UNKNOWNMEMBER,CUSTOM_ROLLUP и UNARY_OPERATOR
            if (Member != null)
            {
                BitmapImage custom_image = null;

                if (Member.UniqueName.Trim().EndsWith("DATAMEMBER"))
                {
                    custom_image = UriResources.Images.DataMember16;
                }

                if (Member.UniqueName.Trim().EndsWith("UNKNOWNMEMBER"))
                {
                    custom_image = UriResources.Images.UnknownMember16;
                }

                // CUSTOM_ROLLUP отображается своей иконкой.
                // UNARY_OPERATOR - каждый своей иконкой.
                // Если оба свойства установлены, то отображаем скомбинированную иконку
                if(String.IsNullOrEmpty(Member.Unary_Operator))
                {
                    // Только CUSTOM_ROLLUP
                    if (Member.HasCustomRollup)
                    {
                        custom_image = UriResources.Images.CalcFunction16;
                    }
                }
                else
                {
                    // UNARY_OPERATOR
                    if (custom_image == null && Member.Unary_Operator.Trim() == "+")
                    {
                        if (Member.HasCustomRollup)
                        {
                            custom_image = UriResources.Images.CalcFunctionPlus16;
                        }
                        else
                        {
                            custom_image = UriResources.Images.CalcPlus16;
                        }
                    }
                    if (custom_image == null && Member.Unary_Operator.Trim() == "-")
                    {
                        if (Member.HasCustomRollup)
                        {
                            custom_image = UriResources.Images.CalcFunctionMinus16;
                        }
                        else
                        {
                            custom_image = UriResources.Images.CalcMinus16;
                        }
                    }
                    if (custom_image == null && Member.Unary_Operator.Trim() == "*")
                    {
                        if (Member.HasCustomRollup)
                        {
                            custom_image = UriResources.Images.CalcFunctionMultiply16;
                        }
                        else
                        {
                            custom_image = UriResources.Images.CalcMultiply16;
                        }
                    }
                    if (custom_image == null && Member.Unary_Operator.Trim() == "/")
                    {
                        if (Member.HasCustomRollup)
                        {
                            custom_image = UriResources.Images.CalcFunctionDivide16;
                        }
                        else
                        {
                            custom_image = UriResources.Images.CalcDivide16;
                        }
                    }
                    if (custom_image == null && Member.Unary_Operator.Trim() == "~")
                    {
                        if (Member.HasCustomRollup)
                        {
                            custom_image = UriResources.Images.CalcFunctionTilde16;
                        }
                        else
                        {
                            custom_image = UriResources.Images.CalcTilde16;
                        }
                    }
                    if (custom_image == null && Member.Unary_Operator.Trim() == "=")
                    {
                        if (Member.HasCustomRollup)
                        {
                            custom_image = UriResources.Images.CalcFunctionEqual16;
                        }
                        else
                        {
                            custom_image = UriResources.Images.CalcEqual16;
                        }
                    }
                    if (custom_image == null)
                    {
                        if (Member.HasCustomRollup)
                        {
                            custom_image = UriResources.Images.CalcFunctionPercent16;
                        }
                        else
                        {
                            custom_image = UriResources.Images.CalcPercent16;
                        }
                    }
                }

                if (custom_image != null)
                {
                    Image image1 = new Image() { Margin = new Thickness(0, 0, 2, 0) };
                    image1.Width = Math.Max(8, 16 * Scale);
                    image1.Height = Math.Max(8, 16 * Scale);
                    image1.Source = custom_image;
                    m_LayoutRoot.Children.Add(image1);
                    Grid.SetColumn(image1, 3);
                }
            }

            m_EllipsisText = new TextBlock() { Text = "..." };
            m_EllipsisText.FontSize = Owner.DefaultFontSize * Scale;
            m_LayoutRoot.Children.Add(m_EllipsisText);
            m_EllipsisText.Margin = new Thickness(-1, 0, 0, 0);
            m_EllipsisText.TextAlignment = TextAlignment.Left;
            m_EllipsisText.VerticalAlignment = VerticalAlignment.Center;
            Grid.SetColumn(m_EllipsisText, 2);
            m_EllipsisText.Visibility = Visibility.Collapsed;

            this.SizeChanged += new SizeChangedEventHandler(MemberControl_SizeChanged);
            this.Content = m_LayoutRoot;
            this.Click += new RoutedEventHandler(MemberControl_Click);

            m_SortByValueImage = new Image() { Width = 16, Height = 16 };
            m_SortByValueImage.Visibility = Visibility.Collapsed;
            //var m_SortSelector = new SortTypeSelector() { VerticalAlignment = VerticalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Center };
            m_LayoutRoot.Children.Add(m_SortByValueImage);
            Grid.SetColumn(m_SortByValueImage, 4); 
        }
        public MemberControl(PivotGridControl owner, MemberInfo info)
        {
            if (owner == null)
                throw new ArgumentNullException("owner");
            if(info == null)
                throw new ArgumentNullException("info");
            
            m_Member = info;
            Owner = owner;

            this.Margin = new Thickness(0, 0, 0, 0);

            m_Border = new Border();
            m_Border.BorderBrush = Owner.MembersBorder;
            m_Border.BorderThickness = new Thickness(0, 0, 1, 1);
            m_Border.CornerRadius = new CornerRadius(CORNER_RADIUS);
            
            m_Border.Background = Owner.MembersBackground;

            //m_Border.Child = RootPanel;
            m_Border.Child = LayoutRoot;

            if (IsInteractive)
            {
                CaptionText.MouseEnter += new MouseEventHandler(MemberControl_MouseEnter);
                CaptionText.MouseLeave += new MouseEventHandler(MemberControl_MouseLeave);
                CaptionText.MouseLeftButtonDown += new MouseButtonEventHandler(CaptionText_MouseLeftButtonDown);

                PlusMinusButton expander = null;
             
                if (Member.ChildCount > 0 && !Member.IsCalculated)
                {
                    expander = new PlusMinusButton();
                    if (Member.DrilledDown)
                        expander.IsExpanded = true;
                    expander.CheckedChanged += new EventHandler(expander_CheckedChanged);
                    UseExpandingCommands = true;
                    expander.Height = expander.Width = Math.Max(5, 9 * Scale);
                    LayoutRoot.Children.Add(expander);
                }
                else
                {
                    ListMemberControl ctrl = new ListMemberControl();
                    ctrl.Opacity = 0.35;
                    ctrl.Height = ctrl.Width = Math.Max(5, 9 * Scale);
                    LayoutRoot.Children.Add(ctrl);
                }

            }

            // Название элемента
            LayoutRoot.Children.Add(CaptionText);
            Grid.SetColumn(CaptionText, 1);

            // Визуализация DATAMEMBER, UNKNOWNMEMBER,CUSTOM_ROLLUP и UNARY_OPERATOR
            if (Member != null)
            {
                BitmapImage custom_image = null;

                if (Member.UniqueName.Trim().EndsWith("DATAMEMBER"))
                {
                    custom_image = UriResources.Images.DataMember16;
                }

                if (Member.UniqueName.Trim().EndsWith("UNKNOWNMEMBER"))
                {
                    custom_image = UriResources.Images.UnknownMember16;
                }

                // CUSTOM_ROLLUP отображается своей иконкой.
                // UNARY_OPERATOR - каждый своей иконкой.
                // Если оба свойства установлены, то отображаем скомбинированную иконку
                if(String.IsNullOrEmpty(Member.Unary_Operator))
                {
                    // Только CUSTOM_ROLLUP
                    if (Member.HasCustomRollup)
                    {
                        custom_image = UriResources.Images.CalcFunction16;
                    }
                }
                else
                {
                    // UNARY_OPERATOR
                    if (custom_image == null && Member.Unary_Operator.Trim() == "+")
                    {
                        if (Member.HasCustomRollup)
                        {
                            custom_image = UriResources.Images.CalcFunctionPlus16;
                        }
                        else
                        {
                            custom_image = UriResources.Images.CalcPlus16;
                        }
                    }
                    if (custom_image == null && Member.Unary_Operator.Trim() == "-")
                    {
                        if (Member.HasCustomRollup)
                        {
                            custom_image = UriResources.Images.CalcFunctionMinus16;
                        }
                        else
                        {
                            custom_image = UriResources.Images.CalcMinus16;
                        }
                    }
                    if (custom_image == null && Member.Unary_Operator.Trim() == "*")
                    {
                        if (Member.HasCustomRollup)
                        {
                            custom_image = UriResources.Images.CalcFunctionMultiply16;
                        }
                        else
                        {
                            custom_image = UriResources.Images.CalcMultiply16;
                        }
                    }
                    if (custom_image == null && Member.Unary_Operator.Trim() == "/")
                    {
                        if (Member.HasCustomRollup)
                        {
                            custom_image = UriResources.Images.CalcFunctionDivide16;
                        }
                        else
                        {
                            custom_image = UriResources.Images.CalcDivide16;
                        }
                    }
                    if (custom_image == null && Member.Unary_Operator.Trim() == "~")
                    {
                        if (Member.HasCustomRollup)
                        {
                            custom_image = UriResources.Images.CalcFunctionTilde16;
                        }
                        else
                        {
                            custom_image = UriResources.Images.CalcTilde16;
                        }
                    }
                    if (custom_image == null && Member.Unary_Operator.Trim() == "=")
                    {
                        if (Member.HasCustomRollup)
                        {
                            custom_image = UriResources.Images.CalcFunctionEqual16;
                        }
                        else
                        {
                            custom_image = UriResources.Images.CalcEqual16;
                        }
                    }
                    if (custom_image == null)
                    {
                        if (Member.HasCustomRollup)
                        {
                            custom_image = UriResources.Images.CalcFunctionPercent16;
                        }
                        else
                        {
                            custom_image = UriResources.Images.CalcPercent16;
                        }
                    }
                }

                if (custom_image != null)
                {
                    Image image1 = new Image() { Margin = new Thickness(0, 0, 2, 0) };
                    image1.Width = Math.Max(8, 16 * Scale);
                    image1.Height = Math.Max(8, 16 * Scale);
                    image1.Source = custom_image;
                    LayoutRoot.Children.Add(image1);
                    Grid.SetColumn(image1, 3);
                }
            }

            m_EllipsisText = new TextBlock() { Text = "..." };
            m_EllipsisText.FontSize = Owner.DefaultFontSize * Scale;
            LayoutRoot.Children.Add(m_EllipsisText);
            m_EllipsisText.Margin = new Thickness(-1, 0, 0, 0);
            m_EllipsisText.TextAlignment = TextAlignment.Left;
            m_EllipsisText.VerticalAlignment = VerticalAlignment.Center;
            Grid.SetColumn(m_EllipsisText, 2);
            m_EllipsisText.Visibility = Visibility.Collapsed;

            this.SizeChanged += new SizeChangedEventHandler(MemberControl_SizeChanged);

            //if(UseHint)
            //{
            //    // Текст подсказки
            //    IList<MemberInfo> anc = new List<MemberInfo>();
            //    this.Member.CollectAncestors(anc);
            //    StringBuilder sb = new StringBuilder();
            //    foreach (MemberInfo mv in anc)
            //    {
            //        sb.AppendLine(mv.Caption + " : " + mv.UniqueName);
            //    }
            //    String tupleToStr = sb.ToString();
            //    tupleToStr = tupleToStr.TrimEnd('\n');
            //    tupleToStr = tupleToStr.TrimEnd('\r');

            //    // Подсказка
            //    m_ToolTip = new ToolTipControl();
            //    m_ToolTip.Caption = CaptionText.Text;
            //    m_ToolTip.Text = tupleToStr;
            //    ToolTipService.SetToolTip(this, m_ToolTip);
            //}

            this.Content = m_Border;
        }
            public TooltipController(PivotGridControl pivotGrid)
            {
                if (pivotGrid == null)
                    throw new ArgumentNullException("pivotGrid");
                PivotGrid = pivotGrid;

                pivotGrid.MouseEnter += new MouseEventHandler(pivotGrid_MouseEnter);
                pivotGrid.MouseLeave += new MouseEventHandler(pivotGrid_MouseLeave);
                pivotGrid.MouseMove += new MouseEventHandler(pivotGrid_MouseMove);

                m_AutoHideTimer = new Storyboard();
                m_AutoHideTimer.Duration = new Duration(new TimeSpan(0, 0, 0, 5, 0));
                m_AutoHideTimer.Completed += new EventHandler(m_AutoHideTimer_Completed);
                //LayoutRoot.Resources.Add("m_Refresh_Timer", m_Refresh_Timer);

                m_TooltipTimer = new Storyboard();
                m_TooltipTimer.Duration = new Duration(new TimeSpan(0, 0, 0, 1, 0));
                m_TooltipTimer.Completed += new EventHandler(m_TooltipTimer_Completed);

                m_ToolTipContent = new ToolTipControl();

                m_ToolTip = new ToolTip();
                m_ToolTip.Content = m_ToolTipContent;
                m_ToolTip.Padding = new Thickness(0);
                m_ToolTip.Opened += new RoutedEventHandler(m_ToolTip_Opened);
                m_ToolTip.Closed += new RoutedEventHandler(m_ToolTip_Closed);

                //m_ToolTip.VerticalOffset = 10;
                //m_ToolTip.HorizontalOffset = 10;
            }
        public CellControl(PivotGridControl owner)
        {
            if (owner == null)
                throw new ArgumentNullException("owner");
            Owner = owner;

            m_Border = new Border();
            m_Border.CornerRadius = new CornerRadius(CORNER_RADIUS);

            this.MouseLeftButtonDown += new MouseButtonEventHandler(CellControl_MouseLeftButtonDown);

            m_LayoutPanel = new Grid();
            m_LayoutPanel.Margin = new Thickness(0);
            m_LayoutPanel.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });
            m_LayoutPanel.ColumnDefinitions.Add(new ColumnDefinition());
            m_LayoutPanel.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });

            resDoubleClickTimer = new Storyboard();
            resDoubleClickTimer.Duration = new Duration(new TimeSpan(0, 0, 0, 0, 250));
            resDoubleClickTimer.Completed += new EventHandler(Storyboard_Completed);
            m_Border.Resources.Add("resDoubleClickTimer", resDoubleClickTimer);

            // Текст
            m_Caption_Text = new TextBlock();
            m_Caption_Text.FontSize = Owner.DefaultFontSize * Scale;
            m_Caption_Text.HorizontalAlignment = HorizontalAlignment.Stretch;
            m_Caption_Text.VerticalAlignment = VerticalAlignment.Center;
            m_Caption_Text.TextAlignment = TextAlignment.Right;
            m_Caption_Text.Margin = new Thickness(0, 0, 3 * Scale, 0);
            m_LayoutPanel.Children.Add(m_Caption_Text);
            Grid.SetColumn(m_Caption_Text, 1);

            m_Border.Child = m_LayoutPanel;
            this.Content = m_Border;

        }