Copie et collage

Modèles

La conception de IBM® ILOG® Dojo Diagrammer peut être divisée en deux scénarios principaux :
dans le premier scénario, le widget Diagram est utilisé pour afficher le contenu d'un magasin de données sous la forme d'un diagramme.
dans le deuxième scénario, une Selection est généralement constituée de formes GFX qui sont créées au niveau de l'interface utilisateur et qui ne sont pas liées à un magasin de données.
Cette division affecte la fonctionnalité copier-coller. Dans le premier scénario, si vous copiez et collez un contenu dans un magasin de données, une duplication a lieu dans le magasin de données et le graphique reflète la modification par le biais de mises à jour de dépendance. Dans le deuxième scénario, la duplication a lieu au niveau GFX. Un utilisateur peut également souhaiter que des données utilisateur soient stockées et appliquées dans les opérations copier-coller, y compris des données utilisateur qui ne sont pas visibles actuellement. Ces opérations génèrent des résultats différents selon le scénario utilisé.
Pour répondre à cette variabilité, IBM® ILOG® Dojo Diagrammer fournit une bibliothèque avec des opérations de modèle qui permettent d'implémenter des personnalisations.

Représentation

La représentation d'éléments copiés doit être indépendante du contexte. Par exemple, la représentation doit être présente même si aucune surface GFX n'est active (par exemple, lorsqu'il n'y a pas de connexion DataStore). La représentation est similaire à l'algorithme de sérialisation de dojox.gfx, qui est doté de cette propriété (indépendance de la plateforme/du restituteur). La sérialisation convertit des objets GFX en une représentation d'objet JavaScript compatible avec JSON, indépendante du restituteur et de l'existence de la surface. Le même concept est appliqué pour représenter des formes copiées.

Sérialisation et désérialisation

La classe Serializer traite la logique de squelette pour la sérialisation et en particulier dans les opérations de copier-coller. Les opérations de copie sont sérialisées dans le presse-papiers et les opérations de collage sont désérialisées à partir du presse-papiers.
La classe ibm_ilog.diagram.util.Serializer comprend un ensemble de rappels utilisateur qui traitent les données copiées dans les moindres détails. Les rappels incluent une fonction pour obtenir les identificateurs associés aux entités copiées et une fonction de sérialisation pour chaque entité d'un graphe.
Les rappels de sérialisation génèrent et renvoient la représentation de l'entité associée. Ces données sont utilisées par le rappel utilisateur associé pour la désérialisation. Vous devez donc disposer placer toutes les données requises pour la reconstruction de l'entité dans le contexte approprié.
Les rappels de désérialisation créent de nouvelles entités basées sur leur représentation existante. Ces rappels reçoivent les données sérialisées par les rappels utilisateur, y compris un dictionnaire par ID de toutes les nouvelles entités créées dans le processus de désérialisation et le conteneur dans lequel la nouvelle entité est créée par le rappel en cours. Un rappel de désérialisation doit également renvoyer un objet représentant l'entité nouvellement créée via la désérialisation. Cette valeur est stockée dans le dictionnaire pour les autres appels de rappel du processus et transmise comme argument de conteneur dans les appels aux enfants de l'entité (dans le cas de sous-graphes).
Les rappels suivants sont utilisés dans le processus de sérialisation et désérialisation :
  • getId identifie les éléments de graphe sérialisés par le biais du processus de sérialisation/désérialisation.
  • serializeNodeData permet de sérialiser un noeud. Utilisez cette fonction de rappel pour créer la représentation appropriée pour un noeud qui sera utilisé ultérieurement par la fonction de désérialisation correspondante.
  • serializeLinkData permet de sérialiser un lien. Utilisez cette fonction de rappel pour créer la représentation appropriée pour un lien qui sera utilisé ultérieurement par la fonction de désérialisation correspondante.
  • serializeSubgraphData permet de sérialiser un sous-graphe. Utilisez cette fonction de rappel pour créer la représentation appropriée pour un sous-graphe qui sera utilisé ultérieurement par la fonction de désérialisation correspondante.
  • deserializeNodeData désérialise un noeud à partir des données sérialisées dans un conteneur donné.
  • deserializeLinkData désérialise un lien à partir des données sérialisées dans un conteneur donné.
  • deserializeSubgraphData désérialise un sous-graphe à partir des données sérialisées dans un conteneur donné.
Pour des personnalisations de copier-coller, appelez la fonction serialize(entity), puis la fonction deserialize(representation,container). L'argument entity est l'objet sérialisé. L'argument representation est le résultat obtenu de l'appel précédent de serialize, et container est l'objet compatible avec les objets définis par l'utilisateur renvoyés dans le rappel deserializeSubgraph. La fonction deserialize collecte les résultats des rappels utilisateur et les renvoie dans une structure de données.

Exemple

L'exemple suivant montre comment écrire un sérialiseur de graphe basé sur un magasin de données de base :
var serializer = new ibm_ilog.diagram.util.Serializer({
   getId: function(ge) {
      return ge.getId();
   },
   serializeNodeData: function(ge){
      return {
         transform:m.clone(ge.getTransform())
      };
   },
   deserializeNodeData: function(s,newByOldId,container){
      var node = container.graph.createNode();
      node.setTransform(s.transform);
      return {created:node};
   },
   serializeSubgraphData: function(ge){
      return {
         transform:m.clone(ge.getTransform())
      };
   },
   deserializeSubgraphData: function(s,newByOldId,container){
      var sg = container.graph.createSubgraph();
      sg.setTransform(s.transform);
      return {created:sg,graph:sg.getGraph()};
   },
   serializeLinkData: function(ge){
      return {
         startId:ge.getStartNode().getId(),
         endId:ge.getEndNode().getId()
      };
   },
   deserializeLinkData: function(s,newByOldId,container){
      var link = container.graph.createLink();
      link.setStartNode(newByOldId.item(s.startId).created);
      link.setEndNode(newByOldId.item(s.endId).created);
      return {created:link};
   }
});