//----------------------------------------------------------------------------------------- // Evénements //----------------------------------------------------------------------------------------- #region IEventProcess // Traite les événements public void ProcessEvent(object from, object _this, IEvent e) { // // Change // Action après le changement d'une entité // if (e is EntityChangeEvent) { EntityChangeEvent ev = e as EntityChangeEvent; // Concerne ce model ? if (ev.Model == app.appModel) { if (ev.Entity is ObjectContent) { OnPropertyChanged("ObjectContentList"); } if (ev.Entity is ParamContent) { CurParamContentList = new ObservableCollection <ParamContent>(curObjectContent.ParamContent); } if (ev.Entity is DatabaseSource) { OnPropertyChanged("CurDatabaseSource"); } } } // // Pré-Create // Préprare la création d'une nouvelle entité (avant édition des champs) // if (e is EntityPreCreateEvent) { EntityPreCreateEvent ev = e as EntityPreCreateEvent; // Alloue l'entité if (ev.Entity == null) { ev.Entity = app.appModel.CreateEntity(ev.EntityName); } // Ajoute l'instance au model app.appModel.Add(ev.Entity); // Affecte le status de création ev.Entity.EntityState = EntityState.Added; // Initialise les données par défaut if (ev.Entity is IEntityPersistent) { IEntityPersistent p = ev.Entity as IEntityPersistent; //Affecte la source de données à la nouvelle entitée p.Factory = app.appModel.project.Factory; } if (ev.Entity is ObjectContent) { ObjectContent entity = ev.Entity as ObjectContent; // Ajoute au projet en cours app.Project.AddObjectContent(entity); // Génére un identifiant unique entity.Id = Guid.NewGuid().ToString("N"); foreach (var p in entity.ParamContent) { p.Id = Guid.NewGuid().ToString("N"); } } if (ev.Entity is ParamContent) { ParamContent entity = ev.Entity as ParamContent; CurObjectContent.AddParamContent(entity); // Génére un identifiant unique entity.Id = Guid.NewGuid().ToString("N"); } if (ev.Entity is DatabaseSource) { DatabaseSource entity = ev.Entity as DatabaseSource; app.Project.AddDatabaseSource(entity); if (app.States.SelectedDatabaseSourceId == null) { app.States.SelectedDatabaseSourceId = app.Project.DatabaseSource.First().Id; } } // Actualise l'interface app.ProcessEvent(this, this, new EntityChangeEvent(e, ev.Entity, app.appModel)); } // // Create // Crée la nouvelle entité (après édition des champs) // if (e is EntityCreateEvent) { EntityCreateEvent ev = e as EntityCreateEvent; if (ev.Entity != null) { // Valide le status de création ev.Entity.EntityState = EntityState.Unmodified; // Actualise l'interface app.ProcessEvent(this, this, new EntityChangeEvent(e, ev.Entity, app.appModel)); } } // // Pré-Update // Les données de l'entité vont êtres modifiées // if (e is EntityPreUpdateEvent) { EntityPreUpdateEvent ev = e as EntityPreUpdateEvent; // si l'entité fait partie du model if (ev.Entity != null && app.appModel.Contains(ev.Entity)) { // Préviens l'application app.ProcessEvent(this, this, new EntityChangeEvent(e, ev.Entity, app.appModel)); } } // // Update // Les données de l'entité sont modifiées // if (e is EntityUpdateEvent) { EntityUpdateEvent ev = e as EntityUpdateEvent; // si l'entité fait partie du model if (ev.Entity != null && app.appModel.Contains(ev.Entity)) { // Test la validité des champs if (ev.Entity is IEntityValidable) { string error; IEntityValidable v = ev.Entity as IEntityValidable; if (!v.IsValid(out error)) { app.ProcessException(new ApplicationException(error)); return; } } // Valide le status de création ev.Entity.EntityState = EntityState.Unmodified; // Actualise l'interface app.ProcessEvent(this, this, new EntityChangeEvent(e, ev.Entity, app.appModel)); } } // // Delete // Supprime l'entité // if (e is EntityDeleteEvent) { EntityDeleteEvent ev = e as EntityDeleteEvent; // si l'entité fait partie du model if (ev.Entity != null && app.appModel.Contains(ev.Entity)) { // Supprime du model app.appModel.Remove(ev.Entity); // Actualise l'interface app.ProcessEvent(this, this, new EntityChangeEvent(e, ev.Entity, app.appModel)); } } // Implémente la gestion du copier coller EventProcess.ProcessCopyPasteEvents(app, this, app.appModel, from, _this, e); }
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); } } }
//----------------------------------------------------------------------------------------- // Evénements //----------------------------------------------------------------------------------------- #region IEventProcess // Traite les événements public void ProcessEvent(object from, object _this, IEvent e) { // // Model Change // Après le changement du model // if (e is ModelChangeEvent) { ModelChangeEvent ev = e as ModelChangeEvent; //Actualise l'interface UpdateUI(); // Notifie les vues this.NotifyEvent(e); } // // Entity Change // Après le changement d'une entité // if (e is EntityChangeEvent) { EntityChangeEvent ev = e as EntityChangeEvent; //Actualise l'interface OnEntityChange(ev.Model, ev.Entity, ev.BaseEvent); // Notifie les vues this.NotifyEvent(e); } // // Pré-Create // Préprare la création d'une nouvelle entité (avant édition des champs) // if (e is EntityPreCreateEvent) { EntityPreCreateEvent ev = e as EntityPreCreateEvent; // Allocation if (ev.Entity == null) { ev.Entity = app.appModel.CreateEntity(ev.EntityName); } // Affecte le status de création ev.Entity.EntityState = EntityState.Added; // Initialise les données par défaut if (ev.Entity is IEntityPersistent) { IEntityPersistent p = ev.Entity as IEntityPersistent; //Affecte la source de données à la nouvelle entitée p.Factory = app.appModel.project.Factory; } if (ev.Entity is ObjectSyntax) { ObjectSyntax entity = ev.Entity as ObjectSyntax; // Ajoute au projet en cours app.Project.AddObjectSyntax(entity); } if (ev.Entity is ParamSyntax) { ParamSyntax entity = ev.Entity as ParamSyntax; // Ajoute au projet en cours app.Project.AddParamSyntax(entity); } if (ev.Entity is ObjectContent) { ObjectContent entity = ev.Entity as ObjectContent; // Ajoute au projet en cours app.Project.AddObjectContent(entity); // Génére un identifiant unique entity.Id = Guid.NewGuid().ToString("N"); foreach (var p in entity.ParamContent) { p.Id = Guid.NewGuid().ToString("N"); } } if (ev.Entity is ParamContent) { ParamContent entity = ev.Entity as ParamContent; CurObjectContent.AddParamContent(entity); // Génére un identifiant unique entity.Id = Guid.NewGuid().ToString("N"); } if (ev.Entity is SearchParams) { SearchParams entity = ev.Entity as SearchParams; app.Project.AddSearchParams(entity); } if (ev.Entity is DatabaseSource) { DatabaseSource entity = ev.Entity as DatabaseSource; app.Project.AddDatabaseSource(entity); if (app.States.SelectedDatabaseSourceId == null) { app.States.SelectedDatabaseSourceId = app.Project.DatabaseSource.First().Id; } } // Ajoute l'instance au model (notifie le controleur) app.appModel.Add(ev.Entity); } // Implémente la gestion du copier coller EventProcess.ProcessCopyPasteEvents(app, this, app.appModel, from, _this, e); /* * * // * // Change * // Action après le changement d'une entité * // * if (e is EntityChangeEvent) * { * EntityChangeEvent ev = e as EntityChangeEvent; * // Concerne ce model ? * if (ev.Model == app.appModel) * { * if (ev.Entity is ObjectContent) * { * OnPropertyChanged("ObjectContentList"); * } * if (ev.Entity is ParamContent) * { * CurParamContentList = new ObservableCollection<ParamContent>(curObjectContent.ParamContent); * } * if (ev.Entity is DatabaseSource) * { * OnPropertyChanged("CurDatabaseSource"); * } * } * }*/ }
/// <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; } } } }