diff --git a/src/lecteur_pdf/GestionPdf.java b/src/lecteur_pdf/GestionPdf.java new file mode 100644 index 0000000..67ada50 --- /dev/null +++ b/src/lecteur_pdf/GestionPdf.java @@ -0,0 +1,28 @@ +package lecteur_pdf_swing; + +import javax.swing.*; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class GestionPdf { + private static final int maxPdf = 2; + private static final List ihmPdfList = new ArrayList(); + + public static void newIhmPdf() { + if (ihmPdfList.size() >= maxPdf) { + throw new IllegalStateException(); + } + + try { + IhmPdf ihm = new IhmPdf(SelectionnerFichier.ouvrirFichier()); + ihmPdfList.add(ihm); + } catch (IOException ignored) {} + + } + + public static void main(String[] args) { + newIhmPdf(); + } +} diff --git a/src/lecteur_pdf/IhmPdf.java b/src/lecteur_pdf/IhmPdf.java new file mode 100644 index 0000000..564bc50 --- /dev/null +++ b/src/lecteur_pdf/IhmPdf.java @@ -0,0 +1,95 @@ +/* + * Ihm, 03/02/2022 + * IUT Rodez 2022, INFO2 + * pas de copyright, aucun droits + */ + +package lecteur_pdf_swing; + +import lecteur_pdf_swing.menuBar.MenuBar; +import lecteur_pdf_swing.menuBar.menuItems.FermerFichier; +import lecteur_pdf_swing.pdf.PdfPanel; + +import javax.swing.*; +import java.awt.*; +import java.io.File; +import java.io.IOException; + +/** + * TODO A compléter + * + * @author lucas + */ +public class IhmPdf extends JFrame { + + PdfPanel pdfPanel; + MenuBar menuBar; + + public IhmPdf(File pdfFile) throws IOException { + super(pdfFile.getName()); + + /* Déclaration des attributs */ + menuBar = new MenuBar(this); + pdfPanel = new PdfPanel(pdfFile); + + /* Hierarchie */ + setContentPane(pdfPanel); + setJMenuBar(menuBar); + + /* Render de la Frame */ + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + pack(); + setVisible(true); + } + + public void fermerFichier() { + try { + pdfPanel = new PdfPanel(null); + validate(); + } catch (IOException ignored) { + } + } + + public void ouvrirFichier() throws IOException { + File fichier = SelectionnerFichier.ouvrirFichier(); + pdfPanel = new PdfPanel(fichier); + validate(); + } + + private boolean fullscreen = false; + private GraphicsDevice device; + + public void pleinEcran() { + // Switch de disposition + fullscreen = !fullscreen; + if (fullscreen) { // Set fullscreen + GraphicsEnvironment graphics = + GraphicsEnvironment.getLocalGraphicsEnvironment(); + device = graphics.getDefaultScreenDevice(); + device.setFullScreenWindow(this); + } else { // remove fullscreen + device.setFullScreenWindow(null); + setUndecorated(false); + setVisible(true); + } + } + + public void quitter() { + dispose(); + } + + public void zoomDefaut() { + pdfPanel.updateScale(1.0f); + validate(); + } + + public void zoomMoins() { + pdfPanel.updateScale(0.5f); + validate(); + } + + public void zoomPlus() { + pdfPanel.updateScale(1.5f); + validate(); + } +} diff --git a/src/lecteur_pdf/LecteurPDFDoubleAffichage.java b/src/lecteur_pdf/LecteurPDFDoubleAffichage.java deleted file mode 100644 index 19ada49..0000000 --- a/src/lecteur_pdf/LecteurPDFDoubleAffichage.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * LecteurPDFDoubleAffichage.java, 08/12/2021 - * IUT Rodez 2021-2021, INFO2 - * pas de copyright, aucun droits - */ - -package lecteur_pdf; - -import lecteur_pdf.affichage.Fenetre; - -/** - * Classe qui lance le lecteur PDF - */ -public class LecteurPDFDoubleAffichage { - /** - * Crée une nouvelle instance du lecteur PDF - * - * @param args non utilisé - */ - public static void main(String[] args) {new Fenetre();} -} diff --git a/src/lecteur_pdf/menu/SelectionnerFichier.java b/src/lecteur_pdf/SelectionnerFichier.java similarity index 98% rename from src/lecteur_pdf/menu/SelectionnerFichier.java rename to src/lecteur_pdf/SelectionnerFichier.java index b285dc6..1355e2e 100644 --- a/src/lecteur_pdf/menu/SelectionnerFichier.java +++ b/src/lecteur_pdf/SelectionnerFichier.java @@ -3,7 +3,8 @@ * IUT Rodez 2021-2021, INFO2 * pas de copyright, aucun droits */ -package lecteur_pdf.menu; + +package lecteur_pdf_swing; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; diff --git a/src/lecteur_pdf/affichage/Fenetre.java b/src/lecteur_pdf/affichage/Fenetre.java deleted file mode 100644 index ab7a57e..0000000 --- a/src/lecteur_pdf/affichage/Fenetre.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Fenetre, 22/11/2021 - * IUT Rodez 2021, INFO2 - * pas de copyright, aucun droits - */ - -package lecteur_pdf.affichage; - -import lecteur_pdf.document.PDF; -import lecteur_pdf.menu.Menu; - -import javax.swing.*; -import java.awt.*; -import java.io.File; -import java.io.IOException; - -/** - * classe correspondant à l’objet Fenêtre - * - * @author Léo FRANCH - * @author Tristan NOGARET - * @author Lucàs VABRE - * @author Noé VILLENEUVE - * @version 1.0 - */ -public class Fenetre extends JFrame { - - /** Titre de la fenêtre */ - private final String TITRE = "Lecteur PDF"; - - /** Le menu de la fenêtre */ - private Menu menu; - - /** Le fichier courant */ - private File fichier; - - /** Le document PDF courant */ - public PDF documentPDF; - - /** Définit la disposition d'affichage des pages du document PDF */ - private boolean affichageVertical; - - /** Définit l'état de la fenêtre, true si la fenêtre est en plein écran */ - private boolean fullscreen; - - /** - * Crée une nouvelle fenêtre contenant un Menu - */ - public Fenetre() { - - /* Change le style de la fenêtre */ - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { - e.printStackTrace(); - } - - /* Création du menu */ - menu = new Menu(this); - this.setJMenuBar(menu); - - /* permet de définir le mode plein écran comme désactivé lors du - lancement de la fenêtre */ - fullscreen = false; - - /* Définis l'affichage Vertical comme affichage par défaut */ - this.affichageVertical = true; - - /* Initialise l'état par défaut de la fenêtre */ - setup(); - } - - /** - * Fonction utilitaire qui permet de définir l'état par défaut de la fenêtre - */ - public void setup() { - setTitle(TITRE); - - setSize(300, 300); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setLocationRelativeTo(null); - setVisible(true); - - dechargerPDF(); - revalidate(); - repaint(); - } - - /** - * Charge le document PDF courant si possible - * - * @throws IOException Si l'on arrive pas a charger le PDF - */ - public void chargerPDF() throws IOException { - if (haveDocument()) chargerPDF(fichier, 1.0f); - this.setExtendedState(JFrame.MAXIMIZED_BOTH); - } - - /** - * Charge le document PDF courant avec un zoom spécifique si possible - * - * @param zoom La taille du zoom sur les pages - * @throws IOException Si l'on arrive pas a charger le PDF - */ - public void chargerPDF(float zoom) throws IOException { - if (haveDocument()) chargerPDF(fichier, zoom); - this.setExtendedState(JFrame.MAXIMIZED_BOTH); - } - - /** - * Charge un document PDF - * - * @param fichier Le fichier PDF à afficher dans la fenêtre - * @throws IOException Si l'on arrive pas a charger le PDF - */ - public void chargerPDF(File fichier) throws IOException { - chargerPDF(fichier, 1.0f); - this.setExtendedState(JFrame.MAXIMIZED_BOTH); - } - - /** - * Charge un document PDF - * - * @param fichier Le fichier PDF à afficher dans la fenêtre - * @param zoom La taille du zoom sur les pages - * @throws IOException Si l'on arrive pas a charger le PDF - */ - public void chargerPDF(File fichier, float zoom) throws IOException { - dechargerPDF(); - - this.fichier = fichier; - - /* Crée le panel qui contient le document PDF */ - JPanel pdfPanel = new JPanel(); - /* Crée l’élément scrollable */ - JScrollPane scrollPane = new JScrollPane(pdfPanel); - scrollPane.getVerticalScrollBar().setUnitIncrement(16); - scrollPane.getHorizontalScrollBar().setUnitIncrement(16); - this.add(scrollPane, BorderLayout.CENTER); - - documentPDF = new PDF(fichier, affichageVertical); - documentPDF.setZoom(zoom); - pdfPanel.add(documentPDF); - - /* Met à jour la page */ - this.setTitle(TITRE + " | " + fichier.getName()); - this.validate(); - this.pack(); - this.setLocationRelativeTo(null); - this.setExtendedState(JFrame.MAXIMIZED_BOTH); - - } - - /** - * Supprime le PDF de la fenêtre - */ - public void dechargerPDF() { - if (this.getContentPane() != null) { - this.getContentPane().removeAll(); - documentPDF = null; - } - } - - /** - * Prédicat qui vérifie si un PDF est affiché dans la fenêtre - * - * @return true si le prédicat est vérifié, false sinon - */ - public boolean haveDocument() { - return documentPDF != null; - } - - /** - * Définis le mode d'affichage du PDF - * - * @param affichageVertical true pour un affichage Vertical, false pour - * un affichage horizontal - */ - public void setAffichageVertical(boolean affichageVertical) { - this.affichageVertical = affichageVertical; - } - - /** - * Prédicat qui vérifie si la fenêtre est en mode plein écran - * @return true si le prédicat est vérifié, false sinon - */ - public boolean isFullscreen() { - return fullscreen; - } - - /** - * Affiche la fenêtre en plein écran lorsqu'elle ne l'est pas et repasse - * en mode fenêtré si le mode plein écran est activé - */ - public void setFullscreen() { - GraphicsEnvironment graphics = - GraphicsEnvironment.getLocalGraphicsEnvironment(); - GraphicsDevice device = graphics.getDefaultScreenDevice(); - - dispose(); - fullscreen = !fullscreen; - if (fullscreen) { - setUndecorated(true); - device.setFullScreenWindow(this); - } else { - device.setFullScreenWindow(null); - setUndecorated(false); - } - setVisible(true); - repaint(); - } -} \ No newline at end of file diff --git a/src/lecteur_pdf/affichage/gestionFenetre.java b/src/lecteur_pdf/affichage/gestionFenetre.java deleted file mode 100644 index 38bb0c1..0000000 --- a/src/lecteur_pdf/affichage/gestionFenetre.java +++ /dev/null @@ -1,48 +0,0 @@ -///* -// * gestionFenetre, 22/11/2021 -// * IUT Rodez 2021, INFO2 -// * pas de copyright, aucun droits -// */ -// -//package lecteur_pdf.affichage; -// -//import javax.swing.*; -//import java.io.File; -// -///** -// * classe de gestion des fenêtres -// * -// * @author Léo FRANCH -// * @author Tristan NOGARET -// * @author Lucàs VABRE -// * @author Noé VILLENEUVE -// * @version 1.0 -// */ -//public class gestionFenetre { -// -// final int NB_MAX_FENETRE = 2 ; -// private Fenetre[] fenetresOuvertes; -// File fichier = null ; -// -// -// public void ouvrirFenetre(){ -// int placeVide; -// for (placeVide=0; placeVide<2; placeVide++){ -// if (fenetresOuvertes[placeVide] == null) break; -// } -// if(placeVide==2) { -// //todo erreur trop de fenetres -// }else { -// Fenetre fenetre = new Fenetre(); -// fenetresOuvertes[placeVide] = fenetre; -// } -// } -// public void fermerFenetre(JFrame fenetre){ -// for (int i = 0; i<2 ; i++){ -// if (fenetre==fenetresOuvertes[i]){ -// fenetre.dispose(); -// fenetresOuvertes[i]= null ; -// } -// } -// } -//} diff --git a/src/lecteur_pdf/document/PDF.java b/src/lecteur_pdf/document/PDF.java deleted file mode 100644 index 5e7df69..0000000 --- a/src/lecteur_pdf/document/PDF.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * PDF, 17/11/2021 - * IUT Rodez 2021, INFO2 - * pas de copyright, aucun droits - */ - -package lecteur_pdf.document; - -import org.apache.pdfbox.pdmodel.PDDocument; - -import javax.swing.*; -import java.awt.*; -import java.io.File; -import java.io.IOException; - -/** - * Définis virtuellement un fichier PDF - * - * @author Léo FRANCH - * @author Tristan NOGARET - * @author Lucàs VABRE - * @author Noé VILLENEUVE - */ -public class PDF extends JPanel { - - /** Document chargé */ - private final PDDocument document; - - /** Les pages chargés */ - private final Page[] pages; - - /** Le zoom des pages du document */ - private float zoom; - - /** - * Crée un document PDF affichable dans une fenêtre - * - * @param fichier Le fichier que l’on veut ouvrir - * @param vertical booléen si true, affiche les pages en vertical, - * sinon horizontal - * @throws IOException si le fichier n’existe pas - */ - public PDF(File fichier, boolean vertical) throws IOException { - document = PDDocument.load(fichier); - pages = new Page[document.getNumberOfPages()]; - zoom = 1.0f; - setAlignmentX(Component.CENTER_ALIGNMENT); - if (vertical) setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - } - - /** - * Charge toutes les pages du document PDF et les stocke dans le tableau - */ - public void loadPages() { - - for (int i = 0; i < pages.length; i++) { - try { - pages[i] = new Page(document, i, zoom); - this.add(pages[i]); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - /** - * Défini le zoom des pages du document - * - * @param zoom la nouvelle valeur du zoom (1.0f == 100%) - */ - public void setZoom(float zoom) { - this.zoom = zoom; - loadPages(); - } -} diff --git a/src/lecteur_pdf/document/Page.java b/src/lecteur_pdf/document/Page.java deleted file mode 100644 index 5e0b8f1..0000000 --- a/src/lecteur_pdf/document/Page.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Page, 17/11/2021 - * IUT Rodez 2021, INFO2 - * pas de copyright, aucun droits - */ - -package lecteur_pdf.document; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.rendering.PDFRenderer; - -import javax.swing.*; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.IOException; - -/** - * Page générée virtuellement pour l’affichage avec java swing - * - * @author Léo FRANCH - * @author Tristan NOGARET - * @author Lucàs VABRE - * @author Noé VILLENEUVE - */ -public class Page extends JLabel { - - /** Indice de la page dans le document */ - private final int INDEX; - - /** Zoom de la page (1.0f == 100 %, 0.5 == 50%, ...) */ - private final float ZOOM; - - /** Image de la page générée */ - private final ImageIcon IMAGE_ICON; - - /** - * Crée une page virtuellement pour l’afficher avec java swing - * - * @param document Document pdf - * @param index indice de la page - * @throws IllegalArgumentException Si les arguments ne sont pas valides - * @throws IOException Si la page n’as pas pu être lue - */ - public Page(PDDocument document, int index) throws - IllegalArgumentException, - IOException { - if (!isValid(document, index)) { - throw new IllegalArgumentException(); - } - - this.INDEX = index; - this.ZOOM = 1.0f; - this.IMAGE_ICON = generateImage(document); - - /* Render */ - this.setIcon(IMAGE_ICON); - } - - /** - * Crée une page virtuellement pour l’afficher avec java swing - * - * @param document Document pdf - * @param index indice de la page - * @param zoom Le zoom de la page - * @throws IllegalArgumentException Si les arguments ne sont pas valides - * @throws IOException Si la page n’as pas pu être lue - */ - public Page(PDDocument document, int index, float zoom) throws - IllegalArgumentException, - IOException { - if (!isValid(document, index)) throw new IllegalArgumentException(); - - this.INDEX = index; - this.ZOOM = zoom; - this.IMAGE_ICON = generateImage(document); // Génère la page - - /* Fait le rendu de la page */ - this.setIcon(IMAGE_ICON); - } - - /** - * Prédicat qui vérifie si une page est valide - * Le document ne doit pas être null et l’index doit être compris entre 0 - * et le nombre de pages du pdf. - * - * @param document Document pdf - * @param index indice de la page - * @return true si le prédicat est vérifié, false sinon - */ - private boolean isValid(PDDocument document, int index) { - return document != null && 0 <= index - && index < document.getNumberOfPages(); - } - - /** - * Génère une image de la page - * - * @param document Document PDF - * @return JLabel contenant la page sous forme d’image - * @throws IOException En cas d’erreur de lecture - */ - private ImageIcon generateImage(PDDocument document) throws IOException { - - /* Défini la qualité de l’image par rapport au zoom */ - final int DPI = 120; - int imageScale = (ZOOM > 1.0f) ? Image.SCALE_SMOOTH : Image.SCALE_FAST; - - /* Crée une image de la page à afficher */ - PDFRenderer pdfRenderer = new PDFRenderer(document); - BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(INDEX, DPI); - - /* Redimensionne l'image */ - final int LARGEUR = (int)(bufferedImage.getWidth() * ZOOM); - final int HAUTEUR = (int)(bufferedImage.getHeight() * ZOOM); - - /* Retourne l’image à la bonne taille */ - return new ImageIcon(bufferedImage.getScaledInstance(LARGEUR, HAUTEUR, - imageScale)); - } -} diff --git a/src/lecteur_pdf/menu/KeyBinding.java b/src/lecteur_pdf/menu/KeyBinding.java deleted file mode 100644 index b34304e..0000000 --- a/src/lecteur_pdf/menu/KeyBinding.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * KeyBinding.java, 18/11/2021 - * IUT Rodez 2021-2021, INFO2 - * pas de copyright, aucun droits - */ - -package lecteur_pdf.menu; - -import javax.swing.*; -import java.util.ArrayList; - -/** - * TODO class comment - * - * @author Léo FRANCH - * @author Tristan NOGARET - * @author Lucàs VABRE - * @author Noé VILLENEUVE - * @version 1.0 - */ -public class KeyBinding { - - /* Déclaration des éléments visuels */ - JFrame frame = new JFrame(); - JLabel label = new JLabel(); - - /* Déclaration des listes */ - ArrayList listeOptions; - ArrayList listeRaccourcis; - - /** - * TODO commenter la méthode - */ - public void KeyBinding() { - - } - - /** - * TODO commenter la méthode - * @param key - * @param menuItem - */ - public void setMenuItemAccelerator(KeyStroke key, JMenuItem menuItem) { - // TODO - } -} diff --git a/src/lecteur_pdf/menu/Menu.java b/src/lecteur_pdf/menu/Menu.java deleted file mode 100644 index c352010..0000000 --- a/src/lecteur_pdf/menu/Menu.java +++ /dev/null @@ -1,377 +0,0 @@ -/* - * Menu.java, 20/11/2021 - * IUT Rodez 2021-2021, INFO2 - * pas de copyright, aucun droits - */ - -package lecteur_pdf.menu; - -import lecteur_pdf.affichage.Fenetre; - -import javax.swing.*; -import java.awt.event.ActionEvent; -import java.awt.event.KeyEvent; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; - -/** - * Classe pour afficher le Menu "Fichier" avec ses options - * - * @author Léo FRANCH - * @author Tristan NOGARET - * @author Lucàs VABRE - * @author Noé VILLENEUVE - * @version 1.0 - */ -public class Menu extends JMenuBar { - - /** - * La Fenêtre mère de la barre des menus - */ - private final Fenetre FENETRE; - - /** - * Liste contenant les différents menus - */ - private final ArrayList MENU_LIST = new ArrayList<>(); - - /** - * Liste contenant les différents sous menus - */ - private final ArrayList ITEM_LIST = new ArrayList<>(); - - /** - * Constructeur du menu - * - * @param fenetre La Fenêtre mère de la barre des menus - */ - public Menu(Fenetre fenetre) { - this.FENETRE = fenetre; - - createMenuFichier(); -// createMenuOptions(); - createMenuAffichage(); - } - - /** - * Créé le menu Fichier et ses sous-menus - */ - private void createMenuFichier() { - - // Créer le Menu Fichier - JMenu Fichier = new JMenu("Fichier"); - - // Créer les items Ouvrir, Fermer et Quitter - JMenuItem Ouvrir = new JMenuItem("Ouvrir"); - JMenuItem Fermer = new JMenuItem("Fermer"); - JMenuItem Quitter = new JMenuItem("Quitter"); - - // Ajoute des actionListener aux JMenuItem - Ouvrir.addActionListener(this::actionPerformed); - Fermer.addActionListener(this::actionPerformed); - Quitter.addActionListener(this::actionPerformed); - - // Définis les raccourcis - KeyStroke raccourciOuvrir = KeyStroke.getKeyStroke(KeyEvent.VK_O, - KeyEvent.CTRL_DOWN_MASK); - Ouvrir.setAccelerator(raccourciOuvrir); - KeyStroke raccourciFermer = KeyStroke.getKeyStroke(KeyEvent.VK_Q, - KeyEvent.CTRL_DOWN_MASK); - Fermer.setAccelerator(raccourciFermer); - KeyStroke raccourciQuitter = KeyStroke.getKeyStroke(KeyEvent.VK_X, - KeyEvent.CTRL_DOWN_MASK); - Quitter.setAccelerator(raccourciQuitter); - - // Ajout des éléments au menu "Fichier" - Fichier.add(Ouvrir); - Fichier.add(Fermer); - Fichier.add(Quitter); - - // Ajoute le menu "Fichier" dans la liste des menus - MENU_LIST.add(Fichier); - - // Ajoute Ouvrir, Fermer et Quitter dans la liste des items - ITEM_LIST.add(Ouvrir); - ITEM_LIST.add(Fermer); - ITEM_LIST.add(Quitter); - - // Ajoute le menu à la barre de menu - this.add(Fichier); - } - -/** - * Menu Options, pas fini, à faire dans les prochains sprints - */ -// /** -// * Créé le menu Options et ses sous-menus -// */ -// private void createMenuOptions() { -// -// // Créer le Menu Options -// JMenu Options = new JMenu("Options"); -// -// // Créer l'item Préférences -// JMenuItem Preferences = new JMenuItem("Préférences"); -// -// // Ajout du Listener au JMenuItem -// Preferences.addActionListener(this::actionPerformed); -// -// // Définis les raccourcis -// KeyStroke raccourciPreferences = KeyStroke.getKeyStroke(KeyEvent.VK_P, -// KeyEvent.CTRL_DOWN_MASK); -// Preferences.setAccelerator(raccourciPreferences); -// -// // Ajouter les éléments au menu "Options" -// Options.add(Preferences); -// -// // Ajoute le menu "Affichage" dans la liste des menus -// MENU_LIST.add(Options); -// -// // Ajoute Preferences dans la liste des items -// ITEM_LIST.add(Preferences); -// -// // Ajoute le menu à la barre de menu -// this.add(Options); -// } - - /** - * Créé le menu Affichage et ses sous-menus - */ - private void createMenuAffichage() { - - // Créer le Menu Affichage - JMenu Affichage = new JMenu("Affichage"); - - // Créer les items de zoom, plein écran et affichage horizontal ou vertical - JMenuItem PleinEcran = new JMenuItem("Mode plein écran"); - JMenuItem ZoomPlus = new JMenuItem("Zoom 150%"); - JMenuItem ZoomNeutre = new JMenuItem("Zoom 100%"); - JMenuItem ZoomMinus = new JMenuItem("Zoom 50%"); - JMenuItem affichageVertical = new JMenuItem("Disposition Verticale"); - JMenuItem affichageHorizontal = new JMenuItem("Disposition Horizontale"); - - // Ajoute des actionListener aux JMenuItem - PleinEcran.addActionListener(this::actionPerformed); - ZoomPlus.addActionListener(this::actionPerformed); - ZoomNeutre.addActionListener(this::actionPerformed); - ZoomMinus.addActionListener(this::actionPerformed); - affichageVertical.addActionListener(this::actionPerformed); - affichageHorizontal.addActionListener(this::actionPerformed); - - // Définis les raccourcis des différents JMenuItems - KeyStroke raccourciPleinEcran = KeyStroke.getKeyStroke(KeyEvent.VK_F11, - 0); - PleinEcran.setAccelerator(raccourciPleinEcran); - KeyStroke raccourciZoomPlus = KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, - KeyEvent.CTRL_DOWN_MASK); - ZoomPlus.setAccelerator(raccourciZoomPlus); - KeyStroke raccourciZoomNeutre = KeyStroke.getKeyStroke(KeyEvent.VK_0, - KeyEvent.CTRL_DOWN_MASK); - ZoomNeutre.setAccelerator(raccourciZoomNeutre); - KeyStroke raccourciZoomMinus = KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, - KeyEvent.CTRL_DOWN_MASK); - ZoomMinus.setAccelerator(raccourciZoomMinus); - KeyStroke raccourciAffVert = KeyStroke.getKeyStroke(KeyEvent.VK_V, - KeyEvent.CTRL_DOWN_MASK); - affichageVertical.setAccelerator(raccourciAffVert); - KeyStroke raccourciAffHor = KeyStroke.getKeyStroke(KeyEvent.VK_H, - KeyEvent.CTRL_DOWN_MASK); - affichageHorizontal.setAccelerator(raccourciAffHor); - - // Ajout des éléments au menu "Affichage" - Affichage.add(PleinEcran); - Affichage.addSeparator(); - Affichage.add(ZoomPlus); - Affichage.add(ZoomNeutre); - Affichage.add(ZoomMinus); - Affichage.addSeparator(); - Affichage.add(affichageVertical); - Affichage.add(affichageHorizontal); - - // Ajoute le menu "Affichage" dans la liste des menus - MENU_LIST.add(Affichage); - - // Ajoute les JMenuItem dans la liste des items - ITEM_LIST.add(PleinEcran); - ITEM_LIST.add(ZoomPlus); - ITEM_LIST.add(ZoomNeutre); - ITEM_LIST.add(ZoomMinus); - ITEM_LIST.add(affichageVertical); - ITEM_LIST.add(affichageHorizontal); - - - // Ajoute le menu à la barre de menu - this.add(Affichage); - } - - /** - * Méthode qui gère les actions des sous-menus - * - * @param ae un action event - */ - public void actionPerformed(ActionEvent ae) { - String choice = ae.getActionCommand(); - String messageErrCorrompu = "Une erreur s'est produite dans le" - + " chargement de votre document," - + " il a peut-être été corrompu. "; - - - final int FERMER = 0; - final int QUITTER = 1; - - /* Message sur les popups d'erreurs */ - final String[][] POPUPS_MSG = { - {"Fermer le PDF actuel", "Êtes-vous sûr de vouloir fermer le PDF " - + "courant ?"}, - {"Quitter l'application", "Êtes-vous sûr de vouloir quitter ?"} - }; - - switch (choice) { - // Cas où l'utilisateur clique sur ouvrir - case "Ouvrir" -> { - if (FENETRE.isFullscreen()) { - FENETRE.setFullscreen(); - } - - if (FENETRE.haveDocument() - && popupConfirmation(POPUPS_MSG[FERMER]) - != JOptionPane.OK_OPTION) { - break; - } - File fichier = SelectionnerFichier.ouvrirFichier(); - - if (fichier != null) { - try { - FENETRE.chargerPDF(fichier); - } catch (IOException e) { - JOptionPane.showMessageDialog(FENETRE, - messageErrCorrompu); - } - } - } - - // Cas où l'utilisateur clique sur fermer - case "Fermer" -> { - if (FENETRE.isFullscreen()) { - FENETRE.setFullscreen(); - } - if (FENETRE.haveDocument() - && popupConfirmation(POPUPS_MSG[FERMER]) - == JOptionPane.OK_OPTION) { - FENETRE.setup(); - } - } - - // Cas où l'utilisateur clique sur quitter - case "Quitter" -> { - if (FENETRE.isFullscreen()) { - FENETRE.setFullscreen(); - } - int option = popupConfirmation(POPUPS_MSG[QUITTER]); - - if (option == JOptionPane.OK_OPTION) { - System.exit(0); - } - } - - // Cas où l'utilisateur clique sur mode plein écran - case "Mode plein écran" -> FENETRE.setFullscreen(); - - // Cas où l'utilisateur clique sur zoom 150% - case "Zoom 150%" -> { - try { - FENETRE.chargerPDF(2.0f); - } catch (IOException e) { - JOptionPane.showMessageDialog(FENETRE, messageErrCorrompu); - } - } - - // Cas où l'utilisateur clique sur zoom 100% - case "Zoom 100%" -> { - try { - FENETRE.chargerPDF(1.0f); - } catch (IOException e) { - JOptionPane.showMessageDialog(FENETRE, messageErrCorrompu); - } - } - - // Cas où l'utilisateur clique sur zoom 50% - case "Zoom 50%" -> { - try { - FENETRE.chargerPDF(0.5f); - } catch (IOException e) { - JOptionPane.showMessageDialog(FENETRE, messageErrCorrompu); - } - } - - // Cas où l'utilisateur clique sur dispotion verticale - case "Disposition Verticale" -> { - if (FENETRE.haveDocument()) { - FENETRE.setAffichageVertical(true); - try { - FENETRE.chargerPDF(); - } catch (IOException e) { - JOptionPane.showMessageDialog(FENETRE, messageErrCorrompu); - } - } - } - - // Cas où l'utilisateur clique sur dispotion horizontale - case "Disposition Horizontale" -> { - if (FENETRE.haveDocument()) { - FENETRE.setAffichageVertical(false); - try { - FENETRE.chargerPDF(); - } catch (IOException e) { - JOptionPane.showMessageDialog(FENETRE, messageErrCorrompu); - } - } - } - } - } - - /** - * @return la liste des JMenuItem - */ - public ArrayList getMenuItems() { - return ITEM_LIST; - } - - /** - * Methode qui renvoie le sous menu demandé avec l'index adéquat - * - * @param index Indice du sous menu - * @return Le sous menu demandé - */ - public JMenuItem getMenuItem(int index) { - return ITEM_LIST.get(index); - } - - /** - * Affiche une popup avec un message ou l'on peut repondre par oui ou par - * non - * - * @param strings Le tableau de chaine de caractère contenant le titre de - * la fenêtre et son message - * @return 0 Si la valeur est Oui - * 1 Si la valeur est Non - * -1 en cas d'erreur - */ - public int popupConfirmation(String[] strings) { - if (strings.length != 2) { - return -1; - } - - final int TITRE = 0; - final int MESSAGE = 1; - - final Object[] CHOIX = {"Oui", "Non"}; - - return JOptionPane.showOptionDialog(null, strings[MESSAGE], - strings[TITRE], - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE, null, - CHOIX, CHOIX[0]); - } -} \ No newline at end of file diff --git a/src/lecteur_pdf/menuBar/MenuBar.java b/src/lecteur_pdf/menuBar/MenuBar.java new file mode 100644 index 0000000..2c1adb6 --- /dev/null +++ b/src/lecteur_pdf/menuBar/MenuBar.java @@ -0,0 +1,16 @@ +package lecteur_pdf_swing.menuBar; + +import lecteur_pdf_swing.IhmPdf; +import lecteur_pdf_swing.menuBar.menu.*; + +import javax.swing.*; + +public class MenuBar extends JMenuBar { + + public MenuBar(IhmPdf parent) { + + add(new MenuFichier(parent)); + add(new MenuAffichage(parent)); + add(new MenuOptions()); + } +} diff --git a/src/lecteur_pdf/menuBar/menu/MenuAffichage.java b/src/lecteur_pdf/menuBar/menu/MenuAffichage.java new file mode 100644 index 0000000..e48fe01 --- /dev/null +++ b/src/lecteur_pdf/menuBar/menu/MenuAffichage.java @@ -0,0 +1,20 @@ +package lecteur_pdf_swing.menuBar.menu; + +import lecteur_pdf_swing.IhmPdf; +import lecteur_pdf_swing.menuBar.menuItems.*; + +import javax.swing.*; + +public class MenuAffichage extends JMenu { + + public MenuAffichage(IhmPdf parent) { + super("Affichage"); + // Ajouter les menu items + add(new PleinEcran(parent)); + addSeparator(); + add(new ZoomPlus(parent)); + add(new ZoomDefaut(parent)); + add(new ZoomMoins(parent)); + } + +} diff --git a/src/lecteur_pdf/menuBar/menu/MenuFichier.java b/src/lecteur_pdf/menuBar/menu/MenuFichier.java new file mode 100644 index 0000000..d4c00a3 --- /dev/null +++ b/src/lecteur_pdf/menuBar/menu/MenuFichier.java @@ -0,0 +1,16 @@ +package lecteur_pdf_swing.menuBar.menu; + +import lecteur_pdf_swing.IhmPdf; +import lecteur_pdf_swing.menuBar.menuItems.*; + +import javax.swing.*; + +public class MenuFichier extends JMenu { + public MenuFichier(IhmPdf parent) { + super("Fichier"); + // Ajouter les menu items + add(new OuvrirFichier(parent)); + add(new FermerFichier(parent)); + add(new Quitter(parent)); + } +} diff --git a/src/lecteur_pdf/menuBar/menu/MenuOptions.java b/src/lecteur_pdf/menuBar/menu/MenuOptions.java new file mode 100644 index 0000000..7f7db93 --- /dev/null +++ b/src/lecteur_pdf/menuBar/menu/MenuOptions.java @@ -0,0 +1,10 @@ +package lecteur_pdf_swing.menuBar.menu; + +import javax.swing.*; + +public class MenuOptions extends JMenu { + public MenuOptions() { + super("Options"); + // Ajouter les menu items + } +} diff --git a/src/lecteur_pdf/menuBar/menuItems/FermerFichier.java b/src/lecteur_pdf/menuBar/menuItems/FermerFichier.java new file mode 100644 index 0000000..2568f53 --- /dev/null +++ b/src/lecteur_pdf/menuBar/menuItems/FermerFichier.java @@ -0,0 +1,23 @@ +package lecteur_pdf_swing.menuBar.menuItems; + +import lecteur_pdf_swing.IhmPdf; + +import javax.swing.*; +import java.awt.event.KeyEvent; + +public class FermerFichier extends JMenuItem { + + IhmPdf parent; + + public FermerFichier(IhmPdf parent) { + super("Fermer"); + this.parent = parent; + + addActionListener(e -> {parent.fermerFichier();}); + + KeyStroke raccourciFermer = KeyStroke.getKeyStroke(KeyEvent.VK_X, + KeyEvent.CTRL_DOWN_MASK); + setAccelerator(raccourciFermer); + + } +} diff --git a/src/lecteur_pdf/menuBar/menuItems/OuvrirFichier.java b/src/lecteur_pdf/menuBar/menuItems/OuvrirFichier.java new file mode 100644 index 0000000..57fe032 --- /dev/null +++ b/src/lecteur_pdf/menuBar/menuItems/OuvrirFichier.java @@ -0,0 +1,30 @@ +package lecteur_pdf_swing.menuBar.menuItems; + +import lecteur_pdf_swing.GestionPdf; +import lecteur_pdf_swing.IhmPdf; + +import javax.swing.*; +import java.awt.event.KeyEvent; +import java.io.IOException; + +public class OuvrirFichier extends JMenuItem { + + IhmPdf parent; + + public OuvrirFichier(IhmPdf parent) { + super("Ouvrir"); + this.parent = parent; + + addActionListener(e -> { + try { + parent.ouvrirFichier(); + } catch (IOException ex) { + ex.printStackTrace(); + } + }); + + KeyStroke raccourciOuvrir = KeyStroke.getKeyStroke(KeyEvent.VK_O, + KeyEvent.CTRL_DOWN_MASK); + setAccelerator(raccourciOuvrir); + } +} diff --git a/src/lecteur_pdf/menuBar/menuItems/PleinEcran.java b/src/lecteur_pdf/menuBar/menuItems/PleinEcran.java new file mode 100644 index 0000000..d83ea5a --- /dev/null +++ b/src/lecteur_pdf/menuBar/menuItems/PleinEcran.java @@ -0,0 +1,21 @@ +package lecteur_pdf_swing.menuBar.menuItems; + +import lecteur_pdf_swing.IhmPdf; + +import javax.swing.*; +import java.awt.event.KeyEvent; + +public class PleinEcran extends JMenuItem { + + IhmPdf parent; + + public PleinEcran(IhmPdf parent) { + super("Mode Plein Ecran"); + this.parent = parent; + KeyStroke raccourciPleinEcran = KeyStroke.getKeyStroke(KeyEvent.VK_F11, + 0); + setAccelerator(raccourciPleinEcran); + addActionListener(e -> {parent.pleinEcran();}); + + } +} diff --git a/src/lecteur_pdf/menuBar/menuItems/Quitter.java b/src/lecteur_pdf/menuBar/menuItems/Quitter.java new file mode 100644 index 0000000..751f387 --- /dev/null +++ b/src/lecteur_pdf/menuBar/menuItems/Quitter.java @@ -0,0 +1,23 @@ +package lecteur_pdf_swing.menuBar.menuItems; + +import lecteur_pdf_swing.IhmPdf; + +import javax.swing.*; +import java.awt.event.KeyEvent; + +public class Quitter extends JMenuItem { + + IhmPdf parent; + + public Quitter(IhmPdf parent) { + super("Quitter"); + this.parent = parent; + + addActionListener(e -> {parent.quitter();}); + + KeyStroke raccourciQuitter = KeyStroke.getKeyStroke(KeyEvent.VK_Q, + KeyEvent.CTRL_DOWN_MASK); + setAccelerator(raccourciQuitter); + } + +} diff --git a/src/lecteur_pdf/menuBar/menuItems/ZoomDefaut.java b/src/lecteur_pdf/menuBar/menuItems/ZoomDefaut.java new file mode 100644 index 0000000..2844c2b --- /dev/null +++ b/src/lecteur_pdf/menuBar/menuItems/ZoomDefaut.java @@ -0,0 +1,23 @@ +package lecteur_pdf_swing.menuBar.menuItems; + +import lecteur_pdf_swing.IhmPdf; + +import javax.swing.*; +import java.awt.event.KeyEvent; + +public class ZoomDefaut extends JMenuItem { + + IhmPdf parent; + + public ZoomDefaut(IhmPdf parent) { + super("Zoom 100%"); + this.parent = parent; + + KeyStroke raccourciZoomDefaut = KeyStroke.getKeyStroke(KeyEvent.VK_L, + KeyEvent.CTRL_DOWN_MASK); + setAccelerator(raccourciZoomDefaut); + addActionListener(e -> {parent.zoomDefaut();}); + + } + +} diff --git a/src/lecteur_pdf/menuBar/menuItems/ZoomMoins.java b/src/lecteur_pdf/menuBar/menuItems/ZoomMoins.java new file mode 100644 index 0000000..2522942 --- /dev/null +++ b/src/lecteur_pdf/menuBar/menuItems/ZoomMoins.java @@ -0,0 +1,22 @@ +package lecteur_pdf_swing.menuBar.menuItems; + +import lecteur_pdf_swing.IhmPdf; + +import javax.swing.*; +import java.awt.event.KeyEvent; + +public class ZoomMoins extends JMenuItem { + + IhmPdf parent; + + public ZoomMoins(IhmPdf parent) { + super("Zoom 50%"); + this.parent = parent; + + KeyStroke raccourciZoomMoins = KeyStroke.getKeyStroke(KeyEvent.VK_K, + KeyEvent.CTRL_DOWN_MASK); + setAccelerator(raccourciZoomMoins); + addActionListener(e -> {parent.zoomMoins();}); + + } +} diff --git a/src/lecteur_pdf/menuBar/menuItems/ZoomPlus.java b/src/lecteur_pdf/menuBar/menuItems/ZoomPlus.java new file mode 100644 index 0000000..485700b --- /dev/null +++ b/src/lecteur_pdf/menuBar/menuItems/ZoomPlus.java @@ -0,0 +1,21 @@ +package lecteur_pdf_swing.menuBar.menuItems; + +import lecteur_pdf_swing.IhmPdf; + +import javax.swing.*; +import java.awt.event.KeyEvent; + +public class ZoomPlus extends JMenuItem { + + IhmPdf parent; + + public ZoomPlus(IhmPdf parent) { + super("Zoom 150%"); + this.parent = parent; + KeyStroke raccourciZoomPlus = KeyStroke.getKeyStroke(KeyEvent.VK_M, + KeyEvent.CTRL_DOWN_MASK); + setAccelerator(raccourciZoomPlus); + addActionListener(e -> {parent.zoomPlus();}); + + } +} \ No newline at end of file diff --git a/src/lecteur_pdf/pdf/PdfLoader.java b/src/lecteur_pdf/pdf/PdfLoader.java new file mode 100644 index 0000000..c05905e --- /dev/null +++ b/src/lecteur_pdf/pdf/PdfLoader.java @@ -0,0 +1,42 @@ +package lecteur_pdf_swing.pdf; + +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.rendering.PDFRenderer; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +public class PdfLoader { + PDDocument document; + PDFRenderer renderer; + + public PdfLoader(File file) throws IOException { + document = PDDocument.load(file); + renderer = new PDFRenderer(document); + } + + public int getNbPages() { + return document.getNumberOfPages(); + } + + public BufferedImage renderPage(int pageIndex, float scale) throws IOException { + if (pageIndex < 0 || pageIndex >= this.getNbPages()) { + throw new IllegalArgumentException(); + } + return renderer.renderImage(pageIndex, scale); + } + + public void close() { + try { + document.close(); + } catch(IOException ignored) {} + } + + public void load(File file) { + try { + document = PDDocument.load(file); + } catch (IOException ignored) {} + } + +} diff --git a/src/lecteur_pdf/pdf/PdfPanel.form b/src/lecteur_pdf/pdf/PdfPanel.form new file mode 100644 index 0000000..301c941 --- /dev/null +++ b/src/lecteur_pdf/pdf/PdfPanel.form @@ -0,0 +1,86 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/lecteur_pdf/pdf/PdfPanel.java b/src/lecteur_pdf/pdf/PdfPanel.java new file mode 100644 index 0000000..0afa058 --- /dev/null +++ b/src/lecteur_pdf/pdf/PdfPanel.java @@ -0,0 +1,77 @@ +package lecteur_pdf_swing.pdf; + +import javax.swing.*; +import java.awt.*; +import java.io.File; +import java.io.IOException; + +public class PdfPanel extends JPanel { + private int currentPage; + private float currentScale; + + final PdfLoader pdfLoader; + + private JButton suivantButton; + private JButton precedentButton; + private JLabel pageIndicator; + private JPanel mainPanel; + private JLabel page; + private JScrollPane scrollPane; + private JTextField indexPage; + + public PdfPanel(File pdfFile) throws IOException { + super(); + + this.currentScale = 1.0f; + + scrollPane.setMaximumSize(Toolkit.getDefaultToolkit().getScreenSize()); + /* Définitions des arguments */ + pdfLoader = new PdfLoader(pdfFile); + + if (pdfFile != null) { + defaultPage(); + + /* Hierarchie */ + add(mainPanel); + + /* Actions */ + suivantButton.addActionListener(e -> updatePage(currentPage + 1)); + precedentButton.addActionListener(e -> updatePage(currentPage - 1)); + indexPage.addActionListener(e -> updatePageInput()); + } + } + + public void updateScale(float scale) { + this.currentScale = scale; + updatePage(currentPage); + } + + private void defaultPage() { + updatePage(0); + } + + public void updatePage(int index) { + try { + if (pdfLoader == null) throw new IllegalStateException(); + page.setIcon(new ImageIcon(pdfLoader.renderPage(index, + currentScale))); + currentPage = index; + pageIndicator.setText(String.format("%d/%d", currentPage + 1, + pdfLoader.getNbPages())); + } catch (IOException | IllegalArgumentException | IllegalStateException ignored) {} + } + + public void updatePageInput() { + String input = indexPage.getText(); + try { + int index = Integer.parseInt(input); + if (index > 0 && index <= pdfLoader.getNbPages()) { + updatePage(index - 1); + } else { + throw new Exception(); + } + } catch (Exception e) { + indexPage.setText(""); + } + } +}