Mode Pleine Largeur et mode Page Entière + S'adapte au petits ecrans

This commit is contained in:
LucasV-IUT
2022-02-26 22:23:08 +01:00
parent 8f0f010f47
commit ab214e7cc9
11 changed files with 255 additions and 231 deletions
@@ -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));
}
}
@@ -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);
});
}
}
@@ -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);
});
}
}
@@ -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();
});
@@ -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();
});
@@ -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();
});
+61
View File
@@ -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);
}
}
+38 -3
View File
@@ -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) {
}
}
-86
View File
@@ -1,86 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="lecteur_pdf.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>
+111 -66
View File
@@ -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;
}
}
-73
View File
@@ -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();
}
}