mirror of
https://github.com/LucasVbr/LecteurPdfDoubleAffichage.git
synced 2026-05-14 01:21:50 +00:00
Refactor et commentaire terminé (Need edit de Typo)
This commit is contained in:
@@ -51,7 +51,7 @@ public class GestionFenetre {
|
||||
* (mode Synchronisé)
|
||||
*/
|
||||
public static void nextPages() {
|
||||
for (Fenetre ihm : FENETRE_LIST) ihm.getPdfPanel().nextPage();
|
||||
for (Fenetre ihm : FENETRE_LIST) ihm.getPdfPanel().pageSuivante();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -59,7 +59,7 @@ public class GestionFenetre {
|
||||
* (mode Synchronisé)
|
||||
*/
|
||||
public static void previousPages() {
|
||||
for (Fenetre ihm : FENETRE_LIST) ihm.getPdfPanel().previousPage();
|
||||
for (Fenetre ihm : FENETRE_LIST) ihm.getPdfPanel().pagePrecedente();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -14,7 +14,7 @@ import java.awt.*;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* TODO commentaires
|
||||
* Gestionnaire de mode Synchonisé ou Séparé
|
||||
*
|
||||
* @author Léo Franch
|
||||
* @author Lucas Vabre
|
||||
@@ -23,32 +23,23 @@ import java.util.ArrayList;
|
||||
*/
|
||||
public class GestionMode {
|
||||
|
||||
/**
|
||||
* Défini le mode actif :
|
||||
* true -> Mode Séparé
|
||||
* false -> Mode Synchronisé
|
||||
*/
|
||||
/** Défini si le mode séparé est activé ou non */
|
||||
private static boolean modeSepare;
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*/
|
||||
/** Liste les MenuItems de type NouvelleFenetre de l'application */
|
||||
private static final ArrayList<NouvelleFenetre> nouvelleFenetreList = new ArrayList<>();
|
||||
|
||||
/** Liste les MenuItem de type ModeSeparé de l'application */
|
||||
private static final ArrayList<ModeSepare> modeSepareList = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*/
|
||||
/** Liste les MenuItem de type ModeSynchronise de l'application */
|
||||
private static final ArrayList<ModeSynchronise> modeSynchroniseList = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*/
|
||||
private static final ArrayList<NouvelleFenetre> nouvelleFenetreList = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* TODO
|
||||
* @param separe
|
||||
* @param synchronise
|
||||
* Référence les elements NouvelleFenetre, ModeSepare, ModeSynchronise lors de la création d'une nouvelle fenêtre
|
||||
* @param fenetre Référence du MenuItem NouvelleFenetre de la fenêtre crée
|
||||
* @param separe Référence du MenuItem ModeSepare de la fenêtre crée
|
||||
* @param synchronise Référence du MenuItem ModeSynchronise de la fenêtre crée
|
||||
*/
|
||||
@SuppressWarnings("SpellCheckingInspection")
|
||||
public static void addItem(NouvelleFenetre fenetre, ModeSepare separe, ModeSynchronise synchronise) {
|
||||
@@ -58,16 +49,14 @@ public class GestionMode {
|
||||
updateMode();
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO
|
||||
* @return
|
||||
*/
|
||||
/** @return true si le mode séparé est activé, false sinon */
|
||||
public static boolean isModeSepare() {
|
||||
return modeSepare;
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO
|
||||
* Change de mode
|
||||
* @param mode true pour le mode séparé, false pour le mode synchronisé
|
||||
*/
|
||||
public static void setModeSepare(boolean mode) {
|
||||
modeSepare = mode;
|
||||
@@ -75,7 +64,7 @@ public class GestionMode {
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO
|
||||
* Met a jour dans toutes les fenêtres ouvertes la checkbox du mode selectionné
|
||||
*/
|
||||
private static void updateMode() {
|
||||
for (int i = 0; i < modeSepareList.size() ; i++) {
|
||||
@@ -85,9 +74,9 @@ public class GestionMode {
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO
|
||||
* Grise le boutton "Nouvelle Fenêtre" de toute les fenêtres de l'application
|
||||
*/
|
||||
public static void desactiverFenetre() {
|
||||
public static void desactiverBtnNouvelleFenetre() {
|
||||
for (NouvelleFenetre item : nouvelleFenetreList) {
|
||||
item.setEnabled(false);
|
||||
item.setBackground(Color.GRAY);
|
||||
@@ -95,7 +84,7 @@ public class GestionMode {
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO
|
||||
* Dégrise le boutton "Nouvelle Fenêtre" de toutes les fenêtres de l'application
|
||||
*/
|
||||
public static void activerBtnNouvelleFenetre() {
|
||||
for (NouvelleFenetre item : nouvelleFenetreList) {
|
||||
|
||||
@@ -34,9 +34,9 @@ public class MenuMode extends JMenu {
|
||||
super("Mode");
|
||||
|
||||
/* Crée les différentes options */
|
||||
NouvelleFenetre nouvelleFenetre = new NouvelleFenetre(parent);
|
||||
ModeSepare modeSepare = new ModeSepare();
|
||||
ModeSynchronise modeSynchronise = new ModeSynchronise();
|
||||
NouvelleFenetre nouvelleFenetre = new NouvelleFenetre(parent);
|
||||
|
||||
/* Les ajoute au gestionnaire des modes */
|
||||
GestionMode.addItem(nouvelleFenetre, modeSepare, modeSynchronise);
|
||||
|
||||
@@ -37,6 +37,6 @@ public class NouvelleFenetre extends MenuItem {
|
||||
GestionFenetre.newIhmPdf();
|
||||
|
||||
/* Désactive le bouton si on a atteint la limite des affichages */
|
||||
if (GestionFenetre.FENETRE_LIST.size() == GestionFenetre.NB_MAX_PDF) GestionMode.desactiverFenetre();
|
||||
if (GestionFenetre.FENETRE_LIST.size() == GestionFenetre.NB_MAX_PDF) GestionMode.desactiverBtnNouvelleFenetre();
|
||||
}
|
||||
}
|
||||
@@ -37,7 +37,7 @@ public class PagePrecedente extends MenuItem {
|
||||
@Override
|
||||
protected void action(ActionEvent evt) {
|
||||
if (GestionMode.isModeSepare()) {
|
||||
parent.getPdfPanel().previousPage();
|
||||
parent.getPdfPanel().pagePrecedente();
|
||||
} else {
|
||||
GestionFenetre.previousPages();
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ public class PageSuivante extends MenuItem {
|
||||
@Override
|
||||
protected void action(ActionEvent evt) {
|
||||
if (GestionMode.isModeSepare()) {
|
||||
parent.getPdfPanel().nextPage();
|
||||
parent.getPdfPanel().pageSuivante();
|
||||
} else {
|
||||
GestionFenetre.nextPages();
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ public class ZoomDefaut extends MenuItem {
|
||||
|
||||
@Override
|
||||
protected void action(ActionEvent evt) {
|
||||
parent.getPdfPanel().updateScaleZoom(1.0f);
|
||||
parent.getPdfPanel().setZoom(1.0f);
|
||||
parent.validate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ public class ZoomMoins extends MenuItem {
|
||||
|
||||
@Override
|
||||
protected void action(ActionEvent evt) {
|
||||
parent.getPdfPanel().updateScaleZoom(0.5f);
|
||||
parent.getPdfPanel().setZoom(0.5f);
|
||||
parent.validate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ public class ZoomPlus extends MenuItem {
|
||||
|
||||
@Override
|
||||
protected void action(ActionEvent evt) {
|
||||
parent.getPdfPanel().updateScaleZoom(1.5f);
|
||||
parent.getPdfPanel().setZoom(1.5f);
|
||||
parent.validate();
|
||||
}
|
||||
}
|
||||
@@ -14,7 +14,7 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* TODO commentaires
|
||||
* Classe qui représente un document PDF ouvert, elle permet de créer des images des pages
|
||||
*
|
||||
* @author Léo Franch
|
||||
* @author Lucas Vabre
|
||||
@@ -23,23 +23,23 @@ import java.io.IOException;
|
||||
*/
|
||||
public class DocumentPdf {
|
||||
|
||||
/** TODO */
|
||||
/** Le document PDF chargé avec PdfBox */
|
||||
private final PDDocument document;
|
||||
|
||||
/** TODO */
|
||||
/** L'outils de rendus de PdfBox */
|
||||
private PDFRenderer renderer;
|
||||
|
||||
/** TODO */
|
||||
/** La largueur par défaut de la page courrante */
|
||||
private int minWidth;
|
||||
|
||||
/** TODO */
|
||||
/** La longueur par défaut de la page courrante */
|
||||
private int minHeight;
|
||||
|
||||
/**
|
||||
* TODO
|
||||
* Charge un nouveau document PDF
|
||||
*
|
||||
* @param file
|
||||
* @throws IOException
|
||||
* @param file Le fichier PDF à charger
|
||||
* @throws IOException Si le document passé en argument est illisible
|
||||
*/
|
||||
public DocumentPdf(File file) throws IOException {
|
||||
document = PDDocument.load(file);
|
||||
@@ -48,53 +48,29 @@ public class DocumentPdf {
|
||||
minHeight = -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*/
|
||||
/** @return La largueur par défaut de la page courrante */
|
||||
public int getMinWidth() {
|
||||
return minWidth;
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*/
|
||||
/** @return La longueur par défaut de la page courrante */
|
||||
public int getMinHeight() {
|
||||
return minHeight;
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
/** @return Le nombre de pages du document */
|
||||
public int getNbPages() {
|
||||
return document.getNumberOfPages();
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*/
|
||||
public BufferedImage renderPage(int pageIndex) throws IOException {
|
||||
return renderPage(pageIndex, 1.0f);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*/
|
||||
public BufferedImage setScale(float scale) {
|
||||
try {
|
||||
return renderPage(0, scale);
|
||||
} catch (IOException ignored) {}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO
|
||||
* Crée une image de la page voulue
|
||||
*
|
||||
* @param pageIndex
|
||||
* @param scale
|
||||
* @return
|
||||
* @throws IOException
|
||||
* @param pageIndex Numero de la page désirée (compris entre 0 et le nombre maximal de pages)
|
||||
* @param scale Taille de la page (La qualité de l'image est amélioré suivant cette valeur)
|
||||
* @return Une image de la page demandée
|
||||
* @throws IOException Si l'image de rendu n'as pas pu être créée
|
||||
* @throws IllegalArgumentException Si le numero de page est invalide (n'est pas compris entre 0 et le nombre maximal de pages)
|
||||
*/
|
||||
public BufferedImage renderPage(int pageIndex, float scale) throws IOException {
|
||||
if (pageIndex < 0 || pageIndex >= this.getNbPages()) {
|
||||
|
||||
@@ -25,21 +25,39 @@ import java.io.IOException;
|
||||
*/
|
||||
public class PdfPanel extends JPanel {
|
||||
|
||||
/* Données */
|
||||
private int currentPage;
|
||||
private float scaleSizing;
|
||||
private float scaleZoom;
|
||||
/** Le numéro de la page courrante */
|
||||
private int numeroPage;
|
||||
|
||||
/** Valeur multiplicative de la taille de la page */
|
||||
private float taille;
|
||||
|
||||
/** Valeur multiplicative du zoom */
|
||||
private float zoom;
|
||||
|
||||
/** Défini si la page est en pleine largeur ou non */
|
||||
private boolean pleineLargeur;
|
||||
|
||||
/** Bloqueur qui défini si le processeur est entrain de générer une nouvelle page */
|
||||
private boolean processing;
|
||||
|
||||
/* Chargeur de Pdf */
|
||||
/** Le document PDF chargé */
|
||||
private DocumentPdf pdfLoader;
|
||||
|
||||
/* Interface */
|
||||
|
||||
/** La zone de saisie du numéro de page */
|
||||
private final JTextField indexPageInput;
|
||||
|
||||
/** Le texte définissant le nombre max de page */
|
||||
private final JLabel maxPageLabel;
|
||||
|
||||
/** Element scrollable qui contiens la page */
|
||||
private final JScrollPane scrollPane;
|
||||
|
||||
/** Zone de l'élément scollable quio est visible */
|
||||
private final JViewport viewport;
|
||||
|
||||
/** Label qui contiens l'image de la page affichée */
|
||||
private final JLabel page;
|
||||
|
||||
/**
|
||||
@@ -48,9 +66,9 @@ public class PdfPanel extends JPanel {
|
||||
public PdfPanel() {
|
||||
super(new BorderLayout());
|
||||
|
||||
scaleSizing = 0.0f;
|
||||
scaleZoom = 1.0f;
|
||||
currentPage = 0;
|
||||
taille = 0.0f;
|
||||
zoom = 1.0f;
|
||||
numeroPage = 0;
|
||||
processing = false;
|
||||
pleineLargeur = false;
|
||||
|
||||
@@ -90,8 +108,6 @@ public class PdfPanel extends JPanel {
|
||||
@Override
|
||||
public void keyPressed(KeyEvent e) {
|
||||
super.keyPressed(e);
|
||||
String value = indexPageInput.getText();
|
||||
int l = value.length();
|
||||
indexPageInput.setEditable(e.getKeyChar() >= '0' && e.getKeyChar() <= '9');
|
||||
}
|
||||
});
|
||||
@@ -101,10 +117,10 @@ public class PdfPanel extends JPanel {
|
||||
String saisie = indexPageInput.getText();
|
||||
try {
|
||||
int index = Integer.parseInt(saisie);
|
||||
if (isPageValide(index - 1)) setPage(index - 1);
|
||||
if (isPageValide(index - 1)) changerPage(index - 1);
|
||||
else throw new Exception();
|
||||
} catch (Exception f) {
|
||||
indexPageInput.setText(Integer.toString(currentPage +1));
|
||||
indexPageInput.setText(Integer.toString(numeroPage +1));
|
||||
}
|
||||
|
||||
});
|
||||
@@ -113,31 +129,37 @@ public class PdfPanel extends JPanel {
|
||||
@Override
|
||||
public void componentResized(ComponentEvent e) {
|
||||
super.componentResized(e);
|
||||
resize();
|
||||
changerTaille();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Action lors du clic sur le boutton suivant
|
||||
* Affiche la page suivante du ou des documents (suivant si le mode synchronisé est activé)
|
||||
*
|
||||
* @param evt Écouteur d'évènement
|
||||
*/
|
||||
private void btnSuivantAction(ActionEvent evt) {
|
||||
if (GestionMode.isModeSepare()) nextPage();
|
||||
if (GestionMode.isModeSepare()) pageSuivante();
|
||||
else GestionFenetre.nextPages();
|
||||
}
|
||||
|
||||
/**
|
||||
* Action lors du clic sur le boutton precedent
|
||||
* Affiche la page précédente du ou des documents (suivant si le mode synchronisé est activé)
|
||||
*
|
||||
* @param evt Écouteur d'évènement
|
||||
*/
|
||||
private void btnPrecedentAction(ActionEvent evt) {
|
||||
if (GestionMode.isModeSepare()) previousPage();
|
||||
if (GestionMode.isModeSepare()) pagePrecedente();
|
||||
else GestionFenetre.previousPages();
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO
|
||||
* Change la taille de la page courrante suivant si fonction Pleine Largeur est activé ou non
|
||||
*/
|
||||
public void resize() {
|
||||
public void changerTaille() {
|
||||
if (pdfLoader == null || processing) return;
|
||||
|
||||
if (pleineLargeur) {
|
||||
@@ -145,23 +167,21 @@ public class PdfPanel extends JPanel {
|
||||
float scrollpaneWidth = scrollPane.getVerticalScrollBar().getWidth();
|
||||
float pdfMinWidth = pdfLoader.getMinWidth();
|
||||
|
||||
scaleSizing = (viewportWidth - scrollpaneWidth) / pdfMinWidth - scaleZoom;
|
||||
taille = (viewportWidth - scrollpaneWidth) / pdfMinWidth - zoom;
|
||||
} else {
|
||||
float viewportHeight = viewport.getHeight();
|
||||
float scrollpaneHeight = scrollPane.getVerticalScrollBar().getHeight();
|
||||
float pdfMinHeight = pdfLoader.getMinHeight();
|
||||
|
||||
scaleSizing = (viewportHeight - scrollpaneHeight) / pdfMinHeight - scaleZoom;
|
||||
taille = (viewportHeight - scrollpaneHeight) / pdfMinHeight - zoom;
|
||||
}
|
||||
updateScaleSizing(scaleSizing);
|
||||
setTaille(taille);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param pleineLargeur booléen qui défini l'état du mode pleine largeur
|
||||
*/
|
||||
/** @param pleineLargeur booléen qui défini l'état du mode pleine largeur */
|
||||
public void setPleineLargeur(boolean pleineLargeur) {
|
||||
this.pleineLargeur = pleineLargeur;
|
||||
resize();
|
||||
changerTaille();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -185,15 +205,13 @@ public class PdfPanel extends JPanel {
|
||||
public boolean chargerPdf(File pdfFile) {
|
||||
try {
|
||||
setPdfLoader(new DocumentPdf(pdfFile));
|
||||
setPage(0);
|
||||
changerPage(0);
|
||||
return true;
|
||||
} catch (IOException ignored) {}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param pdfLoader un nouveau document PDF à affecter à la fenêtre
|
||||
*/
|
||||
/** @param pdfLoader un nouveau document PDF à affecter à la fenêtre */
|
||||
public void setPdfLoader(DocumentPdf pdfLoader) {
|
||||
this.pdfLoader = pdfLoader;
|
||||
}
|
||||
@@ -210,27 +228,27 @@ public class PdfPanel extends JPanel {
|
||||
|
||||
/* Efface l'image de la page */
|
||||
page.setIcon(null);
|
||||
currentPage = 0;
|
||||
numeroPage = 0;
|
||||
|
||||
/* Interface Vide */
|
||||
indexPageInput.setText("");
|
||||
maxPageLabel.setText("/ -");
|
||||
|
||||
/* Efface les données relatives au zoom */
|
||||
scaleSizing = 0.0f;
|
||||
scaleZoom = 1.0f;
|
||||
taille = 0.0f;
|
||||
zoom = 1.0f;
|
||||
|
||||
validate();
|
||||
}
|
||||
|
||||
/**
|
||||
* Change la taille de la page courante
|
||||
* Change la valeur du zoom de la page courante
|
||||
*
|
||||
* @param scale Valeur flottante (1.00f == 100%)
|
||||
*/
|
||||
public void updateScaleZoom(float scale) {
|
||||
scaleZoom = scale;
|
||||
setPage(currentPage);
|
||||
public void setZoom(float scale) {
|
||||
zoom = scale;
|
||||
changerPage(numeroPage);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -238,23 +256,19 @@ public class PdfPanel extends JPanel {
|
||||
*
|
||||
* @param scale Valeur flottante (1.00f == 100%)
|
||||
*/
|
||||
private void updateScaleSizing(float scale) {
|
||||
scaleSizing = scale;
|
||||
setPage(currentPage);
|
||||
private void setTaille(float scale) {
|
||||
taille = scale;
|
||||
changerPage(numeroPage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Affiche la page suivante
|
||||
*/
|
||||
public void nextPage() {
|
||||
setPage(currentPage + 1);
|
||||
/** Affiche la page suivante */
|
||||
public void pageSuivante() {
|
||||
changerPage(numeroPage + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Affiche la page suivante
|
||||
*/
|
||||
public void previousPage() {
|
||||
setPage(currentPage - 1);
|
||||
/** Affiche la page suivante */
|
||||
public void pagePrecedente() {
|
||||
changerPage(numeroPage - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -262,14 +276,14 @@ public class PdfPanel extends JPanel {
|
||||
*
|
||||
* @param index Le numéro de la page où l'on veut se rendre
|
||||
*/
|
||||
private void setPage(int index) {
|
||||
private void changerPage(int index) {
|
||||
if (!isPageValide(index)) return;
|
||||
|
||||
processing = true;
|
||||
try {
|
||||
page.setIcon(new ImageIcon(pdfLoader.renderPage(index, scaleZoom + scaleSizing)));
|
||||
currentPage = index;
|
||||
indexPageInput.setText(Integer.toString(currentPage + 1));
|
||||
page.setIcon(new ImageIcon(pdfLoader.renderPage(index, zoom + taille)));
|
||||
numeroPage = index;
|
||||
indexPageInput.setText(Integer.toString(numeroPage + 1));
|
||||
maxPageLabel.setText(String.format("/%d", pdfLoader.getNbPages()));
|
||||
} catch (IOException ignored) {}
|
||||
processing = false;
|
||||
|
||||
@@ -18,7 +18,7 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Gestionnaire des raccourcis.save claviers de l'application
|
||||
* Gestionnaire des raccourcis claviers de l'application
|
||||
*
|
||||
* @author Léo Franch
|
||||
* @author Lucas Vabre
|
||||
@@ -27,8 +27,10 @@ import java.util.Map;
|
||||
*/
|
||||
public class RaccourcisClavier extends JFrame {
|
||||
|
||||
/** Le nom du fichier de sauvegarde */
|
||||
public static final String FICHIER_SAUVEGARDE = "raccourcis.save";
|
||||
|
||||
/** Booleen qui garantis l'attribution d'un seul raccourcis à la fois */
|
||||
public static boolean saisieBloquee;
|
||||
|
||||
/**
|
||||
@@ -37,13 +39,19 @@ public class RaccourcisClavier extends JFrame {
|
||||
*/
|
||||
public static ArrayList<JMenuItem> listeMenuItems = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Liste des éléments graphiques (un élément est une ligne) de la fenêtre
|
||||
*/
|
||||
public static ArrayList<RaccourcisElement> listeRaccourcisElement = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* HashMap qui prend en clé le Nom et en valeur une combinaison de touche : le raccourcis.save clavier
|
||||
* HashMap qui prend en clé le Nom du MenuItem et en valeur une combinaison de touche : le raccourcis clavier
|
||||
*/
|
||||
public static Map<String, KeyStroke> raccourcis = new HashMap<>() {};
|
||||
|
||||
/**
|
||||
* La liste des noms de MenuItems de l'application
|
||||
*/
|
||||
public static String[] LISTE_NOM = {
|
||||
"Ouvrir",
|
||||
"Fermer",
|
||||
@@ -62,7 +70,10 @@ public class RaccourcisClavier extends JFrame {
|
||||
"Modifier Touches"
|
||||
};
|
||||
|
||||
public static KeyStroke[] LISTE_RACCOURCIS = {
|
||||
/**
|
||||
* La liste des raccourcis par défaut
|
||||
*/
|
||||
public static KeyStroke[] RACCOURCIS_DEFAUT = {
|
||||
KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_DOWN_MASK), // Ouvrir
|
||||
KeyStroke.getKeyStroke(KeyEvent.VK_F, KeyEvent.CTRL_DOWN_MASK), // Fermer
|
||||
KeyStroke.getKeyStroke(KeyEvent.VK_Q, KeyEvent.CTRL_DOWN_MASK), // Quitter
|
||||
@@ -80,6 +91,9 @@ public class RaccourcisClavier extends JFrame {
|
||||
KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_DOWN_MASK), // Modifier Touches
|
||||
};
|
||||
|
||||
/**
|
||||
* Crée une nouvelle fenêtre contenant la liste des Raccourcis claviers de l'application ainsi qu'un boutton Raccourcis par défaut qui remet les raccourcis par défaut de l'application
|
||||
*/
|
||||
public RaccourcisClavier() {
|
||||
super("Modification des raccourcis claviers");
|
||||
saisieBloquee = false;
|
||||
@@ -92,12 +106,14 @@ public class RaccourcisClavier extends JFrame {
|
||||
/* Creation de la fenêtre */
|
||||
JPanel panel = new JPanel(new GridLayout(raccourcis.size() +1, 1, 10, 5));
|
||||
|
||||
/* Ajout de tout les raccourcis claviers de l'application dans la fenêtre */
|
||||
for (String nom : LISTE_NOM) {
|
||||
RaccourcisElement raccourcisElement = new RaccourcisElement(nom, raccourcis.get(nom));
|
||||
listeRaccourcisElement.add(raccourcisElement);
|
||||
panel.add(raccourcisElement);
|
||||
}
|
||||
|
||||
/* Ajout du boutton Reset */
|
||||
JButton btnReset = new JButton("Raccourcis par défaut");
|
||||
btnReset.addActionListener(this::actionBtnReset);
|
||||
panel.add(btnReset);
|
||||
@@ -109,6 +125,13 @@ public class RaccourcisClavier extends JFrame {
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Action lors du clic sur le boutton Reset
|
||||
* Charge les raccourcis par défaut puis les sauvegarde
|
||||
* Met a jour l'interface
|
||||
*
|
||||
* @param evt écouteur d'évènement
|
||||
*/
|
||||
private void actionBtnReset(ActionEvent evt) {
|
||||
initialisationFichierRaccourcis();
|
||||
chargerRaccourcis();
|
||||
@@ -169,8 +192,8 @@ public class RaccourcisClavier extends JFrame {
|
||||
* et la sauvegarde
|
||||
*/
|
||||
private static void initialisationFichierRaccourcis() {
|
||||
for (int i = 0; i < LISTE_NOM.length && i < LISTE_RACCOURCIS.length; i++) {
|
||||
raccourcis.put(LISTE_NOM[i], LISTE_RACCOURCIS[i]);
|
||||
for (int i = 0; i < LISTE_NOM.length && i < RACCOURCIS_DEFAUT.length; i++) {
|
||||
raccourcis.put(LISTE_NOM[i], RACCOURCIS_DEFAUT[i]);
|
||||
}
|
||||
sauvegarderRaccourcis();
|
||||
}
|
||||
|
||||
@@ -1,17 +1,46 @@
|
||||
/*
|
||||
* RaccourcisElement.java 10/03/2022
|
||||
* IUT Rodez 2021-2022, INFO 2
|
||||
* Pas de copyright, aucun droits
|
||||
*/
|
||||
|
||||
package lecteur_pdf.raccourcisClavier;
|
||||
|
||||
import lecteur_pdf.Popup;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.KeyListener;
|
||||
|
||||
/**
|
||||
* Element de raccourcis qui définit un raccourcis pour une propriété de l'application
|
||||
*
|
||||
* @author Léo Franch
|
||||
* @author Lucas Vabre
|
||||
* @author Noé Villeneuve
|
||||
* @author Tristan Nogaret
|
||||
*/
|
||||
public class RaccourcisElement extends JPanel {
|
||||
|
||||
/** Le nom du MenuItem */
|
||||
private final String nom;
|
||||
|
||||
/** Le boutton qui contiens en valeur la séquence de touches correspondant au raccourcis du MenuItem de l'application */
|
||||
private final JButton btnRaccourcis;
|
||||
|
||||
/** Le raccourcis clavier */
|
||||
private KeyStroke raccourcis;
|
||||
|
||||
/**
|
||||
* Crée un nouveau JPanel conportant une ligne et deux colonnes
|
||||
* Dans la première colonne on trouve un Label qui défini le MenuItem
|
||||
* Dans la seconde colonne on trouve le boutton pour éditer le raccourcis clavier
|
||||
*
|
||||
* @param nom Le nom du MenuItem ciblé
|
||||
* @param raccourcis Le raccourcis clavier actuel du MenuItem ciblé
|
||||
*/
|
||||
public RaccourcisElement(String nom, KeyStroke raccourcis) {
|
||||
super(new GridLayout(1, 2));
|
||||
|
||||
@@ -28,6 +57,11 @@ public class RaccourcisElement extends JPanel {
|
||||
btnRaccourcis.addActionListener(this::action);
|
||||
}
|
||||
|
||||
/**
|
||||
* Action lors du clic sur le boutton d'édition du raccourcis
|
||||
*
|
||||
* @param evt écouteur d'évènement
|
||||
*/
|
||||
public void action(ActionEvent evt) {
|
||||
if (!RaccourcisClavier.saisieBloquee) {
|
||||
RaccourcisClavier.saisieBloquee = true;
|
||||
@@ -35,7 +69,10 @@ public class RaccourcisElement extends JPanel {
|
||||
|
||||
btnRaccourcis.addKeyListener(new KeyListener() {
|
||||
|
||||
/** Valeur qui permet de définir si une touche n'est pas reconnue */
|
||||
private static final int INDETERMINATE = -1;
|
||||
|
||||
/** La valeur de la touche pressé precedament */
|
||||
private int previousKeyPressed = INDETERMINATE;
|
||||
|
||||
@Override
|
||||
@@ -46,7 +83,7 @@ public class RaccourcisElement extends JPanel {
|
||||
&& !isMaskValide(evt.getKeyCode())) {
|
||||
|
||||
KeyStroke ks = KeyStroke.getKeyStroke(evt.getKeyCode(), getMask(previousKeyPressed));
|
||||
System.out.println(ks);
|
||||
|
||||
/* Vérifie que ce raccourci clavier n'existe pas */
|
||||
if (!RaccourcisClavier.raccourcis.containsValue(ks)) {
|
||||
btnRaccourcis.setText(getMaskString(previousKeyPressed) + " + " + ks.toString().split(" ")[2]);
|
||||
@@ -56,7 +93,10 @@ public class RaccourcisElement extends JPanel {
|
||||
RaccourcisClavier.affecterRaccourcis();
|
||||
RaccourcisClavier.sauvegarderRaccourcis();
|
||||
} else {
|
||||
// TODO Erreur cette combinaison de touche est deja utilisé
|
||||
final String TITRE_ERREUR = "Erreur raccourcis";
|
||||
final String MESSAGE_ERREUR = "Le raccourcis que vous venez de réaliser est déja affecté à une autre fonctionnalité";
|
||||
|
||||
Popup.errorPopup(btnRaccourcis, TITRE_ERREUR, MESSAGE_ERREUR);
|
||||
btnRaccourcis.setText(modifierToString(raccourcis.getModifiers()) + " + " + (char)raccourcis.getKeyCode());
|
||||
}
|
||||
|
||||
@@ -77,6 +117,11 @@ public class RaccourcisElement extends JPanel {
|
||||
return 16 <= maskValue && maskValue <= 18;
|
||||
}
|
||||
|
||||
/**
|
||||
* Methode outils qui permet de convertir la valeur tapée en KeyEvent
|
||||
* @param maskValue Valeur de masque tapé (controle, shift ou alt)
|
||||
* @return Le KeyEvent correspondant
|
||||
*/
|
||||
private int getMask(int maskValue) {
|
||||
return switch (maskValue) {
|
||||
case 16 -> KeyEvent.SHIFT_DOWN_MASK;
|
||||
@@ -85,6 +130,11 @@ public class RaccourcisElement extends JPanel {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode outils qui permet de convertir la valeur tapée en Chaine de caractère
|
||||
* @param maskValue Valeur de masque tapé (controle, shift ou alt)
|
||||
* @return La chaine de caractère correspondante
|
||||
*/
|
||||
private String getMaskString(int maskValue) {
|
||||
return switch (maskValue) {
|
||||
case 16 -> "SHIFT";
|
||||
@@ -96,6 +146,11 @@ public class RaccourcisElement extends JPanel {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convertis un Modifieur en chaine de caractère
|
||||
* @param modifier valeur du modifieur (Element d'un KeyStroke != KeyEvent)
|
||||
* @return La chaine de caractère correspondante
|
||||
*/
|
||||
private String modifierToString(int modifier) {
|
||||
return switch (modifier) {
|
||||
case 65 -> "SHIFT";
|
||||
@@ -104,10 +159,19 @@ public class RaccourcisElement extends JPanel {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Convertis un raccourcis en chaine de caractère
|
||||
* @param keyStroke Le raccourcis en question
|
||||
* @return La chaine de caractère construite à partir du raccourcis
|
||||
*/
|
||||
private String keystrokeToString(KeyStroke keyStroke) {
|
||||
return modifierToString(keyStroke.getModifiers()) + " + " + keyStroke.toString().split(" ")[2];
|
||||
}
|
||||
|
||||
/**
|
||||
* Change le raccourcis (visuellement)
|
||||
* @param raccourcis Nouveau raccourcis
|
||||
*/
|
||||
public void setRaccourcis(KeyStroke raccourcis) {
|
||||
this.raccourcis = raccourcis;
|
||||
this.btnRaccourcis.setText(keystrokeToString(raccourcis));
|
||||
|
||||
Reference in New Issue
Block a user