Comment concevoir annuler & refaire dans l'éditeur de texte?
Le cadre de mon projet est d'écrire éditeur de texte utilisé pour le type de certaines règles et de ma demande de compiler et de l'exécuter. Écrit compilateur était fin et la version bêta de la version. Dans la version finale, nous devons ajouter annuler et rétablir dans l'éditeur de texte.J'ai utiliser le fichier et l'enregistrer périodiquement l'éditeur de texte. Comment concevoir défaire et refaire à mon éditeur de texte? Quel est le changement dans la structure de la persistance de fichier?
Quelle langue utilisez-vous?
la langue est de java
vous devriez jeter un oeil à stackoverflow.com/questions/49755/...
Si je fais des modifications a.txt dans notre rédacteur en chef, puis fermez votre éditeur de texte, puis l'ouvrir à nouveau et de la charge a.txt je devrais être en mesure d'annuler les modifications apportées à partir de ma session précédente?
Pas sûr, je pense que pas d'application dans le monde ont cette fonctionnalité
la langue est de java
vous devriez jeter un oeil à stackoverflow.com/questions/49755/...
Si je fais des modifications a.txt dans notre rédacteur en chef, puis fermez votre éditeur de texte, puis l'ouvrir à nouveau et de la charge a.txt je devrais être en mesure d'annuler les modifications apportées à partir de ma session précédente?
Pas sûr, je pense que pas d'application dans le monde ont cette fonctionnalité
OriginalL'auteur Sajad Bahmani | 2010-08-27
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le modèle de vos actions comme les commandes, que vous gardez en deux piles. Un pour annuler, l'autre pour les refaire. Vous pouvez composer vos commandes pour créer plus de commandes de haut niveau, comme quand vous voulez annuler les actions d'une macro, par exemple; ou si vous voulez grouper des frappes d'un seul mot ou d'une expression, d'un seul geste.
Chaque action dans votre éditeur de texte (ou un redo action) génère une nouvelle annulation de commande qui va dans la pile d'annulation (et efface également la pile de rétablissement). Chaque action annuler génère le correspondant de refaire la commande qui va dans la pile de rétablissement.
Vous pouvez aussi, comme mentionné dans les commentaires par derekerdmann, combiner à la fois les commandes annuler et rétablir dans un type de commande, qui ne sait comment se défaire et de refaire son action.
merci pour l'astuce.
OriginalL'auteur Jordão
Il y a essentiellement deux façons d'aller à ce sujet:
la "Commande" modèle de conception
à l'aide de seulement OO sur des objets immuables, où tout est immuable objets des objets immuables fait eux-mêmes des objets immuables (ce qui est moins courant, mais magnifiquement élégant quand il est fait correctement)
L'avantage de l'utilisation OO sur des objets immuables au cours de la naïveté de commande ou de la naïveté de undo/redo, c'est que vous n'avez pas besoin de réfléchir beaucoup à ce sujet: pas besoin de la fonction "annuler" l'effet d'une action et pas besoin de "replay" toutes les commandes. Tous vous avez besoin est un pointeur vers une liste énorme d'objets immuables.
Car les objets sont immuables tous les "états" peuvent être incroyablement léger parce que vous pouvez mettre en cache et la réutilisation de la plupart des objets dans n'importe quel état.
"OO sur des objets immuables" est un pur bijou. Probablement ne va pas devenir la norme avant un autre de 10 ans qui l'a dit ; )
P. S: faire de l'OO sur des objets immuables aussi étonnamment simplifie la programmation simultanée.
Oh, je crois que j'ai trouvé quelque chose sur annuler avec des objets immuables: stackoverflow.com/questions/1812978/...
OriginalL'auteur NoozNooz42
Si vous ne voulez pas quelque chose de compliqué, vous pouvez simplement ajouter un UndoManager. Votre
Document
déclenche uneUndoableEdit
chaque fois que vous ajoutez ou supprimez du texte. Pour défaire et refaire à chaque changement, il suffit d'appeler ces méthodes dans UndoManager.L'inconvénient de cette est UndoManager d'ajouter une nouvelle édition chaque fois que l'utilisateur tape quelque chose, donc en tapant "apple" qui vous laisse avec 5 modifications, être défait un à un. Pour mon éditeur de texte, j'ai écrit un wrapper pour les modifications qui stocke le temps qu'il a fait en plus le changement de texte et de l'offset, ainsi que d'une
UndoableEditListener
qui concatène les nouvelles éditions précédentes s'il y a seulement une courte période de temps entre eux (de 0,5 secondes fonctionne bien pour moi).Cela fonctionne bien pour le général editting, mais pose des problèmes quand un massif de remplacement est effectué. Si vous avez un document avec 5000 cas de "pomme" et vous avez voulu le remplacer par "orange", vous finirais avec 5000 monte tous les stocker "apple", "orange" et un offset. Pour diminuer la quantité de mémoire utilisée, j'ai traité cela comme un cas à part pour le commun des modifications et je suis plutôt stockage "apple", "orange" et un tableau de 5000 décalages. Je n'ai pas eu l'occasion de l'application de cette instant, mais je sais que ça va causer quelques maux de tête lorsque plusieurs chaînes correspondent à la condition de recherche (par exemple. recherche insensible à la casse, la regex de la recherche).
OriginalL'auteur lins314159
Wow, quelle conicidence - j'ai littéralement dans la dernière heure de mise en œuvre de undo/redo dans mon éditeur de texte WYSIWYG:
L'idée de base est de sauvegarder l'intégralité du contenu de l'éditeur de texte dans un tableau, ou la différence entre la dernière édition.
Mise à jour de ce tableau à des points importants, c'est à dire tous les quelques caractères (vérifiez la longueur du contenu de chaque pression sur une touche, si elle a plus de 20 personnages différents, puis faire un point de sauvegarde). Également à des changements dans le style (si texte riche), l'ajout d'images (si elle le permet), collage de texte, etc. Vous avez également besoin d'un pointeur(juste une variable int) pour pointer sur l'élément dans le tableau est l'état actuel de l'éditeur)
Faire de la matrice ont une longueur définie. Chaque fois que vous ajoutez un point de sauvegarde, l'ajouter au début de la matrice, et de déplacer tous les autres points de données par un. (le dernier élément du tableau sera oublié une fois que vous avez autant de points de sauvegarde)
Lorsque l'utilisateur appuie sur le bouton annuler, vérifier pour voir si le contenu actuel de l'éditeur sont les mêmes que la sauvegarde la plus récente (si ils ne le sont pas, alors l'utilisateur a apporté des modifications depuis le dernier point de sauvegarde, afin d'enregistrer le contenu de l'éditeur (de sorte qu'il peut être à refaire-ed), faire de l'éditeur égal au dernier point de sauvegarde, et de faire le pointeur de variable = 1 (2e élément dans un tableau ). Si elles sont elles même, aucune des modifications ont été apportées depuis le dernier point de sauvegarde, de sorte que vous devez annuler au point avant que. Pour ce faire, incrémente la valeur du pointeur + 1, et de rendre le contenu de l'éditeur = la valeur de pointeur.
De refaire simplement diminuer la valeur du pointeur par 1 et charger le contenu de l'array (assurez-vous de vérifier si vous avez atteint la fin du tableau).
Si l'utilisateur apporte des modifications après la défaire, puis déplacez le fait de tableau de valeur de la cellule à la cellule 0, et bouger le reste par la même quantité (vous n'avez pas envie de refaire autre chose une fois qu'ils ont fait des montages).
L'un des autres grands attraper point - assurez-vous d'ajouter un point de sauvegarde si le contenu de l'éditeur de texte ont réellement changé (sinon vous obtenir un double des points de sauvegarde et semblent annuler ne fait rien pour l'utilisateur.
Je ne peux pas vous aider avec des problèmes spécifiques à java, mais je suis heureux de répondre à toutes autres questions que vous avez,
Nico
OriginalL'auteur Nico Burns
Vous pouvez le faire de deux façons:
Dans mon (schéma) de l'éditeur, il y a quatre niveaux de changements d'état:
(par exemple, le déplacement de la souris)
mais qui ne sont pas reflétés dans le document édité modifiées sur le disque
(par exemple, la sélection d'éléments)
(par exemple, modification, l'ajout ou la suppression d'éléments)
OriginalL'auteur reinierpost
C'est un travail pour le modèle de commande.
OriginalL'auteur DanDan
Lire un livre Les Design Patterns: Elements de Logiciels Orientés Objets Réutilisables. Aussi loin que je me souvienne, il y a un assez bon exemple.
OriginalL'auteur Vladislav Rastrusny
Voici un extrait qui montre comment SWT prend en charge des opérations Annuler/Rétablir. Prendre comme exemple pratique (ou l'utiliser directement, si votre éditeur est basé sur SWT):
SWT Undo Redo
OriginalL'auteur Andreas_D