import java.awt.*;          
import java.awt.event.*;    
import javax.swing.*;       
import javax.swing.border.*;
import javax.swing.text.*;
import java.awt.datatransfer.*;
import javax.swing.event.*;
import javax.swing.undo.*;

public class FenetreTexte extends JFrame {
    JTextComponent champTexte = new JTextArea(10, 20);
    
    Action copier = new ActionCopier();
      
    { ... }

    CurseurListener curseurListener = new CurseurListener();
    GestionnaireUndo gestionnaireUndo = new GestionnaireUndo();

    public FenetreTexte() {
        super("Fenêtre Texte");
	this.addWindowListener(new WindowAdapter() {
		public void windowClosing(WindowEvent e) { System.exit(0); }
	    });

	Container cp = this.getContentPane();
	cp.setLayout(new BorderLayout());

	// Mise en place de la zone de texte
	{ ... }
	
	// Création et mise en place de la barre d'outils
	JToolBar barreOutil = new JToolBar();
	barreOutil.add(copier);
	{ ... }

	// Abonnement des auditeurs curseurListener et 
	// gestionnaireUndo au champ de texte et à son modèle 
	{ ... }
    }

    // L'auditeur gestionnaire de copie, coupe et collage
    class CurseurListener implements CaretListener {
	CurseurListener(){
	    { ... }
	}
	// Méthode testant si le presse-papier du système 
	// est vide et si c'est un String, utilisé pour initialiser
	// la fenêtre de l'éditeur.  
	private boolean pressePapierVide() {   
	    { ... }
	}
	
	// Définir les méthodes permettant de mettre à jour le 
	// gestionnaire et les actions copier, couper et coller
	{ ... }
	
	// L'unique méthode de l'interface CaretListener
	public void caretUpdate(CaretEvent e) {
	    { ... }
	}
    }

    // Le gestionnaire annuler/rétablir
    class GestionnaireUndo extends UndoManager {
	GestionnaireUndo() {
	    { ... }
	}
	public void undoableEditHappened(UndoableEditEvent e) {
	    { ... }
	}

    }

    class ActionCopier extends AbstractAction {
	public ActionCopier() { super("Copier"); }
	public void actionPerformed(ActionEvent e) {
	    champTexte.copy();
	    curseurListener.copy();
	}
    }

    // Les autres actions
    { ... }

    public static void main(String[] args) {
	FenetreTexte fen = new FenetreTexte();
	fen.pack();
	fen.show();
    }
}

