package ftp_client;

import java.util.concurrent.Semaphore;

import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;

// Fenêtre d'interaction avec l'utilisateur,
// demandant quelque chose tel un nom de fichier/dossier pour un renommage
public class AskWindow {

	/* Controls */
	private Shell sShell = null; // Fenetre
	private Label label = null;  // Question
	private Text text = null;	 // Zone de saisie
	private Composite composite = null; // Conteneur
	private Button button = null;  // Bouton annuler
	private Button button1 = null; // Bouton valider

	/* Variables */
	String title, message, valeur; // Titre de la fenetre, question, valeur par defaut
	String rslt; // Reponse de l'utilisateur
	
	int selectStart, selectEnd; // Indices de selection (utilent pour le renommage d'un fichier par exemple, on ne selectionne que le nom sans l'extension)
	
	Semaphore s; // Semaphore pour bloquer la fonction en attendant la fermeture de la fenetre
	
	/* Constructors */
	// Avec juste un titre, une question et une valeur d'origine
	public AskWindow(String title, String message, String valeur){
		init(title, message, valeur, -1, -1);
	}
	// Et avec en plus les indices de selection
	public AskWindow(String title, String message, String valeur, int selectStart, int selectEnd){
		init(title, message, valeur, selectStart, selectEnd);
	}
	
	/* Initialize */
	// Copie des parametres dans des variables
	private void init(String title, String message, String valeur, int selectStart, int selectEnd){
		s = new Semaphore(0);
		s.release(); // Semaphore acquis d'origine, alors on le relache
		rslt = null;
		this.title = title;
		this.message = message;
		this.valeur = valeur;
		this.selectStart = selectStart;
		this.selectEnd = selectEnd;
	}
	
	/* Ask the user */
	// On pose la question à l'utilisateur et on retourne ce qu'il a rentré
	public String Ask(){
		// On prend le semaphore
		try {
			s.acquire();
		} catch (InterruptedException e1) {}
		// Resultat en cas d'annulation = null
		rslt = null;
		
		// Creation de la fenetre de maniere asynchrone (sinon cela bloque le rafraichissement de la fenetre)
		Display.getDefault().asyncExec(new Runnable() {
            public void run() {
				createSShell();
				sShell.open();
            }
		});
		// On essaye de reprendre le semaphore qui sera relaché à la fermeture de la fenetre
		try {
			s.acquire();
		} catch (InterruptedException e) {}
		// On le relache pour une prochaine utilisation
		s.release();
		// On retourne le resultat
		return rslt;
	}
	
	/* Form Init */
	// Creation de la fenetre
	private void createSShell() {
		// Les composants remplissent la fenetre...
		FillLayout fillLayout = new FillLayout();
		// ...de manière vertical
		fillLayout.type = org.eclipse.swt.SWT.VERTICAL;
		// On ne peut que retrecir la fenetre (impossible de la redimenssioner)
		sShell = new Shell(Display.getDefault(), SWT.MIN );
		sShell.setText(title);
		sShell.setLayout(fillLayout);
		sShell.setSize(new Point(523, 111));
		// Lorsque la fenetre se ferme, on relache le semaphore
		sShell.addShellListener(new org.eclipse.swt.events.ShellAdapter() {
			public void shellClosed(org.eclipse.swt.events.ShellEvent e) {
				s.release();
			}
		});
		// Label de la question
		label = new Label(sShell, SWT.NONE);
		label.setText(message);
		text = new Text(sShell, SWT.BORDER);
		text.setText(valeur);
		// Raccourcis clavier, la touche "Entree" valide la reponse, la touche "Echape" l'annule
		text.addKeyListener(new org.eclipse.swt.events.KeyAdapter() {
			public void keyPressed(org.eclipse.swt.events.KeyEvent e) {
				if(e.character == SWT.CR){
					rslt = text.getText();
					sShell.close();
					sShell.dispose();
					s.release();
				}else if(e.character == SWT.ESC){
					sShell.close();
					sShell.dispose();
					s.release();
				}
			}
		});
		// Initialisation des boutons
		createComposite();
		// On selectionne le texte voulu si demandé et si possible...
		if(selectStart>=0 && selectStart<selectEnd) text.setSelection(selectStart, selectEnd);
		// Sinon on selectionne tout
		else text.selectAll();
	}

	// Initialisation des boutons
	private void createComposite() {
		composite = new Composite(sShell, SWT.NONE);
		composite.setLayout(new FillLayout());		
		button1 = new Button(composite, SWT.NONE);
		button1.setText("Valider");
		// Si on valide, alors on ferme la fenetre et on relache le semaphore apres avoir stocker la reponse dans la variable rslt
		button1.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
				rslt = text.getText();
				sShell.close();
				sShell.dispose();
				s.release();
			}
		});
		button = new Button(composite, SWT.NONE);
		button.setText("Annuler");
		// Si on annule, on ferme la fenetre et on relace le semaphore
		button.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
				sShell.close();
				sShell.dispose();
				s.release();
			}
		});		
	}
	
}
