package fr.iutfbleau.pif;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.SwingUtilities;
/**
* La classe ControleurVisualisateur gère les interactions
* de la souris pour permettre le déplacement d'une image affichée
* dans un JScrollPane.
*
* Le déplacement se fait en maintenant le bouton gauche de la souris
* et en la faisant glisser.
*
* @version 1.0
* @author Aylane Sehl
* @author Jenson Val
* @author Séri-khane Yolou
*/
public class ControleurVisualisateur implements MouseListener, MouseMotionListener {
/**
* Panneau de défilement contenant l'image.
*/
private JScrollPane panneauDefilement;
/**
* Composant affichant l'image.
*/
private JLabel etiquetteImage;
/**
* Indique si l'utilisateur est en train de déplacer l'image.
*/
private boolean glisser;
/**
* Dernière position connue de la souris (coordonnées écran).
*/
private Point dernierPointEcran;
/**
* Construit le contrôleur de déplacement de l'image.
*
* @param panneauDefilement panneau de défilement
* @param etiquetteImage composant contenant l'image
*/
public ControleurVisualisateur(JScrollPane panneauDefilement, JLabel etiquetteImage) {
this.panneauDefilement = panneauDefilement;
this.etiquetteImage = etiquetteImage;
this.glisser = false;
this.dernierPointEcran = null;
}
/**
* Détecte l'appui sur le bouton gauche de la souris
* et initialise le déplacement.
*/
@Override
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
this.glisser = true;
this.dernierPointEcran = e.getLocationOnScreen();
}
}
/**
* Arrête le déplacement lorsque le bouton de la souris est relâché.
*/
@Override
public void mouseReleased(MouseEvent e) {
this.glisser = false;
this.dernierPointEcran = null;
}
/**
* Déplace la zone visible de l'image en fonction du mouvement
* de la souris.
*/
@Override
public void mouseDragged(MouseEvent e) {
if (!this.glisser || this.dernierPointEcran == null) {
return;
}
Point positionCourante = e.getLocationOnScreen();
int deplacementX = positionCourante.x - this.dernierPointEcran.x;
int deplacementY = positionCourante.y - this.dernierPointEcran.y;
JViewport viewport = this.panneauDefilement.getViewport();
Point positionVue = viewport.getViewPosition();
positionVue.x = positionVue.x - deplacementX;
positionVue.y = positionVue.y - deplacementY;
int maxX = this.etiquetteImage.getWidth() - viewport.getWidth();
int maxY = this.etiquetteImage.getHeight() - viewport.getHeight();
if (maxX < 0) {
maxX = 0;
}
if (maxY < 0) {
maxY = 0;
}
if (positionVue.x < 0) {
positionVue.x = 0;
}
if (positionVue.y < 0) {
positionVue.y = 0;
}
if (positionVue.x > maxX) {
positionVue.x = maxX;
}
if (positionVue.y > maxY) {
positionVue.y = maxY;
}
viewport.setViewPosition(positionVue);
this.dernierPointEcran = positionCourante;
}
/* Méthodes inutilisées mais obligatoires */
@Override
public void mouseClicked(MouseEvent e) { }
@Override
public void mouseEntered(MouseEvent e) { }
@Override
public void mouseExited(MouseEvent e) { }
@Override
public void mouseMoved(MouseEvent e) { }
}