private bool CanUseTriggerForItems(BPTrigger trigger, object[] items) { // выражения нет - фильтровать ничего не нужно if (string.IsNullOrEmpty(trigger.TriggerExcpression)) { return(true); } // формируем фильтр var filters = new List <string>(); var filter = trigger.TriggerExcpression; if (!string.IsNullOrEmpty(filter)) { filters.Add(string.Format("({0})", filter)); } filter = GetFilter(items); if (!string.IsNullOrEmpty(filter)) { filters.Add(string.Format("({0})", filter)); } filter = string.Join(" AND ", filters.ToArray()); //var filter = string.Format("({0}) AND ({1})", trigger.TriggerExcpression, GetFilter(items)); // получаем Manager-a var objectType = items[0].GetType(); var interfaceType = typeof(IBaseManager <>).MakeGenericType(objectType); var managerInstance = IoC.Instance.Resolve(interfaceType) as IBaseManager; if (managerInstance == null) { throw new DeveloperException("Не найден Manager для сущности '{0}'.", objectType.Name); } var checkedItems = managerInstance.GetFiltered(filter, GetModeEnum.Partial).ToArray(); return(checkedItems.Length == items.Length); }
private void CreateBtnMenu(string code, BPTrigger trigger, object bpCode, MenuItemBase miChild = null) { if (string.IsNullOrEmpty(code)) { throw new ArgumentNullException("code"); } // получаем кнопку UIButton btn; using (var btnMgr = IoC.Instance.Resolve <IBaseManager <UIButton> >()) btn = btnMgr.Get(code); if (btn == null) { throw new DeveloperException("Can't find button with code " + code); } // Eсли кнопка будет добавляться в бар и имеет имеет ребенка и родителя, то - ListMenuItem, если только ребенка, то SubListMenuItem, а если в бар не добавляется, то Command // Вот такая "прозрачная" логика, будь она не ладна! var res = miChild != null ? !string.IsNullOrEmpty(btn.Parent) ? new ListMenuItem() : new SubListMenuItem() : new CommandMenuItem { Command = ExecuteBPCommand }; // если можем добавит вложенный элемент (вне зависимости от того, что перед нами), то добавляем var miList = res as ListMenuItem; if (miList != null) { miList.MenuItems.Add(miChild); } //заполняем параметры кнопок res.Name = code; res.IsDynamicBarItem = true; res.IsEnable = true; res.Caption = btn.Caption; res.Hint = btn.Hint; res.GlyphAlignment = GlyphAlignmentType.Top; res.DisplayMode = DisplayModeType.Default; res.Priority = (int)btn.Order; res.CommandParameter = new BusinessProcessCommandParameter(bpCode, trigger, res); if (!string.IsNullOrEmpty(btn.Image)) { res.ImageSmall = ResourceHelper.GetImageByName("wmsMLC.DCL.Resources", "ImageResources", string.Format("{0}16", btn.Image)) ?? ImageResources.DCLDefault16.GetBitmapImage(); res.ImageLarge = ResourceHelper.GetImageByName("wmsMLC.DCL.Resources", "ImageResources", string.Format("{0}32", btn.Image)) ?? ImageResources.DCLDefault32.GetBitmapImage(); } else { res.ImageSmall = ImageResources.DCLDefault16.GetBitmapImage(); res.ImageLarge = ImageResources.DCLDefault32.GetBitmapImage(); } if (!string.IsNullOrEmpty(btn.HotKey)) { var kgc = new KeyGestureConverter(); var hotKey = kgc.ConvertFromString(btn.HotKey) as KeyGesture; if (hotKey != null) { res.HotKey = hotKey; } } // получаем панель. нет - используем стандартную var bar = string.IsNullOrEmpty(btn.Panel) ? _processBar : Menu.GetOrCreateBarItem(btn.Panel); if (string.IsNullOrEmpty(btn.Parent)) { // если базовой не нашли, добавлем в список bar.MenuItems.Add(res); } else { MenuItemBase baseItem = null; // ищем такую кнопку foreach (var menuItem in bar.MenuItems) { baseItem = GetMenuItem(menuItem, btn.Parent); if (baseItem == null) { continue; } var listItem = baseItem as ListMenuItem; if (listItem == null) { throw new DeveloperException( "Ошибка настройки кнопок меню процессов. Невозможно добавить кнопку с кодом {0} в кнопку с кодом {1} - не найден список", code, btn.Parent); } listItem.MenuItems.Add(res); break; } if (baseItem == null) { CreateBtnMenu(btn.Parent, null, null, res); } } }
/// <summary> /// Метод определяет возможно ли запустить данный триггер для выделенных элементов. Если хотя бы для одного такой возможности нет, то меню блокируется для всех /// </summary> /// <param name="trigger">запускаемый триггер</param> /// <param name="items">проверочная коллекция элементов</param> /// <returns>истина - в случае возможности запуска</returns> private async Task <bool> CanUseTriggerForItems(BPTrigger trigger, object[] items) { if (WMSEnvironment.Instance.IsConnected == false) { return(false); } //INFO: признак того, что можно запускать без выбранной или новой записи //TODO: сделанть enum на действие if (trigger.TriggerAction.EqIgnoreCase("FORCE")) { return(true); } if (items == null || items.Length == 0) { return(false); } // если новый объект, то запрещаем var source = Source as IIsNew; if (source != null && source.IsNew) { return(false); } // если коолекция и стоит признак OnlyOne if (trigger.TriggerOnlyByOneItem && items.Length > 1) { return(false); } // если есть фильтр по сущности if (!string.IsNullOrEmpty(trigger.TriggerEntityFilter)) { try { var res = items.Cast <T>().Where(trigger.TriggerEntityFilter); if (items.Count() != res.Count()) { return(false); } } catch (Exception ex) { var message = string.Format( "Не удалось применить клиентскую проверку триггера процесса. Процесс '{0}'. Выражение '{1}'.", trigger.ProcessCode, trigger.TriggerEntityFilter); _log.Debug(message, ex); return(false); } } // выражения нет - фильтровать ничего не нужно if (string.IsNullOrEmpty(trigger.TriggerExcpression)) { return(EmptyTriggerExpressionAllowExecuteAnyItem); } // формируем фильтр var filter = GetBPCheckFilter(trigger.TriggerExcpression, items); // получаем Manager-a var objectType = items[0].GetType(); var interfaceType = typeof(IBaseManager <>).MakeGenericType(objectType); return(await CheckTriggerAsync(items, interfaceType, objectType, filter)); }