diff --git a/raccourcis.save b/raccourcis.save new file mode 100644 index 0000000..4f703a4 Binary files /dev/null and b/raccourcis.save differ diff --git a/src/lecteur_pdf/GestionPdf.java b/src/lecteur_pdf/GestionPdf.java index 043b639..64b4aa3 100644 --- a/src/lecteur_pdf/GestionPdf.java +++ b/src/lecteur_pdf/GestionPdf.java @@ -84,8 +84,5 @@ public class GestionPdf { GestionMode.setModeSepare(); newIhmPdf(); - -// System.out.println(RaccourcisClavier.raccourcis); -// System.out.println(RaccourcisClavier.gestionnaireRaccourcis); } } diff --git a/src/lecteur_pdf/IhmPdf.java b/src/lecteur_pdf/IhmPdf.java index 8077de4..dae96d5 100644 --- a/src/lecteur_pdf/IhmPdf.java +++ b/src/lecteur_pdf/IhmPdf.java @@ -8,6 +8,7 @@ package lecteur_pdf; import lecteur_pdf.menuBar.MenuBar; import lecteur_pdf.pdf.PdfPanel; +import lecteur_pdf.raccourcisClavier.RaccourcisClavier; import javax.swing.*; import java.awt.*; @@ -57,6 +58,11 @@ public class IhmPdf extends JFrame { }); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + /* Affecte les raccourcis claviers de la fenêtre */ + RaccourcisClavier.chargerRaccourcis(); + RaccourcisClavier.affecterRaccourcis(); + RaccourcisClavier.sauvegarderRaccourcis(); + /* Render de la Frame */ pack(); setVisible(true); diff --git a/src/lecteur_pdf/menuBar/menuItems/FermerFichier.java b/src/lecteur_pdf/menuBar/menuItems/FermerFichier.java index ca13a54..9573350 100644 --- a/src/lecteur_pdf/menuBar/menuItems/FermerFichier.java +++ b/src/lecteur_pdf/menuBar/menuItems/FermerFichier.java @@ -32,7 +32,7 @@ public class FermerFichier extends MenuItem { public FermerFichier(IhmPdf parent) { super(parent, "Fermer"); - /* TODO Définition du raccourcis clavier a modifier */ + /* TODO Définition du raccourcis.save clavier a modifier */ // setRaccourcis(KeyEvent.VK_X, KeyEvent.CTRL_DOWN_MASK); } diff --git a/src/lecteur_pdf/menuBar/menuItems/MenuItem.java b/src/lecteur_pdf/menuBar/menuItems/MenuItem.java index 9ed81e7..63f3ab4 100644 --- a/src/lecteur_pdf/menuBar/menuItems/MenuItem.java +++ b/src/lecteur_pdf/menuBar/menuItems/MenuItem.java @@ -37,24 +37,24 @@ public abstract class MenuItem extends JMenuItem { super(name); this.parent = parent; addActionListener(this::action); - RaccourcisClavier.listeItem.put(name, this); + RaccourcisClavier.listeMenuItems.add(this); } protected abstract void action(ActionEvent evt); // public void setRaccourcis(int key) { -// KeyStroke raccourcis = KeyStroke.getKeyStroke((char) key); -// setAccelerator(raccourcis); +// KeyStroke raccourcis.save = KeyStroke.getKeyStroke((char) key); +// setAccelerator(raccourcis.save); // -// RaccourcisClavier.raccourcis.put(this.getText(), raccourcis); +// RaccourcisClavier.raccourcis.save.put(this.getText(), raccourcis.save); // RaccourcisClavier.gestionnaireRaccourcis.put(this, this.getText()); // } // public void setRaccourcis(int key, int mask) { -// KeyStroke raccourcis = KeyStroke.getKeyStroke(key, mask); -// setAccelerator(raccourcis); +// KeyStroke raccourcis.save = KeyStroke.getKeyStroke(key, mask); +// setAccelerator(raccourcis.save); // -// RaccourcisClavier.raccourcis.put(this.getText(), raccourcis); +// RaccourcisClavier.raccourcis.save.put(this.getText(), raccourcis.save); // RaccourcisClavier.gestionnaireRaccourcis.put(this, this.getText()); // } diff --git a/src/lecteur_pdf/raccourcisClavier/RaccourcisClavier.java b/src/lecteur_pdf/raccourcisClavier/RaccourcisClavier.java index d41abc4..0b612e6 100644 --- a/src/lecteur_pdf/raccourcisClavier/RaccourcisClavier.java +++ b/src/lecteur_pdf/raccourcisClavier/RaccourcisClavier.java @@ -6,16 +6,16 @@ package lecteur_pdf.raccourcisClavier; -import lecteur_pdf.menuBar.menuItems.MenuItem; - import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; +import java.io.*; +import java.util.ArrayList; import java.util.HashMap; import java.util.Map; /** - * Gestionnaire des raccourcis claviers de l'application + * Gestionnaire des raccourcis.save claviers de l'application * * @author Léo Franch * @author Lucas Vabre @@ -24,66 +24,142 @@ import java.util.Map; */ public class RaccourcisClavier extends JFrame { - public static Map listeItem = new HashMap<>(); + public static boolean saisieBloquee; - public final String[][] RACCOURCIS = { - {"Ouvrir", "o",}, - {"Fermer", "f",}, - {"Quitter", "x",}, - {"Mode Plein Ecran", "p",}, - {"Page Prédédente", "m",}, - {"Page Suivante", "l",}, - {"Zoom 50%", "&",}, - {"Zoom 100%", "é",}, - {"Zoom 150%", "\"",}, - {"Page Entière", "a",}, - {"Pleine Largeur", "z",}, - {"Nouvelle Fenêtre", "n",}, -// { "Mode Séparé",}, -// { "Mode Synchronisé",}, - {"Modifier Touches", "!",} + public static final String FICHIER_SAUVEGARDE = "raccourcis.save"; + + /** + * Liste des menus items, se remplis a la création de chaque MenuItem de l'application + */ + public static ArrayList listeMenuItems = new ArrayList<>(); + + /** + * HashMap qui prend en clé le Nom et en valeur une combinaison de touche : le raccourcis.save clavier + */ + public static Map raccourcis = new HashMap<>() {}; + + public static String[] LISTE_NOM = { + "Ouvrir", + "Fermer", + "Quitter", + "Mode Plein Ecran", + "Page Prédédente", + "Page Suivante", + "Zoom 50%", + "Zoom 100%", + "Zoom 150%", + "Page Entière", + "Pleine Largeur", + "Nouvelle Fenêtre", +// "Mode Séparé", +// "Mode Synchronisé", + "Modifier Touches" + }; + + public static KeyStroke[] LISTE_RACCOURCIS = { + 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 + KeyStroke.getKeyStroke(KeyEvent.VK_F11, KeyEvent.CTRL_DOWN_MASK), // Mode Plein Ecran + KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.CTRL_DOWN_MASK), // Page Prédédente + KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.CTRL_DOWN_MASK), // Page Suivante + KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, KeyEvent.CTRL_DOWN_MASK), // Zoom 50% + KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD0, KeyEvent.CTRL_DOWN_MASK), // Zoom 100% + KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, KeyEvent.CTRL_DOWN_MASK), // Zoom 150% + KeyStroke.getKeyStroke(KeyEvent.VK_W, KeyEvent.CTRL_DOWN_MASK), // Page Entière + KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_DOWN_MASK), // Pleine Largeur + KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_DOWN_MASK), // Nouvelle Fenêtre +// KeyStroke.getKeyStroke(KeyEvent.VK_O,KeyEvent.CTRL_DOWN_MASK), // Mode Séparé +// KeyStroke.getKeyStroke(KeyEvent.VK_O,KeyEvent.CTRL_DOWN_MASK), // Mode Synchronisé + KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_DOWN_MASK), // Modifier Touches }; public RaccourcisClavier() { super("Modification des raccourcis claviers"); - JPanel panel = new JPanel(new GridLayout(RACCOURCIS.length, 1, 10, 5)); + saisieBloquee = false; - System.out.println(listeItem); + /* Charge le fichier et affecte les raccourcis aux MenuItems */ + chargerRaccourcis(); + affecterRaccourcis(); - for (int i = 0; i < listeItem.size(); i++) { - RaccourcisElement raccourcisElement = new RaccourcisElement(RACCOURCIS[i][0], listeItem.get(RACCOURCIS[i][0])); - - // Si l'actions n'as pas de raccourcis, mettre celui par défaut -// try { -// listeItem.get(RACCOURCIS[i][0]).getAccelerator(); -// } catch (NullPointerException e) { -// listeItem.get(RACCOURCIS[i][0]).setAccelerator(KeyStroke.getKeyStroke(RACCOURCIS[i][1].charAt(0), KeyEvent.CTRL_DOWN_MASK)); -// } + /* Creattion de la fenêtre */ + JPanel panel = new JPanel(new GridLayout(raccourcis.size(), 1, 10, 5)); + for (String nom : LISTE_NOM) { + RaccourcisElement raccourcisElement = new RaccourcisElement(nom, raccourcis.get(nom)); panel.add(raccourcisElement); } + add(panel); - add(new JScrollPane(panel)); + sauvegarderRaccourcis(); -// JPanel panel = new JPanel(); -// for (String nomOptions : raccourcis.keySet()) { -// panel.add(new ligneRaccourci(nomOptions, -// (char) raccourcis.get(nomOptions) -// .getKeyCode())); -// } -// add(panel); pack(); setMinimumSize(new Dimension(400, 200)); -// setSize(200, 400); -// setResizable(false); setVisible(true); } - private void chargerRaccourcisDefaut() { + /** + * Lis le fichier de sauvegarde et restaure la HashMap des raccourcis + */ + public static void chargerRaccourcis() { + try { + FileInputStream fis = new FileInputStream(FICHIER_SAUVEGARDE); + ObjectInputStream ois = new ObjectInputStream(fis); + + raccourcis = (HashMap) ois.readObject(); + + ois.close(); + fis.close(); + System.out.println("Chargement des données avec succès"); + } catch (IOException ioe) { + ioe.printStackTrace(); + } catch (ClassNotFoundException c) { + System.out.println("Class not found"); + c.printStackTrace(); + } + + /* Test : Affichage du contenu de la HashMap dans l'ordre des noms */ +// for (String a : LISTE_NOM) { +// System.out.println(a + " : " + raccourcis.get(a)); +// } } - private void chargerRaccourcis() { + /** + * Ecrit dans le fichier de sauvegarde la HashMap des raccourcis + */ + public static void sauvegarderRaccourcis() { + try { + FileOutputStream fos = new FileOutputStream(FICHIER_SAUVEGARDE); + ObjectOutputStream oos = new ObjectOutputStream(fos); + oos.writeObject(raccourcis); + + oos.close(); + fos.close(); + System.out.println("Sauvegardé avec succes"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * Remplis la HashMap avec les raccourcis claviers par défaut + * et la sauvegarde + */ + private void initialisationFichierRaccourcis() { + for (int i = 0; i < LISTE_NOM.length && i < LISTE_RACCOURCIS.length ; i++) { + raccourcis.put(LISTE_NOM[i], LISTE_RACCOURCIS[i]); + } + sauvegarderRaccourcis(); + } + + /** + * Affecte a chaque MenuItems le raccourcis qui lui est destiné + */ + public static void affecterRaccourcis() { + for (JMenuItem menuItem : listeMenuItems) { + menuItem.setAccelerator(raccourcis.get(menuItem.getText())); + } } } diff --git a/src/lecteur_pdf/raccourcisClavier/RaccourcisElement.java b/src/lecteur_pdf/raccourcisClavier/RaccourcisElement.java index 09b6746..4c982f8 100644 --- a/src/lecteur_pdf/raccourcisClavier/RaccourcisElement.java +++ b/src/lecteur_pdf/raccourcisClavier/RaccourcisElement.java @@ -4,55 +4,103 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; public class RaccourcisElement extends JPanel { - JLabel nomElement; - JButton btnRaccourcis; - KeyEvent raccourcis; - JMenuItem menuItem; + private final String nom; + private final JButton btnRaccourcis; + private KeyStroke raccourcis; - public RaccourcisElement(String nom, JMenuItem menuItem) { + public RaccourcisElement(String nom, KeyStroke raccourcis) { super(new GridLayout(1, 2)); - nomElement = new JLabel(nom); - this.menuItem = menuItem; - btnRaccourcis = new JButton(); + this.nom = nom; + this.raccourcis = raccourcis; + /* Interface */ + JLabel nomElement = new JLabel(nom); + btnRaccourcis = new JButton(modifierToString(raccourcis.getModifiers()) + " + " + (char)raccourcis.getKeyCode()); add(nomElement); add(btnRaccourcis); btnRaccourcis.addActionListener(this::action); - -// this.setVisible(false); } public void action(ActionEvent evt) { - // TODO ecoute la frappe de clavier et change le raccourcis -// KeyListener kl = new KeyListener() { -// @Override -// public void keyTyped(KeyEvent e) {} -// -// @Override -// public void keyPressed(KeyEvent e) { -// setCaractereRaccourcis(e.getKeyChar()); -// } -// -// @Override -// public void keyReleased(KeyEvent e) {} -// }; -// addKeyListener(kl); -// removeKeyListener(kl); -// btnRaccourcis.setText(String.valueOf(caractereRaccourcis)); -// } -// -// public void setMenuItem(JMenuItem menuItem) { -// this.menuItem = menuItem; -// this.setVisible(true); -// } -// -// public void setCaractereRaccourcis(char caractereRaccourcis) { -// this.caractereRaccourcis = caractereRaccourcis; -// menuItem.setAccelerator(KeyStroke.getKeyStroke(caractereRaccourcis, KeyEvent.CTRL_DOWN_MASK)); + if (!RaccourcisClavier.saisieBloquee) { + RaccourcisClavier.saisieBloquee = true; + btnRaccourcis.setText(" --- "); + + btnRaccourcis.addKeyListener(new KeyListener() { + + private static final int INDETERMINATE = -1; + private int previousKeyPressed = INDETERMINATE; + + @Override + public void keyPressed(KeyEvent evt) { + if (previousKeyPressed == INDETERMINATE) previousKeyPressed = evt.getKeyCode(); + else if (previousKeyPressed != evt.getKeyCode() + && isMaskValide(previousKeyPressed) + && !isMaskValide(evt.getKeyCode())) { + + KeyStroke ks = KeyStroke.getKeyStroke(evt.getKeyCode(), getMask(previousKeyPressed)); + System.out.println(ks); + /* Vérifie que ce raccourcis clavier n'existe pas */ + if (!RaccourcisClavier.raccourcis.containsValue(ks)) { + btnRaccourcis.setText(getMaskString(previousKeyPressed) + " + " + (char)evt.getKeyCode()); + // On modifie la valeur + RaccourcisClavier.raccourcis.replace(nom, ks); + raccourcis = ks; + RaccourcisClavier.affecterRaccourcis(); + RaccourcisClavier.sauvegarderRaccourcis(); + } else { + // TODO Erreur cette combinaison de touche est deja utilisé + btnRaccourcis.setText(modifierToString(raccourcis.getModifiers()) + " + " + (char)raccourcis.getKeyCode()); + } + + btnRaccourcis.removeKeyListener(this); + RaccourcisClavier.saisieBloquee = false; + } + } + + @Override + public void keyTyped(KeyEvent evt) {} + + @Override + public void keyReleased(KeyEvent evt) { + if (previousKeyPressed == evt.getKeyCode()) previousKeyPressed = INDETERMINATE; + } + + private boolean isMaskValide(int maskValue) { + return 16 <= maskValue && maskValue <= 18; + } + + private int getMask(int maskValue) { + return switch (maskValue) { + case 16 -> KeyEvent.SHIFT_DOWN_MASK; + case 17 -> KeyEvent.CTRL_DOWN_MASK; + default -> KeyEvent.ALT_DOWN_MASK; + }; + } + + private String getMaskString(int maskValue) { + return switch (maskValue) { + case 16 -> "SHIFT"; + case 17 -> "CTRL"; + default -> "ALT"; + }; + } + }); + } } + + private String modifierToString(int modifier) { + return switch (modifier) { + case 65 -> "SHIFT"; + case 130 -> "CTRL"; + default -> "ALT"; + }; + } + } diff --git a/src/lecteur_pdf/raccourcisClavier/ligneRaccourci.form b/src/lecteur_pdf/raccourcisClavier/ligneRaccourci.form deleted file mode 100644 index 2fd1c0a..0000000 --- a/src/lecteur_pdf/raccourcisClavier/ligneRaccourci.form +++ /dev/null @@ -1,29 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/src/lecteur_pdf/raccourcisClavier/ligneRaccourci.java b/src/lecteur_pdf/raccourcisClavier/ligneRaccourci.java deleted file mode 100644 index 5e71efc..0000000 --- a/src/lecteur_pdf/raccourcisClavier/ligneRaccourci.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * ligneRaccourci.java, 25/02/2022 - * IUT Rodez 2022-2022, INFO2 - * pas de copyright, aucun droits - */ - -package lecteur_pdf.raccourcisClavier; - -import javax.swing.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.Locale; -import java.util.Scanner; - -///** -// * TODO class comment -// */ -//public class ligneRaccourci extends JPanel implements ActionListener { -// private JLabel raccourciLabel; -// private JPanel optionsRaccourcis; -// private JButton inputButton; -// -// Scanner entree = new Scanner(System.in); -// -// public ligneRaccourci(String labelName, char raccourcis) { -// raccourciLabel.setText(labelName); -// inputButton.setText(String.valueOf(raccourcis)); -// add(optionsRaccourcis); -// inputButton.addActionListener(this); -// } -// -// public JLabel getRaccourciLabel() { -// return raccourciLabel; -// } -// -// public JButton getInputButton() { -// return inputButton; -// } -// -// @Override -// public void actionPerformed(ActionEvent e) { -// inputButton.setText( -// String.valueOf(entree.next().charAt(0)).toUpperCase(Locale.ROOT)); -// } -//} \ No newline at end of file