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; }
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; }