diff --git a/src/lecteur_pdf/menuBar/menu/MenuAffichage.java b/src/lecteur_pdf/menuBar/menu/MenuAffichage.java index e405348..42e9c3b 100644 --- a/src/lecteur_pdf/menuBar/menu/MenuAffichage.java +++ b/src/lecteur_pdf/menuBar/menu/MenuAffichage.java @@ -44,6 +44,12 @@ public class MenuAffichage extends JMenu { add(new ZoomPlus(parent)); add(new ZoomDefaut(parent)); add(new ZoomMoins(parent)); + addSeparator(); + + + + add(new PageEntiere(parent)); + add(new PleineLargeur(parent)); } } diff --git a/src/lecteur_pdf/menuBar/menuItems/PageEntiere.java b/src/lecteur_pdf/menuBar/menuItems/PageEntiere.java new file mode 100644 index 0000000..ef94f76 --- /dev/null +++ b/src/lecteur_pdf/menuBar/menuItems/PageEntiere.java @@ -0,0 +1,17 @@ +package lecteur_pdf.menuBar.menuItems; + +import lecteur_pdf.IhmPdf; + +public class PageEntiere extends MenuItem { + /** + * TODO + * @param parent Référence de la fenêtre qui possède l'instance de ce MenuItem + */ + public PageEntiere(IhmPdf parent) { + super(parent, "Page Entière"); + + addActionListener(e -> { + parent.getPdfPanel().setPleineLargeur(false); + }); + } +} diff --git a/src/lecteur_pdf/menuBar/menuItems/PleineLargeur.java b/src/lecteur_pdf/menuBar/menuItems/PleineLargeur.java new file mode 100644 index 0000000..d2d096c --- /dev/null +++ b/src/lecteur_pdf/menuBar/menuItems/PleineLargeur.java @@ -0,0 +1,19 @@ +package lecteur_pdf.menuBar.menuItems; + +import lecteur_pdf.IhmPdf; + +public class PleineLargeur extends MenuItem{ + + + /** + * TODO + * @param parent Référence de la fenêtre qui possède l'instance de ce MenuItem + */ + public PleineLargeur(IhmPdf parent) { + super(parent, "Pleine Largeur"); + + addActionListener(e -> { + parent.getPdfPanel().setPleineLargeur(true); + }); + } +} diff --git a/src/lecteur_pdf/menuBar/menuItems/ZoomDefaut.java b/src/lecteur_pdf/menuBar/menuItems/ZoomDefaut.java index 0b11ea8..17d8e6c 100644 --- a/src/lecteur_pdf/menuBar/menuItems/ZoomDefaut.java +++ b/src/lecteur_pdf/menuBar/menuItems/ZoomDefaut.java @@ -28,7 +28,7 @@ public class ZoomDefaut extends MenuItem { super(parent, "Zoom 100%"); addActionListener(e -> { - parent.getPdfPanel().updateScale(1.0f); + parent.getPdfPanel().updateScaleZoom(1.0f); parent.validate(); }); diff --git a/src/lecteur_pdf/menuBar/menuItems/ZoomMoins.java b/src/lecteur_pdf/menuBar/menuItems/ZoomMoins.java index 47be3b6..2b649cc 100644 --- a/src/lecteur_pdf/menuBar/menuItems/ZoomMoins.java +++ b/src/lecteur_pdf/menuBar/menuItems/ZoomMoins.java @@ -28,7 +28,7 @@ public class ZoomMoins extends MenuItem { super(parent, "Zoom 50%"); addActionListener(e -> { - parent.getPdfPanel().updateScale(0.5f); + parent.getPdfPanel().updateScaleZoom(0.5f); parent.validate(); }); diff --git a/src/lecteur_pdf/menuBar/menuItems/ZoomPlus.java b/src/lecteur_pdf/menuBar/menuItems/ZoomPlus.java index 3668766..b7e47c5 100644 --- a/src/lecteur_pdf/menuBar/menuItems/ZoomPlus.java +++ b/src/lecteur_pdf/menuBar/menuItems/ZoomPlus.java @@ -28,7 +28,7 @@ public class ZoomPlus extends MenuItem { super(parent, "Zoom 150%"); addActionListener(e -> { - parent.getPdfPanel().updateScale(1.5f); + parent.getPdfPanel().updateScaleZoom(1.5f); parent.validate(); }); diff --git a/src/lecteur_pdf/pdf/OutilsImage.java b/src/lecteur_pdf/pdf/OutilsImage.java new file mode 100644 index 0000000..4d19553 --- /dev/null +++ b/src/lecteur_pdf/pdf/OutilsImage.java @@ -0,0 +1,61 @@ +package lecteur_pdf.pdf; + +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; + +public class OutilsImage { + + /** + * Change la taille d'une image + * @param img + * @param newW + * @param newH + * @return + */ + public static BufferedImage resize(BufferedImage img, int newW, int newH) { + int w = img.getWidth(); + int h = img.getHeight(); + BufferedImage dimg = new BufferedImage(newW, newH, img.getType()); + Graphics2D g = dimg.createGraphics(); + g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, + RenderingHints.VALUE_INTERPOLATION_BILINEAR); + g.drawImage(img, 0, 0, newW, newH, 0, 0, w, h, null); + g.dispose(); + return dimg; + } + + /** + * + * @param img + * @param newW + * @return + */ + public static BufferedImage resizeWidth(PdfLoader a, Icon img, int newW) { + int w = a.getMinWidth(); + int h = a.getMinHeight(); + + float ratio = (float)newW / (float)w; + + return a.setScale(ratio); + } + + /** + * + * @param img + * @param newH + * @return + */ + public static BufferedImage resizeHeight(BufferedImage img, int newH) { + int w = img.getWidth(); + int h = img.getHeight(); + + int ratio = newH / (1+h); +// System.out.println(ratio); + + int newW = w * ratio; + + return resize(img, newW, newH); + } + +} diff --git a/src/lecteur_pdf/pdf/PdfLoader.java b/src/lecteur_pdf/pdf/PdfLoader.java index 3855e28..26051de 100644 --- a/src/lecteur_pdf/pdf/PdfLoader.java +++ b/src/lecteur_pdf/pdf/PdfLoader.java @@ -26,12 +26,15 @@ public class PdfLoader { /** * TODO */ - PDDocument document; + private PDDocument document; /** * TODO */ - PDFRenderer renderer; + private PDFRenderer renderer; + + private int minWidth; + private int minHeight; /** * TODO @@ -42,6 +45,16 @@ public class PdfLoader { public PdfLoader(File file) throws IOException { document = PDDocument.load(file); renderer = new PDFRenderer(document); + minWidth = -1; + minHeight = -1; + } + + public int getMinWidth() { + return minWidth; + } + + public int getMinHeight() { + return minHeight; } /** @@ -53,6 +66,18 @@ public class PdfLoader { return document.getNumberOfPages(); } + + public BufferedImage renderPage(int pageIndex) throws IOException { + return renderPage(pageIndex, 1.0f); + } + + public BufferedImage setScale(float scale) { + try { + return renderPage(0, scale); + } catch (IOException ignored) {} + return null; + } + /** * TODO * @@ -65,7 +90,15 @@ public class PdfLoader { if (pageIndex < 0 || pageIndex >= this.getNbPages()) { throw new IllegalArgumentException(); } - return renderer.renderImage(pageIndex, scale); + + BufferedImage img = renderer.renderImage(pageIndex, scale); + + if (scale == 1.0f && minWidth == -1 && minHeight == -1) { + minWidth = img.getWidth(); + minHeight = img.getHeight(); + } + + return img; } /** @@ -75,6 +108,8 @@ public class PdfLoader { try { renderer = null; document.close(); + minWidth = -1; + minHeight = -1; } catch (IOException ignored) { } } diff --git a/src/lecteur_pdf/pdf/PdfPanel.form b/src/lecteur_pdf/pdf/PdfPanel.form deleted file mode 100644 index 1e9f64b..0000000 --- a/src/lecteur_pdf/pdf/PdfPanel.form +++ /dev/null @@ -1,86 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/src/lecteur_pdf/pdf/PdfPanel.java b/src/lecteur_pdf/pdf/PdfPanel.java index 0c29951..e3c75ae 100644 --- a/src/lecteur_pdf/pdf/PdfPanel.java +++ b/src/lecteur_pdf/pdf/PdfPanel.java @@ -1,7 +1,7 @@ /* * PdfPanel.java, 26/02/2022 * IUT Rodez 2021-2022, INFO 2 - * pas de copyright, aucun droits + * Pas de copyright, aucun droits */ package lecteur_pdf.pdf; @@ -11,11 +11,13 @@ import lecteur_pdf.GestionPdf; import javax.swing.*; import java.awt.*; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; import java.io.File; import java.io.IOException; /** - * TODO commentaires + * Interface de la mainframe de l'application sans utilisation de forms * * @author Léo Franch * @author Lucas Vabre @@ -23,79 +25,113 @@ import java.io.IOException; * @author Tristan Nogaret */ public class PdfPanel extends JPanel { - /** - * TODO - */ + private int currentPage; - /** - * TODO - */ - private float currentScale; + private float scaleSizing; + private float scaleZoom; + + private boolean pleineLargeur; - /** - * TODO - */ private PdfLoader pdfLoader; - private JButton suivantButton; - private JButton precedentButton; - private JLabel pageIndicator; - private JPanel mainPanel; - private JLabel page; - private JScrollPane scrollPane; - private JTextField indexPage; + private final JTextField indexPageInput; + private final JLabel maxPageLabel; + + private final JScrollPane scrollPane; + private final JViewport viewport; + private final JLabel page; + + private boolean processing; - /** - * TODO - */ public PdfPanel() { - super(); + super(new BorderLayout()); - this.currentScale = 1.0f; + scaleSizing = 0.0f; + scaleZoom = 1.0f; + currentPage = 0; + processing = false; + pleineLargeur = false; - scrollPane.setMaximumSize(Toolkit.getDefaultToolkit().getScreenSize()); + /* Controls */ + JPanel controls = new JPanel(); + /* Contenu de Controls */ + JButton btnPrecedent = new JButton("Précédent"); + indexPageInput = new JTextField(); + indexPageInput.setText("-"); + maxPageLabel = new JLabel("/ -"); + JButton btnSuivant = new JButton("Suivant"); - // TODO supprimer le form et creer les éléments 1 par 1 + controls.add(btnPrecedent); + controls.add(indexPageInput); + controls.add(maxPageLabel); + controls.add(btnSuivant); - /* Hierarchie */ - add(mainPanel); + add(controls, BorderLayout.PAGE_START); + + /* View */ + page = new JLabel(); + JPanel pagePanel = new JPanel(); + /* Contenu de View */ + scrollPane = new JScrollPane(pagePanel); + scrollPane.getVerticalScrollBar().setUnitIncrement(16); + viewport = scrollPane.getViewport(); + + pagePanel.add(page); + + add(scrollPane, BorderLayout.CENTER); /* Actions */ - suivantButton.addActionListener(e -> { - if (GestionMode.isModeSepare()) { - nextPage(); - } else { - GestionPdf.nextPages(); - } + btnSuivant.addActionListener(e -> { + if (GestionMode.isModeSepare()) nextPage(); + else GestionPdf.nextPages(); }); - precedentButton.addActionListener(e -> { - if (GestionMode.isModeSepare()) { - previousPage(); - } else { - GestionPdf.previousPages(); - } + btnPrecedent.addActionListener(e -> { + if (GestionMode.isModeSepare()) previousPage(); + else GestionPdf.previousPages(); }); - indexPage.addActionListener(e -> { - - String saisie = indexPage.getText(); - - int index = Integer.parseInt(saisie); - - /* Si cet entier est valide on change de page sinon on efface le contenu de la saisie */ - if (isPageValide(index)) { - setPage(index - 1); - } else { - indexPage.setText(null); + indexPageInput.addActionListener(e -> { + String saisie = indexPageInput.getText(); + try { + int index = Integer.parseInt(saisie); + if (isPageValide(index - 1)) setPage(index - 1); + else throw new Exception(); + } catch (Exception f) { + indexPageInput.setText(null); } + }); + scrollPane.addComponentListener(new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent e) { + super.componentResized(e); + resize(); + } + }); + } + + public void resize() { + if (pdfLoader != null && !processing) { + if (pleineLargeur) { + scaleSizing = (((float) viewport.getWidth() - (float) scrollPane.getVerticalScrollBar().getWidth()) / (float) pdfLoader.getMinWidth()) - scaleZoom; + } else { + scaleSizing = (((float) viewport.getHeight() - (float) scrollPane.getHorizontalScrollBar().getHeight()) / (float) pdfLoader.getMinHeight()) - scaleZoom; + } + updateScaleSizing(scaleSizing); + } + } + + public void setPleineLargeur(boolean pleineLargeur) { + this.pleineLargeur = pleineLargeur; + resize(); } /** * Prédicat qui vérifie si un index de page est valide pour le PDF courrant + * * @param index Entier correspondant a l'indice du numéro de page à tester * @return true si le prédicat est vérifié, false sinon */ @@ -106,6 +142,7 @@ public class PdfPanel extends JPanel { /** * Methode qui permet de charger un PDF dans le fenêtre courrante + * * @param pdfFile Le fichier PDF à charger * @return true si le PDF à pu se charger, false sinon */ @@ -120,7 +157,6 @@ public class PdfPanel extends JPanel { } /** - * TODO * @param pdfLoader */ public void setPdfLoader(PdfLoader pdfLoader) { @@ -131,9 +167,7 @@ public class PdfPanel extends JPanel { * TODO */ public void dechargerPdf() { - if (pdfLoader == null) { - return; - } + if (pdfLoader == null) return; /* Ferme le loader et l'efface */ pdfLoader.close(); @@ -144,18 +178,29 @@ public class PdfPanel extends JPanel { currentPage = 0; /* Interface Vide */ - indexPage.setText(""); - pageIndicator.setText("/ -"); + indexPageInput.setText(""); + maxPageLabel.setText("/ -"); validate(); } /** * Change la taille de la page courrante + * * @param scale Valeur flottante (1.00f == 100%) */ - public void updateScale(float scale) { - currentScale = scale; + public void updateScaleZoom(float scale) { + scaleZoom = scale; + setPage(currentPage); + } + + /** + * Change la taille de la page courrante + * + * @param scale Valeur flottante (1.00f == 100%) + */ + public void updateScaleSizing(float scale) { + scaleSizing = scale; setPage(currentPage); } @@ -175,19 +220,19 @@ public class PdfPanel extends JPanel { /** * Essaye de changer de page si possible, sinon ne fait rien + * * @param index Le numéro de la page où l'on veut se rendre */ private void setPage(int index) { if (!isPageValide(index)) return; + processing = true; try { - page.setIcon(new ImageIcon(pdfLoader.renderPage(index, currentScale))); + page.setIcon(new ImageIcon(pdfLoader.renderPage(index, scaleZoom + scaleSizing))); currentPage = index; - indexPage.setText(Integer.toString(currentPage +1)); - pageIndicator.setText(String.format("/%d", pdfLoader.getNbPages())); - } catch (IOException e) { - e.printStackTrace(); - } - + indexPageInput.setText(Integer.toString(currentPage + 1)); + maxPageLabel.setText(String.format("/%d", pdfLoader.getNbPages())); + } catch (IOException ignored) {} + processing = false; } } diff --git a/src/lecteur_pdf/pdf/PdfPanel2.java b/src/lecteur_pdf/pdf/PdfPanel2.java deleted file mode 100644 index 867db71..0000000 --- a/src/lecteur_pdf/pdf/PdfPanel2.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * PdfPanel2.java, 26/02/2022 - * IUT Rodez 2021-2022, INFO 2 - * Pas de copyright, aucun droits - */ - -package lecteur_pdf.pdf; - -import lecteur_pdf.SelectionnerFichier; - -import javax.swing.*; -import java.awt.*; -import java.io.IOException; - -/** - * Interface de la mainframe de l'application sans utilisation de forms - * - * @author Léo Franch - * @author Lucas Vabre - * @author Noé Villeneuve - * @author Tristan Nogaret - */ -public class PdfPanel2 extends JFrame { - - public PdfPanel2() { - super("JScrollPaneExemple"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - /* Controls */ - JPanel controlPanel = new JPanel(); - JButton btnPre = new JButton("Precedent"); - JTextField indexPageField = new JTextField(); - JLabel maxPagesLabel = new JLabel("/ -"); - JButton btnSuiv = new JButton("Suivant"); - - controlPanel.add(btnPre); - controlPanel.add(indexPageField); - controlPanel.add(maxPagesLabel); - controlPanel.add(btnSuiv); - - /* Vue */ - JPanel view = null; - try { - PdfLoader pdfLoader = new PdfLoader(SelectionnerFichier.ouvrirFichier()); - - ImageIcon image = new ImageIcon(pdfLoader.renderPage(0, 1.0f)); - JLabel pimage = new JLabel(); - pimage.setIcon(image); - - view = new JPanel(); - view.add(pimage); - - } catch (IOException e) { - e.printStackTrace(); - } - - JPanel main = new JPanel(new BorderLayout()); - main.add(controlPanel, BorderLayout.PAGE_START); - JScrollPane jsp = new JScrollPane(view); - main.add(jsp, BorderLayout.CENTER); - - add(main); - - setLocationRelativeTo(null); - setVisible(true); - setSize(300, 300); - } - - public static void main(String[] args) { - new PdfPanel2(); - } - -}