/// <summary> /// Уведомляем всех подписчиков об изменении указанных объектов. /// Объекты в списке могут быть разных типов, метод разделит списки уведомлений, по типам объектов. /// </summary> /// <param name="subject">Subject.</param> public static void NotifyObjectUpdated(params object[] updatedSubjects) { if (ClassMappingList == null) { return; } // Чистим список от удаленных объектов. if (DateTime.Now.Subtract(lastCleaning).TotalSeconds > 1) { delayedNotifies.RemoveAll(d => d.ParentObject == null || d.ChangedObject == null); lastCleaning = DateTime.Now; } foreach (Type subjectType in updatedSubjects.Select(s => NHibernateProxyHelper.GuessClass(s)).Distinct()) { IOrmObjectMapping map = ClassMappingList.Find(m => m.ObjectClass == subjectType); if (map != null) { map.RaiseObjectUpdated(updatedSubjects.Where(s => NHibernateProxyHelper.GuessClass(s) == subjectType).ToArray()); } else { logger.Warn("В ClassMapingList класс {0} объекта не найден. Поэтому событие обновления не вызвано.", subjectType); } // Отсылаем уведомления дочерним объектам если они есть. foreach (DelayedNotifyLink link in delayedNotifies.FindAll(l => OrmMain.Equals(l.ParentObject, updatedSubjects[0]))) { NotifyObjectUpdated(link.ChangedObject); delayedNotifies.Remove(link); } } }
public override void Destroy() { logger.Debug("OrmReference #{0} Destroy() called.", number); IOrmObjectMapping map = OrmMain.GetObjectDescription(objectType); if (map != null) { map.ObjectUpdated -= OnRefObjectUpdated; } base.Destroy(); }
protected void OnYtreeviewRefButtonReleaseEvent(object o, ButtonReleaseEventArgs args) { IOrmObjectMapping map = OrmMain.GetObjectDescription(objectType); if (args.Event.Button == 3 && map.PopupMenuExist) { var selected = ytreeviewRef.GetSelectedObjects(); var menu = map.GetPopupMenu(selected); if (menu != null) { menu.ShowAll(); menu.Popup(); } } }
protected override void OnDestroyed() { logger.Debug($"EntryReference {subjectType} Destroyed() called."); //Отписываемся от событий. if (subjectType != null) { IOrmObjectMapping map = OrmMain.GetObjectDescription(subjectType); map.ObjectUpdated -= OnExternalObjectUpdated; } if (subject is INotifyPropertyChanged) { (subject as INotifyPropertyChanged).PropertyChanged -= OnSubjectPropertyChanged; } base.OnDestroyed(); }
void ConfigureDlg() { OrmMain.Count++; number = OrmMain.Count; logger.Debug("Открытие {0}", number); Mode = OrmReferenceMode.Normal; ButtonMode = ReferenceButtonMode.CanAll; IOrmObjectMapping map = OrmMain.GetObjectDescription(objectType); if (map != null) { map.ObjectUpdated += OnRefObjectUpdated; TableView = map.TableView; if (map.RefFilterClass != null) { FilterClass = map.RefFilterClass; } } else { throw new InvalidOperationException(String.Format("Для использования диалога, класс {0} должен быть добавлен в мапинг OrmMain.ClassMappingList.", objectType)); } object[] att = objectType.GetCustomAttributes(typeof(AppellativeAttribute), true); if (att.Length > 0) { this.TabName = (att [0] as AppellativeAttribute).NominativePlural.StringToTitleCase(); } var defaultMode = objectType.GetAttribute <DefaultReferenceButtonModeAttribute>(true); if (defaultMode != null) { ButtonMode = defaultMode.ReferenceButtonMode; } if (!String.IsNullOrWhiteSpace(map.EditPermisionName)) { if (!QSMain.User.Permissions [map.EditPermisionName]) { ButtonMode &= ~ReferenceButtonMode.CanAll; } } UpdateObjectList(); ytreeviewRef.Selection.Changed += OnTreeviewSelectionChanged; }
public static Type GetDialogType(System.Type objectClass) { if (ClassMappingList == null) { throw new NullReferenceException("ORM Модуль не настроен. Нужно создать ClassMapingList."); } if (objectClass.GetInterface(typeof(INHibernateProxy).FullName) != null) { objectClass = objectClass.BaseType; } IOrmObjectMapping map = ClassMappingList.Find(c => c.ObjectClass == objectClass); if (map == null) { logger.Warn("Диалог для типа {0} не найден.", objectClass); return(null); } else { return(map.DialogClass); } }
/// <summary> /// Уведомляем всех подписчиков об изменении указанных объектов. /// Объекты в списке могут быть разных типов, метод разделит списки уведомлений, по типам объектов. /// </summary> /// <param name="subject">Subject.</param> public static void NotifyObjectUpdated(EntityChangeEvent[] updatedSubjects) { if (ClassMappingList == null) { return; } var eventsGroups = updatedSubjects .Where(ev => ev.EventType == TypeOfChangeEvent.Insert || ev.EventType == TypeOfChangeEvent.Update) .GroupBy(s => s.EntityClass); foreach (var entityClassGroup in eventsGroups) { IOrmObjectMapping map = ClassMappingList.Find(m => m.ObjectClass == entityClassGroup.Key); if (map != null) { map.RaiseObjectUpdated(entityClassGroup.Select(x => x.Entity).ToArray()); } else { logger.Warn("В ClassMapingList класс {0} объекта не найден. Поэтому событие обновления не вызвано.", entityClassGroup.Key); } } }
public static IOrmObjectMapping AddObjectDescription(IOrmObjectMapping map) { ClassMappingList.Add(map); return(map); }