Beispiel #1
0
        /// <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);
                }
            }
        }
Beispiel #2
0
        public override void Destroy()
        {
            logger.Debug("OrmReference #{0} Destroy() called.", number);
            IOrmObjectMapping map = OrmMain.GetObjectDescription(objectType);

            if (map != null)
            {
                map.ObjectUpdated -= OnRefObjectUpdated;
            }
            base.Destroy();
        }
Beispiel #3
0
        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();
                }
            }
        }
Beispiel #4
0
 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();
 }
Beispiel #5
0
        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;
        }
Beispiel #6
0
        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);
            }
        }
Beispiel #7
0
        /// <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);
                }
            }
        }
Beispiel #8
0
 public static IOrmObjectMapping AddObjectDescription(IOrmObjectMapping map)
 {
     ClassMappingList.Add(map);
     return(map);
 }