コード例 #1
0
ファイル: HelpClient.cs プロジェクト: JackWangCUMT/extensions
        private static async void AddHelpButton(SearchControl sc)
        {
            Menu bar = sc.Child<Menu>(m => m.Name == "menu");

            HelpButton helpButton = new HelpButton
            {
                MainControl = sc,
                Margin = new Thickness(4),
                IsEnabled = false,
            }.Set(DockPanel.DockProperty, Dock.Right);

            bar.After(helpButton);

            var queryName = sc.QueryName;

            helpButton.IsActive = await Server.ReturnAsync((IHelpServer s) => s.HasQueryHelpService(queryName));

            helpButton.Checked += async (sender, args) =>
            {
                var queryHelp = await Server.ReturnAsync((IHelpServer s) => s.GetQueryHelpService(queryName));

                SetHelpInfo(sc.Child<Button>(b=>b.Name == "btSearch"), queryHelp.Info);

                var listView = sc.Child<ListView>(b => b.Name == "lvResult");

                var columns = (from header in listView.Children<SortGridViewColumnHeader>(HelpButton.WhereFlags)
                                  let token = header.RequestColumn.Token
                                  select new { header, token }).ToList();

                var external = columns.Extract(t => !(t.token is ColumnToken));

                foreach (var t in columns)
                {
                    SetHelpInfo(t.header, queryHelp.Columns.GetOrThrow(((ColumnToken)t.token).Column.Name));
                }


                if (external.Any())
                {
                    var externalRoutes = external.Select(a => a.token.GetPropertyRoute()).Distinct().ToList();

                    var dictionary = await Server.ReturnAsync((IHelpServer s) => s.GetPropertyRoutesService(externalRoutes));

                    foreach (var t in external)
                    {
                        SetHelpInfo(t.header, dictionary.TryGetC(t.token.GetPropertyRoute()));
                    }
                }
            };

            sc.ContextMenuOpened += async cm =>
            {
                if (helpButton.IsChecked == true && !sc.Implementations.IsByAll)
                {
                    var pairs = (from mi in cm.Items.OfType<MenuItem>()
                                 where mi.Tag is IContextualOperationContext
                                 select new { mi, coc = (IContextualOperationContext)mi.Tag })
                                 .ToList();

                    var operations = pairs.Select(p=>p.coc.OperationInfo.OperationSymbol).Distinct().ToList();
                    if(operations.Any())
                    {
                        var types = await Task.WhenAll(sc.Implementations.Types.Select(t=> Server.ReturnAsync((IHelpServer s) => s.GetEntityHelpService(t))));
            
                        foreach (var p in pairs)
                        {
                            SetHelpInfo(p.mi, types.Select(t => t.Operations.TryGetC(p.coc.OperationInfo.OperationSymbol)).NotNull().FirstOrDefault());
                        }
                    }
                }
            };

            helpButton.IsEnabled = true;
        }
コード例 #2
0
        private static async void AddHelpButton(SearchControl sc)
        {
            Menu bar = sc.Child <Menu>(m => m.Name == "menu");

            HelpButton helpButton = new HelpButton
            {
                MainControl = sc,
                Margin      = new Thickness(4),
                IsEnabled   = false,
            }.Set(DockPanel.DockProperty, Dock.Right);

            bar.After(helpButton);

            var queryName = sc.QueryName;

            helpButton.IsActive = await Server.ReturnAsync((IHelpServer s) => s.HasQueryHelpService(queryName));

            helpButton.Checked += async(sender, args) =>
            {
                var queryHelp = await Server.ReturnAsync((IHelpServer s) => s.GetQueryHelpService(queryName));

                SetHelpInfo(sc.Child <Button>(b => b.Name == "btSearch"), queryHelp.Info);

                var listView = sc.Child <ListView>(b => b.Name == "lvResult");

                var columns = (from header in listView.Children <SortGridViewColumnHeader>(HelpButton.WhereFlags)
                               let token = header.RequestColumn.Token
                                           select new { header, token }).ToList();

                var external = columns.Extract(t => !(t.token is ColumnToken));

                foreach (var t in columns)
                {
                    SetHelpInfo(t.header, queryHelp.Columns.GetOrThrow(((ColumnToken)t.token).Column.Name));
                }


                if (external.Any())
                {
                    var externalRoutes = external.Select(a => a.token.GetPropertyRoute()).Distinct().ToList();

                    var dictionary = await Server.ReturnAsync((IHelpServer s) => s.GetPropertyRoutesService(externalRoutes));

                    foreach (var t in external)
                    {
                        SetHelpInfo(t.header, dictionary.TryGetC(t.token.GetPropertyRoute()));
                    }
                }
            };

            sc.ContextMenuOpened += async cm =>
            {
                if (helpButton.IsChecked == true && !sc.Implementations.IsByAll)
                {
                    var pairs = (from mi in cm.Items.OfType <MenuItem>()
                                 where mi.Tag is IContextualOperationContext
                                 select new { mi, coc = (IContextualOperationContext)mi.Tag })
                                .ToList();

                    var operations = pairs.Select(p => p.coc.OperationInfo.OperationSymbol).Distinct().ToList();
                    if (operations.Any())
                    {
                        var types = await Task.WhenAll(sc.Implementations.Types.Select(t => Server.ReturnAsync((IHelpServer s) => s.GetEntityHelpService(t))));

                        foreach (var p in pairs)
                        {
                            SetHelpInfo(p.mi, types.Select(t => t.Operations.TryGetC(p.coc.OperationInfo.OperationSymbol)).NotNull().FirstOrDefault());
                        }
                    }
                }
            };

            helpButton.IsEnabled = true;
        }