Merge pull request #44 from LucasV-IUT/version2

Init V2
This commit is contained in:
Zanter12
2022-02-15 18:49:23 +01:00
committed by GitHub
24 changed files with 555 additions and 900 deletions
+28
View File
@@ -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<IhmPdf> ihmPdfList = new ArrayList<IhmPdf>();
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();
}
}
+95
View File
@@ -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();
}
}
@@ -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();}
}
@@ -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;
-212
View File
@@ -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 à lobjet 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();
}
}
@@ -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 ;
// }
// }
// }
//}
-75
View File
@@ -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 lon veut ouvrir
* @param vertical booléen si true, affiche les pages en vertical,
* sinon horizontal
* @throws IOException si le fichier nexiste 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();
}
}
-120
View File
@@ -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 laffichage 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 lafficher 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 nas 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 lafficher 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 nas 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 lindex 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 dimage
* @throws IOException En cas derreur de lecture
*/
private ImageIcon generateImage(PDDocument document) throws IOException {
/* Défini la qualité de limage 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 limage à la bonne taille */
return new ImageIcon(bufferedImage.getScaledInstance(LARGEUR, HAUTEUR,
imageScale));
}
}
-46
View File
@@ -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<String> listeOptions;
ArrayList<KeyStroke> 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
}
}
-377
View File
@@ -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<JMenu> MENU_LIST = new ArrayList<>();
/**
* Liste contenant les différents sous menus
*/
private final ArrayList<JMenuItem> 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<JMenuItem> 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]);
}
}
+16
View File
@@ -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());
}
}
@@ -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));
}
}
@@ -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));
}
}
@@ -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
}
}
@@ -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);
}
}
@@ -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);
}
}
@@ -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();});
}
}
@@ -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);
}
}
@@ -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();});
}
}
@@ -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();});
}
}
@@ -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();});
}
}
+42
View File
@@ -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) {}
}
}
+86
View File
@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="lecteur_pdf_swing.pdf.PdfPanel">
<grid id="27dc6" binding="mainPanel" layout-manager="GridLayoutManager" row-count="2" column-count="6" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="500" height="400"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<component id="9ec2f" class="javax.swing.JLabel" binding="pageIndicator">
<constraints>
<grid row="0" column="3" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="/ - "/>
</properties>
</component>
<component id="6e10b" class="javax.swing.JButton" binding="suivantButton" default-binding="true">
<constraints>
<grid row="0" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Suivant"/>
</properties>
</component>
<hspacer id="cb0bf">
<constraints>
<grid row="0" column="5" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
</hspacer>
<hspacer id="75413">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
</hspacer>
<component id="6531c" class="javax.swing.JButton" binding="precedentButton">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Précédent"/>
</properties>
</component>
<grid id="59e1d" layout-manager="BorderLayout" hgap="0" vgap="0">
<constraints>
<grid row="1" column="0" row-span="1" col-span="6" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<scrollpane id="7a9db" binding="scrollPane">
<constraints border-constraint="Center"/>
<properties>
<verticalScrollBarPolicy value="20"/>
</properties>
<border type="none"/>
<children>
<grid id="fd78c" layout-manager="BorderLayout" hgap="0" vgap="0">
<constraints/>
<properties/>
<border type="none"/>
<children>
<component id="835ed" class="javax.swing.JLabel" binding="page">
<constraints border-constraint="Center"/>
<properties>
<text value=""/>
</properties>
</component>
</children>
</grid>
</children>
</scrollpane>
</children>
</grid>
<component id="73f5" class="javax.swing.JTextField" binding="indexPage">
<constraints>
<grid row="0" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
<preferred-size width="150" height="-1"/>
</grid>
</constraints>
<properties/>
</component>
</children>
</grid>
</form>
+77
View File
@@ -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("");
}
}
}