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