package editeur;

/** Une ligne de texte représentée par un StringBuffer.
  * @author	Xavier Crégut (cregut@enseeiht.fr)
  * @version	1.4
  */
public class LigneStringBuffer implements Ligne {

	//@ private invariant this.curseur == this.getCurseur();
	//@ private invariant this.getLongueur() == this.caracteres.length();
	//@ private invariant (\forall int i; i >= 1 && i <= this.getLongueur();
	//@			this.ieme(i) == this.caracteres.charAt(i-1));
	//@ private invariant caracteres != null;

	/** Les caractères de la ligne. */
	private StringBuffer caracteres;

	/** La position du curseur. */
	private int curseur;

	/** Créer une ligne vide.
	 */
	//@ ensures getLongueur() == 0;	// la ligne est vide
	public LigneStringBuffer() {
		caracteres = new StringBuffer();
		curseur = 0;
	}

	public int getLongueur() {
		return caracteres.length();
	}

	public int getCurseur() {
		return curseur;
	}

	public char ieme(int i) {
		return caracteres.charAt(i-1);
	}

	public char getCourant() {
		return ieme(curseur);
	}

	public void avancer() {
		curseur++;
	}

	public void reculer() {
		curseur--;
	}

	public void raz() {
		curseur = 1;
	}

	public void remplacer(char c) {
		caracteres.setCharAt(curseur-1, c);
	}

	public void supprimer() {
		// Supprimer le caractère
		caracteres.deleteCharAt(curseur-1);

		// Mettre à jour le curseur
		if (curseur > caracteres.length()) {
			curseur = caracteres.length();
		}
	}

	public void ajouterAvant(char c) {
		caracteres.insert(curseur-1, c);
		curseur++;
	}

	public void ajouterApres(char c) {
		caracteres.insert(curseur, c);
	}

	public void afficher() {
		if (caracteres.length() == 0) {	// La chaîne est vide
			System.out.print("~");
		} else {
			// Afficher les caractères avant le curseur
			System.out.print(caracteres.substring(0, curseur-1));

			// Afficher le caractère sous le curseur
			System.out.print("" + '[' + ieme(curseur) + ']');

			// Afficher les caractères après le curseur
			System.out.print(caracteres.substring(curseur));
		}
		System.out.println();
	}

	public String toString() {
		return "caractères = \"" + caracteres + '"'
					+ " et curseur = " + curseur;
	}

	public void ajouterFin(char c) {
		caracteres.append(c);
		if (curseur == 0) {
			curseur = 1;
		}
	}

	public void ajouterDebut(char c) {
		caracteres.insert(0, c);	// Ajouter le caractère
		curseur++;			// Rétablir le curseur
	}

	public void supprimerPremier() {
		caracteres.deleteCharAt(0);

		// Mettre à jour le curseur
		if (caracteres.length() == 0) {
			curseur = 0;
		} else if (curseur > 1) {
			curseur--;
		}
	}

	public void supprimerDernier() {
		caracteres.deleteCharAt(caracteres.length() - 1);
		if (curseur > caracteres.length()) {
			curseur--;
		}
	}

}
