Example #1
0
 /// <summary>
 /// Désabonne un objet notifié
 /// </summary>
 /// <param name="proc">Objet de base IEventProcess</param>
 public void NotifyUnRegister(IEventProcess proc)
 {
     if (notify.Contains(proc) == true)
     {
         notify.Remove(proc);
     }
 }
Example #2
0
 /// <summary>
 /// Abonne un objet aux notifications
 /// </summary>
 /// <param name="proc">Objet de base IEventProcess</param>
 public void NotifyRegister(IEventProcess proc)
 {
     if (notify.Contains(proc) == false)
     {
         notify.Add(proc);
     }
 }
Example #3
0
 /// <summary>
 /// Transmet un événement aux propriétés (controleurs) enfant d'une classe
 /// </summary>
 /// <param name="model">Classe parent</param>
 /// <param name="from">Paramètre passé par la méthode ProcessEvent</param>
 /// <param name="_this">Paramètre passé par la méthode ProcessEvent</param>
 /// <param name="param">Paramètre passé par la méthode ProcessEvent</param>
 public static void SendToProperties(IEventProcess model, object from, object _this, IEvent param)
 {
     // passe l'evenement aux modeles enfants
     foreach (PropertyInfo p in model.GetType().GetProperties())
     {
         //
         IEventProcess child = p.GetValue(model, null) as IEventProcess;
         if (child != null)
         {
             child.ProcessEvent(from, _this, param);
             continue;
         }
     }
 }
Example #4
0
        void EditableDataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
        {
            IEventProcess process = this.DataContext as IEventProcess;

            this.EditMode = true;

            if (CurEvent == null && process != null && e.Row.Item is IEntity)
            {
                IEntity entity = e.Row.Item as IEntity;

                // Nouvelle entité ?
                // Note: l'attribut Model est testé pour savoir si l'entité a été créé automatiquement par le DataGrid (e.Row.IsNewItem ne peut pas être utilisé car il retourne toujours true pour une entité crée précédemment)
                // Note: Si l'entité est à l'état EntityState.Deleted alors elle doit être créée par le model
                // Note: Si l'entité est à l'état EntityState.Added alors elle doit être recréée car sa création n'a pas été confirmé par le model
                if (entity.Model == null || entity.EntityState == EntityState.Deleted || entity.EntityState == EntityState.Added /*e.Row.IsNewItem*/)
                {
                    // pré création de l'entité (si ce n'est pas déjà fait)
                    // NOTE: l'allocation est réalisée automatiquement par le binding, EntityPreCreateEvent est appelé pour insérer l'entité au model
                    if (entity.Model == null || entity.EntityState == EntityState.Deleted)
                    {
                        process.ProcessEvent(this, this, new EntityPreCreateEvent(entity));
                    }

                    // prépare l'événement final
                    CurEvent = new EntityCreateEvent(entity);
                }
                else
                {
                    // pré modification de l'entité
                    // NOTE: permet entre autre de sauvegarder l'état de l'entité par le gestionnaire d'états
                    process.ProcessEvent(this, this, new EntityPreUpdateEvent(entity));

                    // prépare l'événement final
                    CurEvent = new EntityUpdateEvent(entity);
                }
            }
        }
Example #5
0
        private void EditableDataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            // Supprimer
            if (e.Key == Key.Delete && this.SelectedItem != null && this.EditMode == false)
            {
                // liste la sélection
                // (utilise une nouvelle instance de la liste pour éviter toute exception lors de la modification de la collection durant son énumération)
                List <IEntity> selection = new List <IEntity>();
                if (this.SelectionMode == DataGridSelectionMode.Extended && this.SelectedItems != null)
                {
                    foreach (var item in this.SelectedItems)
                    {
                        if (item is IEntity)
                        {
                            selection.Add(item as IEntity);
                        }
                    }
                }
                else
                {
                    if (this.SelectedItem is IEntity)
                    {
                        selection.Add(this.SelectedItem as IEntity);
                    }
                }

                // Applique les modifications
                foreach (IEntity entity in selection)
                {
                    // Demande la supression
                    try
                    {
                        entity.Model.Delete(entity);
                    }
                    catch (Exception ex)
                    {
                        app.ProcessException(ex);
                        e.Handled = true;// Annule la suppression de la ligne
                        return;
                    }
                }
            }

            // Copier
            if (e.Key == Key.C && e.KeyboardDevice.Modifiers == ModifierKeys.Control && this.SelectedItem != null && this.EditMode == false)
            {
                EntityCopyPasteEvent ev = new EntityCopyPasteEvent(EntityCopyPasteEventType.Copy);

                if (this.SelectionMode == DataGridSelectionMode.Extended && this.SelectedItems != null)
                {
                    foreach (IEntity entity in this.SelectedItems)
                    {
                        ev.Entities.Add(entity);
                    }
                }
                else if (this.SelectedItem != null)
                {
                    ev.Entities.Add(this.SelectedItem as IEntity);
                }

                if (ev.IsEmpty() == false)
                {
                    //IEventProcess process = Application.Current as IEventProcess;
                    IEventProcess process = this.DataContext as IEventProcess;
                    if (process != null)
                    {
                        process.ProcessEvent(this, this, ev);
                    }
                }
            }

            // Coller
            if (e.Key == Key.V && e.KeyboardDevice.Modifiers == ModifierKeys.Control && this.SelectedItem != null && this.EditMode == false)
            {
                IEventProcess process = this.DataContext as IEventProcess;
                if (process != null)
                {
                    process.ProcessEvent(this, this, new EntityCopyPasteEvent(EntityCopyPasteEventType.Paste));
                }
            }

            // Inserer
            if (e.Key == Key.Insert && this.SelectedItem != null && this.EditMode == false)
            {
                Type itemType = this.Items.SourceCollection.GetType().GetGenericArguments().Single();

                // pré création de l'entité
                EntityPreCreateEvent ev      = new EntityPreCreateEvent(itemType.Name);
                IEventProcess        process = this.DataContext as IEventProcess;
                if (process == null)
                {
                    return;
                }

                // Pré création OK ?
                process.ProcessEvent(this, this, ev);
                if (ev.Entity == null)
                {
                    return;
                }

                // Création
                try
                {
                    ev.Entity.Model.Create(ev.Entity);
                }
                catch (Exception ex)
                {
                    app.ProcessException(ex);
                }
            }
        }
Example #6
0
        /// <summary>
        /// Implémente les interactions du presse-papier avec model de données
        /// </summary>
        /// <param name="thisProc">Pointeur sur l'instance du controler recevant les événements</param>
        /// <param name="dataModel">Pointeur sur le model de données concerné</param>
        /// <param name="from">Paramètre passé par la méthode ProcessEvent</param>
        /// <param name="_this">Paramètre passé par la méthode ProcessEvent</param>
        /// <param name="e">Paramètre passé par la méthode ProcessEvent</param>
        public static void ProcessCopyPasteEvents(IEventProcess app, IEventProcess thisProc, IModel dataModel, object from, object _this, IEvent e)
        {
            //
            // Copy/Paste
            // Copie/Colle l'entité dans le presse-papier
            //
            if (e is EntityCopyPasteEvent)
            {
                EntityCopyPasteEvent ev = e as EntityCopyPasteEvent;
                // Copier
                if (ev.Type == EntityCopyPasteEventType.Copy && ev.IsEmpty() == false)
                {
                    XmlDocument doc = new XmlDocument();
                    doc.AppendChild(doc.CreateElement("root"));
                    foreach (IEntity entity in ev.Entities)
                    {
                        if (entity is IEntitySerializable)
                        {
                            IEntitySerializable serial = entity as IEntitySerializable;
                            serial.ToXml(doc.DocumentElement);
                        }
                    }
                    //Clipboard.SetData("text/xml", doc.InnerXml);
                    Clipboard.SetText(doc.InnerXml);
                }
                // Coller
                if (ev.Type == EntityCopyPasteEventType.Paste)
                {
                    //string text = Clipboard.GetData("text/xml");
                    string text = Clipboard.GetText(); // Texte ou XML
                    if (String.IsNullOrWhiteSpace(text))
                    {
                        return;
                    }

                    XmlDocument doc = new XmlDocument();
                    doc.LoadXml(text);
                    if (doc.DocumentElement == null)
                    {
                        return;
                    }

                    XmlNode cur = doc.DocumentElement.FirstChild;
                    while (cur != null)
                    {
                        if (cur is XmlElement)
                        {
                            try
                            {
                                // Alloue une instance de l’entité
                                XmlElement           elm      = cur as XmlElement;
                                EntityPreCreateEvent evCreate = new EntityPreCreateEvent(elm.LocalName);
                                thisProc.ProcessEvent(_this, _this, evCreate);
                                IEntity entity = evCreate.Entity;
                                if (entity == null)
                                {
                                    continue;
                                }

                                // Dé-sérialise les données dans l’instance
                                entity.EntityState = EntityState.Added;

                                if (entity is IEntitySerializable)
                                {
                                    IEntitySerializable serial = entity as IEntitySerializable;
                                    serial.FromXml(elm, (aggr) =>
                                    {
                                        aggr.EntityState = EntityState.Added;
                                        if (aggr is IEntityPersistent)
                                        {
                                            (aggr as IEntityPersistent).RaiseIdentity();
                                        }
                                    });
                                }

                                // Ajoute l’objet créé dans l’événement EntityCopyPasteEventType
                                ev.AddEntity(entity);

                                // Notifie la création de l'entité
                                thisProc.ProcessEvent(_this, _this, new EntityCreateEvent(entity));
                            }
                            catch (Exception)
                            {
                                continue;
                            }
                        }
                        cur = cur.NextSibling;
                    }
                }
            }
        }