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