From 85020090fa8356e7a8cffd0bd17e7f5b454387d8 Mon Sep 17 00:00:00 2001 From: AlgaLaptop Date: Sat, 20 Dec 2025 00:30:14 +0100 Subject: [PATCH] interface pour les code c bon --- PlaningDeTavail.md | 14 +- build/fr/iutfbleau/sae/Convertisseur.class | Bin 471 -> 1024 bytes build/fr/iutfbleau/sae/Viewer.class | Bin 0 -> 444 bytes build/fr/iutfbleau/sae/util/Config.class | Bin 0 -> 693 bytes .../sae/vconverter/CodeTablePanel.class | Bin 0 -> 3753 bytes .../sae/vconverter/ConverterWindow.class | Bin 0 -> 3360 bytes .../sae/vconverter/FrequencyTablePanel.class | Bin 0 -> 305 bytes .../sae/vconverter/ImagePreviewPanel.class | Bin 0 -> 316 bytes makefile | 62 +++++++-- src/fr/iutfbleau/sae/Convertisseur.java | 26 +++- src/fr/iutfbleau/sae/util/Config.java | 15 ++ .../sae/vconverter/CodeTablePanel.java | 110 +++++++++++++++ .../sae/vconverter/ConverterWindow.java | 129 ++++++++++++++---- .../sae/vconverter/FrequencyTablePanel.java | 12 +- .../sae/vconverter/ImagePreviewPanel.java | 22 +++ 15 files changed, 342 insertions(+), 48 deletions(-) create mode 100644 build/fr/iutfbleau/sae/Viewer.class create mode 100644 build/fr/iutfbleau/sae/util/Config.class create mode 100644 build/fr/iutfbleau/sae/vconverter/CodeTablePanel.class create mode 100644 build/fr/iutfbleau/sae/vconverter/ConverterWindow.class create mode 100644 build/fr/iutfbleau/sae/vconverter/FrequencyTablePanel.class create mode 100644 build/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.class create mode 100644 src/fr/iutfbleau/sae/util/Config.java create mode 100644 src/fr/iutfbleau/sae/vconverter/CodeTablePanel.java create mode 100644 src/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.java diff --git a/PlaningDeTavail.md b/PlaningDeTavail.md index d81adf2..ed897bf 100644 --- a/PlaningDeTavail.md +++ b/PlaningDeTavail.md @@ -27,8 +27,8 @@ Objectif : Mise en place des fondations techniques | US-U5 | YB | DOING | 🟨 | Chargement d’image via ImageIO | | US-D8 | YB | TODO | 🟥 | Structure RGBImage + Pixel | | US-P1 | AA | TODO | 🟥 | Interface simple d’affichage des fréquences | -| US-P2 | AD | DOING | 🟨 | Interface simple d’affichage Huffman | -| US-P3 | AA | TODO | 🟥 | Interface simple d’affichage canoniques | +| US-P2 | AD | DONE | 🟩 | Interface simple d’affichage codes Huffman | +| US-P3 | AA | TODO | 🟥 | Interface simple d’affichage codes canoniques | ## Fichiers à créer – Sprint 1 @@ -83,14 +83,14 @@ Objectif : Écriture du format `.pif` + finalisation convertisseur | US | Assigné | Statut | | Description | |------------|---------|--------|-----|-------------| -| US-D2 | AD | TODO | 🟥 | Vérifier BitOutputStream avec flux réel | +| US-D2 | AA | TODO | 🟥 | Vérifier BitOutputStream avec flux réel | | US-C5 | AD | TODO | 🟥 | Implémenter PIFWriter (header + tables + pixels compressés) | | US-U6 | AD | TODO | 🟥 | Exporter une image en `.pif` | | US-P1 | AA | TODO | 🟥 | Finaliser affichage des fréquences | -| US-P2 | YB | TODO | 🟥 | Finaliser affichage codes Huffman | +| US-P2 | AA | TODO | 🟥 | Finaliser affichage codes Huffman | | US-P3 | AA | TODO | 🟥 | Finaliser affichage codes canoniques | -| US-U7 | YB | TODO | 🟥 | Implémenter l’aperçu (PreviewPanel) | -| US-D3..D6 | YB | TODO | 🟥 | Lier interface convertisseur ↔ compression | +| US-U7 | AD | TODO | 🟥 | Implémenter l’aperçu (PreviewPanel) | +| US-D3..D6 | YB | TODO | 🟥 | Lier interface convertisseur -> compression | ## Fichiers à créer – Sprint 2 @@ -102,7 +102,7 @@ Objectif : Écriture du format `.pif` + finalisation convertisseur ### `src/vconverter/` (complément) | Nom du fichier | Rôle | US | |----------------|-------|----| -| `SavePanel.java` *(optionnel)* | Interface de sauvegarde `.pif` | US-U6 | +| `SavePanel.java` en option a voir | Interface de sauvegarde `.pif` | US-U6 | --- diff --git a/build/fr/iutfbleau/sae/Convertisseur.class b/build/fr/iutfbleau/sae/Convertisseur.class index fab0003e454a75fe5b05cc05ef2c51043968c6be..b8560cb4e2f38e9a9b589862781608628348beb3 100644 GIT binary patch literal 1024 zcmX^0Z`VEs1_l=fdoBhh24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00Sb_Nbc2JN&W{mjymw4|KW#8Um@#8myV#NrI!!~!k`E(T^U20jLUb_M|+20;cPm@2RXJo8FY(^HEW z8Q9Abb4pYF(-;}VG(0tZz~&&Uu;yS8VPs%2G%z&aW)Nc#XJ?S$VUT2yVr1Y2s|DNX zn^?fez+6yT!pLBufn)~6o7R{j$QD5raWKd*GB6t$8gMYkF)}b4f*1;n3`_=w91Kc~ z42%XG3@VHaOoj#^U#syjs559VG6)u@mN+No<>zH4C+37CCgr3uG8jNz0CO4CdR$!1 zFir+725oi*9UcZ<20fH$3a%_JNzG+sV9p15O%&pf%zXWTqRhOK;F6-$#9V6*1_MS0 zB^Mv>U>_InU>|RnU=S0^bMf{GPRTCL$xg}PVlZMbW@j+rVK8MdV`LBphaRd~j124r zAd_?Q7#T#Nz5vHXa7j^SUb;0XiC8c)$YCTAXu8NOE>0~iVq{=(&QD2YWZ?J7%uDqv z%}q)zf(8vsZenI0D5j$!UO_dSk%22XzqBYh)h!bgjzTD=>Ve$LpvYj(z{CIoObm>m zRL#K1V9CJ1Aj`nWz{tSBz^b*KfpH@P0|O(26$1kU8(5Hofs?_S!3L`I8UqUhD+2>V z-);u>$n6ZAKD!yXBDXW}`05BU{NKUADR|XM=5C&0(SOzhMTn2H5S_UbGRt9N?UIrNkMh0631_mYu FI{>$n?iBz4 delta 215 zcmZqRxXx^N>ff$?3=9nB469N`gy@ zQWJBnIT-jD8AMYGvs1FrF&BdXgCIMD5D$Yeg9syoFc$5M4D1CU!*cQ%8ALT87JywE zTvC*omu{^Y#?Bzd$RM6pq@P(@l9rT{npmn|oS3Q~mYG_fTExh};+&t7%E-X)lbM(5 zSDKrYS`?C)l#|NHz>=Gona9W=rV)+JR7M7_;QZ2}GjK9UGDty{sxpAI iGB9v%Vqh2I-NwL=P!5V51_o9J4zNaP1_lNu1{nZc%3n|b literal 0 HcmV?d00001 diff --git a/build/fr/iutfbleau/sae/util/Config.class b/build/fr/iutfbleau/sae/util/Config.class new file mode 100644 index 0000000000000000000000000000000000000000..704c71854e3517b96ab87675cc38433314564b9d GIT binary patch literal 693 zcmX^0Z`VEs1_l=fWiAFL24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00SP6iGJPId+^9tLg(9!3V4v?Be?(vq~KoYcfp{o=$_{nC=m9DV2fytK@8 zMh2-c&)`r;AJ1Ud(4crXS3lQ~AlLX1M^7IgS4IY=Xit!7d^`;NV56M<{lZ*>LOg@9 zs^)O^_lx&)^mS!q5b{AdGPtBDGcVnmk%8AaKd-nXF|Q;nF{d<@gF%FmK`GeL)!0Zu zSHU?yuPn8wB(u0UwX{efMLjb&F+H_dA;8m(k%1%3GZ<_x2ZJ~xg91!TSY~l)VooL& z4ZMy40rAfM0g*wT?j9i=3{s2?GDZeQrV58vDtLy5D5Rt+xaH@SBxdHNf!s0R}+^Mg}1U1_mYuVFpPCQ6#G7#J8N zLE#RjC6MGL86+8`k@zwUObkq*w86m0AjiPKpvb_;z{tSBz^b*KfpH@P0|O(2JOcv* zC>b#@a5Jzl@G@{PC@`==l{+%9Fo1w6>mII1W^Hfi1Yve literal 0 HcmV?d00001 diff --git a/build/fr/iutfbleau/sae/vconverter/CodeTablePanel.class b/build/fr/iutfbleau/sae/vconverter/CodeTablePanel.class new file mode 100644 index 0000000000000000000000000000000000000000..bac22c3827c865814b59cd5a5aed222b9ddf3dbd GIT binary patch literal 3753 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 literal 0 HcmV?d00001 diff --git a/build/fr/iutfbleau/sae/vconverter/ConverterWindow.class b/build/fr/iutfbleau/sae/vconverter/ConverterWindow.class new file mode 100644 index 0000000000000000000000000000000000000000..7f1b56ea7b8ddd7b687edc9b330ec45de62688ea GIT binary patch literal 3360 zcmX^0Z`VEs1_l>~-CPVz49x5dEIbUX3~Y=HLRpDri52?A<(YZu`d)5DiMgqa3~V-; zd6^}4j10^gnqiy_91NW73|u@6+zdR73<4kx`ZH5Ky#U-h^j10{Ar6r6EqCQ}m z%zXWTqRhOK;F6-$#9V8320lgxnY1GP%+ivyq@2{mQvKq@RQ=MD%p85^{JgZxbPfgq zMh08wqQff_OEUBG6jD+ZauOBNQu7Y4Dk(};uu=$ibTu|o&{c5G&nrtUD#i`WB9Es8RF2?B9IS3PEIWf&&*57FK1-nC{8U2 z$t=l9d3sq-*sFlaI|NED}*xTK~fmgbZ==j0cs z`WK`YfkTy%fkgwVR-1=Ghe4N-L9{rv#3w%)EFF}ZlUR~jmKu`J$RG|4oy77Iedqk# zg8aPHyb^1OJ^DNh1`LLb3_QiDB|)jhnN^8NIjJDCqcp?V8H^bjbn%6TCn&-Kic-rm zQ_BMq^HOuT7>pR0IT@rF%y<~g87vqX1i^8Ntb~z4--jeKt=So@7#Z~O>2WJcEi6sV zORfw7IUnj0ONdKsc^K>%>=_w^(=Zh=G8p1@3l?*&*%=%e8MN@Z#yLMF71<#U5Qn(% zFt{?fF*5KaqsTKd=-_n&s%h5j3?Art9O_?pP$}Te$RG;JEU*H=DZj!eu`<83gp0w8 z!536S_%Sj_pd^UAlElos)FNweYI0`?;9&@42x4U51f?dhRz?PCBn=Sbd=v8$(^HGA zL8&B!k%13nr#>Ws<>VJ}F$6P&fh-GWWMI?qgd}QrhDaWUD28Z82HxV-5~sxE?DV4i z(!3N#24N)Qo%3_@LB?`1#4^OOGsN>SBrqg0GDw0fKzOPsCAG*cF}WnasFIOEFu5o- zu_VO27*ZHgA%2AjGcw3Q9D`jG z$h+z2;qQ}}l$yiAkjcnkgjS>lc)BS(YM87LmRVeyn3Guy&YB7-sl^H@`FVMVSEd## za51DYWP^fAjGZBuk%1TFPjEoG<>!@fFyu2ba0Vyl6$hslWu|d4V-{HMyr(9Y1o&d|xj(8bWr$iNQ@6UXHq$FOxhOv;2b7bz72&{0eoK zQ(}=d7sG6ZIqVE`c^Kw_Y!bube5b@BMh1c6)RNG=%o5MMuTbhP@^KPf9U8B$+ZGOXZXSP5!n2$mM4B$lMY z3dqdVVlD;;hSfX_YZ%rtGKfHAofGr&^D>hYb3kQSF(ZQkG>L%Q3ciU2*5K?3X*yux zf>N0S!+IWu4IneQp=Rc%q!u$Wuz-wYWZ?J7%uDqv%}q)z0++aq4E)8ZC177b>l{V~ z!Q#{sm^&dA1VoibXw=YMyx|si1-nNhlc7 z;IKpU4sCU5hCzG=4`Zl5xPtRbi;`2_GC|e22(*O-Yp&>l5)FeQgA@Z30|Nsy0~4r{ zW?*1o0#%V<+LghLfq{XQff3Z0WME|2$iTpOnt_dhg@J+5Tx&Z6<0b}nA^vR)f?7i2 z+ZZIZHZjOC>uq9?W6|5jprpmNjX_O|aT|k{7RxpUJ+0jgMv>bYOtvzZYVBsQjNHy( zy_La6Yd3>KkK{&4;XwIJ~8++{ALJXl3LEWh42uy?1$8PI7%~|+7_t}`8MZL6LA9tbFfuSQ zFfedvZDFw4#;_b+M;QYkuHgLAqU2P! z%$!t41__uHl6iU{XEG=j0~I%3=E14j0}tn3=FJV+Zh-)GB7YO wGH@|4Fo3+uz`(}9!ob16$iU6O230NzR>6R*6ePvKz{9}Ez{9}6z{J1{09M97WdHyG literal 0 HcmV?d00001 diff --git a/build/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.class b/build/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..0386a82d11b13c6c4172dbe1a993022b18100be5 GIT binary patch literal 316 zcmX^0Z`VEs1_l=fel7+k24;2!79Ivx1~x_pp{&HR#0vf5^31$+eXoGTywn^<1~!|_ zyv!0iMh0dL%`kQb4n_vuv?Be?(vq~KoYcfp{o=$_{j%izyt34ylGGx7&)mfH)PSPY zvdq+Ss0l32`6;Q44E#Qsd8vM-xk;%-A&E&jsf-L9#i=D=^^6Rn8a^P)^>Y&Q()In5 zvQm>vtTn?J8MuP;ON)|I-7-Py#lVV@4c7x{Vo+pYXJBFg0VW1UkXINO88{gj7!(;8 z85kKD7+AHoGcaysU|?Wm;9_840Qs7MfuDheL6Cuwft!H`s$7zR0c;GCQZ}%DQ3gf^ IUa%w|07)f5LI3~& literal 0 HcmV?d00001 diff --git a/makefile b/makefile index 6d8bea3..3c959df 100644 --- a/makefile +++ b/makefile @@ -25,15 +25,18 @@ endif # Règle par défaut all: \ - $(BIN)/$(PKG_PATH)/Convertisseur.class + $(BIN)/$(PKG_PATH)/Convertisseur.class \ $(BIN)/$(PKG_PATH)/Viewer.class -# Compilation -$(BIN)/$(PKG_PATH)/Convertisseur.class: $(BIN) - $(JAVAC) -d $(BIN) $(SRC)/$(PKG_PATH)/Convertisseur.java - -$(BIN)/$(PKG_PATH)/Viewer.class: $(BIN) - $(JAVAC) -d $(BIN) $(SRC)/$(PKG_PATH)/Viewer.java +# Compilation des classes main +$(BIN)/$(PKG_PATH)/Convertisseur.class: $(BIN) \ + $(BIN)/$(PKG_PATH)/vconverter/ConverterWindow.class \ + $(SRC)/$(PKG_PATH)/Convertisseur.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/Convertisseur.java + +$(BIN)/$(PKG_PATH)/Viewer.class: $(BIN) \ + $(SRC)/$(PKG_PATH)/Viewer.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/Viewer.java # Dossiers $(BIN): @@ -42,12 +45,53 @@ $(BIN): $(DOC): mkdir -p $(DOC) +#Compilation de l'interface graphique je compile converterWindow +$(BIN)/$(PKG_PATH)/vconverter/ConverterWindow.class: $(BIN) \ + $(BIN)/$(PKG_PATH)/vconverter/ImagePreviewPanel.class \ + $(BIN)/$(PKG_PATH)/vconverter/FrequencyTablePanel.class \ + $(BIN)/$(PKG_PATH)/vconverter/CodeTablePanel.class \ + $(BIN)/$(PKG_PATH)/util/Config.class \ + $(SRC)/$(PKG_PATH)/vconverter/ConverterWindow.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/vconverter/ConverterWindow.java + +# ConverterWindow dépend des autres classes je les compile aussi +$(BIN)/$(PKG_PATH)/vconverter/ImagePreviewPanel.class: $(BIN) \ + $(SRC)/$(PKG_PATH)/vconverter/ImagePreviewPanel.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/vconverter/ImagePreviewPanel.java + +$(BIN)/$(PKG_PATH)/vconverter/FrequencyTablePanel.class: $(BIN) \ + $(SRC)/$(PKG_PATH)/vconverter/FrequencyTablePanel.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/vconverter/FrequencyTablePanel.java + +$(BIN)/$(PKG_PATH)/vconverter/CodeTablePanel.class: $(BIN) \ + $(SRC)/$(PKG_PATH)/vconverter/CodeTablePanel.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/vconverter/CodeTablePanel.java + + +#Compilation des classes util +$(BIN)/$(PKG_PATH)/util/Config.class: $(BIN) \ + $(SRC)/$(PKG_PATH)/util/Config.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/util/Config.java + +$(BIN)/$(PKG_PATH)/util/ByteUtils.class: $(BIN) \ + $(SRC)/$(PKG_PATH)/util/ByteUtils.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/util/ByteUtils.java + +$(BIN)/$(PKG_PATH)/util/BitInputStream.class: $(BIN) \ + $(SRC)/$(PKG_PATH)/util/BitInputStream.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/util/BitInputStream.java + +$(BIN)/$(PKG_PATH)/util/BitOutputStream.class: $(BIN) \ + $(SRC)/$(PKG_PATH)/util/BitOutputStream.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/util/BitOutputStream.java + + # Exécution run-conv: all - $(JAVA) -cp $(BIN)$(SEP)$(LIB)* $(MAIN_CONVERTER) + $(JAVA) -cp $(BIN) $(MAIN_CONVERTER) run-view: all - $(JAVA) -cp $(BIN)$(SEP)$(LIB)* $(MAIN_VIEWER) + $(JAVA) -cp $(BIN) $(MAIN_VIEWER) # Documentation doc: $(DOC) diff --git a/src/fr/iutfbleau/sae/Convertisseur.java b/src/fr/iutfbleau/sae/Convertisseur.java index 20251ec..5459ff4 100644 --- a/src/fr/iutfbleau/sae/Convertisseur.java +++ b/src/fr/iutfbleau/sae/Convertisseur.java @@ -1,7 +1,29 @@ package fr.iutfbleau.sae; +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import fr.iutfbleau.sae.vconverter.CodeTablePanel; +import fr.iutfbleau.sae.vconverter.ConverterWindow; public class Convertisseur { - public File convertion(String chemin, String nom) public static void main(String[] args) { + // Créer et stocker la référence à la fenêtre + ConverterWindow window = new ConverterWindow(); + + // Exemple d'utilisation pour les codes Huffman + Map codesRouge = new HashMap<>(); + codesRouge.put(255, "1010"); + codesRouge.put(128, "010"); + + Map codesVert = new HashMap<>(); + codesVert.put(255, "110"); + codesVert.put(128, "01"); + Map codesBleu = new HashMap<>(); + codesBleu.put(255, "0"); + codesBleu.put(128, "10"); + + // Appeler la méthode sur l'instance de la fenêtre + window.setCanonicalTable(codesRouge, codesVert, codesBleu); System.out.println("DLKSLDKSLKDSLKSLKSLDKSLDKLSdkslkdl"); } -} +} \ No newline at end of file diff --git a/src/fr/iutfbleau/sae/util/Config.java b/src/fr/iutfbleau/sae/util/Config.java new file mode 100644 index 0000000..ae91ab0 --- /dev/null +++ b/src/fr/iutfbleau/sae/util/Config.java @@ -0,0 +1,15 @@ +package fr.iutfbleau.sae.util; +public class Config { + public static final String CON_NAME = "SAE32 - Convertisseur d'images PIF"; + public static final String VIS_NAME = "SAE32 - Visualiseur d'images PIF"; + public static final int[] VISUALISEUR_FENETRE_TAILLE = {800, 600}; + public static final int[] CONVERTISSEUR_FENETRE_TAILLE = {800, 600}; + public static final String APP_COPYRIGHT = "2025 © IUT de Fontainebleau"; + public static final String APP_AUTHOR = "IUT de Fontainebleau"; + + + private Config() { + // je refuse l'instanciation + } + +} diff --git a/src/fr/iutfbleau/sae/vconverter/CodeTablePanel.java b/src/fr/iutfbleau/sae/vconverter/CodeTablePanel.java new file mode 100644 index 0000000..340a228 --- /dev/null +++ b/src/fr/iutfbleau/sae/vconverter/CodeTablePanel.java @@ -0,0 +1,110 @@ +package fr.iutfbleau.sae.vconverter; + +import javax.swing.*; +import java.awt.*; +import java.util.Map; + +/** + * Panneau d'affichage des codes Huffman et canoniques. + * Affiche les codes pour chaque composante de couleur (rouge, vert, bleu). + * @author Algassimou + */ +public class CodeTablePanel extends JPanel { + + // Zones de texte pour les codes Huffman + private JTextArea textHuffRouge, textHuffVert, textHuffBleu; + + // Zones de texte pour les codes canoniques + private JTextArea textCanonRouge, textCanonVert, textCanonBleu; + + /** + * Constructeur qui initialise l'interface utilisateur. + */ + public CodeTablePanel() { + setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15)); + + // Titre pour les codes Huffman + JLabel titreHuff = new JLabel("Codes Huffman"); + titreHuff.setFont(new Font("SansSerif", Font.BOLD, 16)); + add(titreHuff); + add(Box.createVerticalStrut(10)); + + // Création des zones de texte pour les codes Huffman + textHuffRouge = creerZoneTexte("Rouge"); + textHuffVert = creerZoneTexte("Vert"); + textHuffBleu = creerZoneTexte("Bleu"); + + // Séparateur + add(Box.createVerticalStrut(20)); + + // Titre pour les codes canoniques + JLabel titreCanon = new JLabel("Codes Canoniques"); + titreCanon.setFont(new Font("SansSerif", Font.BOLD, 16)); + add(titreCanon); + add(Box.createVerticalStrut(10)); + + // Création des zones de texte pour les codes canoniques + textCanonRouge = creerZoneTexte("Rouge (Canonique)"); + textCanonVert = creerZoneTexte("Vert (Canonique)"); + textCanonBleu = creerZoneTexte("Bleu (Canonique)"); + } + + /** + * Crée une zone de texte avec une étiquette. + * @param titre Le titre à afficher au-dessus de la zone de texte + * @return La zone de texte configurée + */ + private JTextArea creerZoneTexte(String titre) { + add(new JLabel(titre + ":")); + JTextArea zone = new JTextArea(8, 30); + zone.setEditable(false); + zone.setFont(new Font("Monospaced", Font.PLAIN, 12)); + JScrollPane scroll = new JScrollPane(zone); + scroll.setPreferredSize(new Dimension(300, 120)); + add(scroll); + add(Box.createVerticalStrut(10)); + return zone; + } + + /** + * Met à jour l'affichage des codes Huffman. + * @param rouge Les codes pour la composante rouge + * @param vert Les codes pour la composante verte + * @param bleu Les codes pour la composante bleue + */ + public void updateCodes(Map rouge, + Map vert, + Map bleu) { + mettreAJourZoneTexte(textHuffRouge, rouge); + mettreAJourZoneTexte(textHuffVert, vert); + mettreAJourZoneTexte(textHuffBleu, bleu); + } + + /** + * Met à jour l'affichage des codes canoniques. + * @param rouge Les codes pour la composante rouge + * @param vert Les codes pour la composante verte + * @param bleu Les codes pour la composante bleue + */ + public void updateCanonicalCodes(Map rouge, + Map vert, + Map bleu) { + mettreAJourZoneTexte(textCanonRouge, rouge); + mettreAJourZoneTexte(textCanonVert, vert); + mettreAJourZoneTexte(textCanonBleu, bleu); + } + + /** + * Met à jour le contenu d'une zone de texte avec les codes fournis. + * @param zone La zone de texte à mettre à jour + * @param codes Les codes à afficher + */ + private void mettreAJourZoneTexte(JTextArea zone, Map codes) { + StringBuilder sb = new StringBuilder(); + for (Map.Entry entry : codes.entrySet()) { + sb.append(String.format("%3d : %s%n", entry.getKey(), entry.getValue())); + } + zone.setText(sb.toString()); + } +} \ No newline at end of file diff --git a/src/fr/iutfbleau/sae/vconverter/ConverterWindow.java b/src/fr/iutfbleau/sae/vconverter/ConverterWindow.java index 6b44bf4..e5e77dc 100644 --- a/src/fr/iutfbleau/sae/vconverter/ConverterWindow.java +++ b/src/fr/iutfbleau/sae/vconverter/ConverterWindow.java @@ -1,49 +1,120 @@ package fr.iutfbleau.sae.vconverter; + +import javax.swing.*; +import java.awt.*; +import java.util.Map; + +import fr.iutfbleau.sae.util.Config; + /** * Fenêtre principale du convertisseur. * *

- * Cette classe représente la vue principale de l’application. - * Elle regroupe les différents panneaux graphiques utilisés - * pour afficher les résultats de la conversion d’une image. + * Cette classe correspond à la vue principale de l’application. + * Elle centralise l’affichage des informations liées à la conversion + * d’une image (aperçu, fréquences, codes). *

* * + *

+ * Elle sert de point d’entrée unique pour la partie graphique + *

*/ -public class ConverterWindow { - +public class ConverterWindow extends JFrame { private ImagePreviewPanel imagePreviewPanel; private FrequencyTablePanel frequencyTablePanel; private CodeTablePanel codeTablePanel; + + /** - * Met à jour l’aperçu de l’image affichée dans la fenêtre. + * Crée la fenêtre principale du convertisseur. * *

- * Cette méthode est appelée par le contrôleur après le chargement - * de l’image. L’image reçue est simplement transmise - * au panneau d’aperçu pour être affichée. + * Le constructeur initialise la fenêtre et met en place + * les différents panneaux graphiques utilisés pour l’affichage. + *

+ */ + + public ConverterWindow() { + + System.out.println("Création de la fenêtre : " + Config.CON_NAME); // debug + // Configuration de la fenetre + this.setTitle(Config.CON_NAME); + this.setSize(Config.CONVERTISSEUR_FENETRE_TAILLE[0], + Config.CONVERTISSEUR_FENETRE_TAILLE[1]); + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.setLocationRelativeTo(null); // Centre la fenêtre + this.setResizable(true); // on autorise le resize (plus moderne) + + + // Initialisation des panels + this.imagePreviewPanel = new ImagePreviewPanel(); + this.frequencyTablePanel = new FrequencyTablePanel(); + this.codeTablePanel = new CodeTablePanel(); + + // Je gere le panel principal + JPanel contentPanel = new JPanel(); + contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS)); + contentPanel.setBackground(new Color(255, 0, 0)); // rouge vif pour demo + contentPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15)); + + // Titre + JLabel header = new JLabel(" Convertisseur PIF – Visualisation des données "); + header.setFont(new Font("SansSerif", Font.BOLD, 18)); + header.setAlignmentX(Component.CENTER_ALIGNMENT); + contentPanel.add(header); + + contentPanel.add(Box.createRigidArea(new Dimension(0, 20))); // espace + + + // Ajout du panel d’aperçu + contentPanel.add(imagePreviewPanel); + contentPanel.add(Box.createRigidArea(new Dimension(0, 20))); + // Ajout du panel des fréquences + contentPanel.add(frequencyTablePanel); + contentPanel.add(Box.createRigidArea(new Dimension(0, 20))); + // Ajout panel des codes + contentPanel.add(codeTablePanel); + contentPanel.add(Box.createRigidArea(new Dimension(0, 20))); + // la section du scrollpane + JScrollPane scrollPane = new JScrollPane(contentPanel); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + scrollPane.getVerticalScrollBar().setUnitIncrement(16); // scroll plus adouci fluide + + this.add(scrollPane); + this.setVisible(true); // toi meme tu sais + } + + + + /** + * Met à jour l’image affichée dans la zone d’aperçu. + * + *

+ * Cette méthode est appelée lorsque l’image à convertir + * a été chargée. La fenêtre ne modifie pas l’image : + * elle la transmet simplement au panneau d’aperçu. *

* - * @param img image à afficher dans l’aperçu + * @param img image à afficher */ public void setImagePreview(Object img) { - // mise à jour du ImagePreviewPanel avec l’image img imagePreviewPanel.setImage(img); } /** - * Met à jour les tables de fréquences des composantes R, G et B. + * Met à jour l’affichage des tables de fréquences. * *

- * Cette méthode reçoit les tableaux de fréquences calculés - * par le contrôleur et les transmet au panneau chargé - * de les afficher. + * Les fréquences sont déjà calculées avant l’appel + * de cette méthode. La fenêtre se contente de demander + * au panneau dédié de rafraîchir son affichage. *

*/ public void setFrequencyTable() { - // mise à jour des fréquences dans le FrequencyTablePanel frequencyTablePanel.updateFrequencies(); } @@ -51,27 +122,29 @@ public class ConverterWindow { * Met à jour l’affichage des codes Huffman. * *

- * Les codes sont déjà calculés par le contrôleur. - * Cette méthode se contente de demander au panneau - * des codes de les afficher. + * Cette méthode ne génère aucun code. + * Elle permet uniquement d’afficher les codes + * qui ont été produits par la partie traitement. *

*/ - public void setHuffmanTable() { - // mise à jour des codes Huffman dans le CodeTablePanel - codeTablePanel.updateCodes(); + public void setHuffmanTable(Map codesRouge, + Map codesVert, + Map codesBleu) { + codeTablePanel.updateCanonicalCodes(codesRouge, codesVert, codesBleu); } /** * Met à jour l’affichage des codes canoniques. * *

- * Cette méthode est utilisée après la génération - * des codes canoniques (Sprint 2). - * Elle ne fait aucun calcul et se limite à l’affichage. + * Les codes canoniques sont transmis au panneau + * chargé de leur affichage. Aucune vérification + * ni transformation n’est effectuée ici. *

*/ - public void setCanonicalTable() { - // mise à jour des codes canoniques dans le CodeTablePanel - codeTablePanel.updateCanonicalCodes(); + public void setCanonicalTable(Map codesRouge, + Map codesVert, + Map codesBleu) { + codeTablePanel.updateCodes(codesRouge, codesVert, codesBleu); } } diff --git a/src/fr/iutfbleau/sae/vconverter/FrequencyTablePanel.java b/src/fr/iutfbleau/sae/vconverter/FrequencyTablePanel.java index f7b26e3..c5f902f 100644 --- a/src/fr/iutfbleau/sae/vconverter/FrequencyTablePanel.java +++ b/src/fr/iutfbleau/sae/vconverter/FrequencyTablePanel.java @@ -1,5 +1,13 @@ package fr.iutfbleau.sae.vconverter; -public class FrequencyTablePanel { - +import javax.swing.*; + +public class FrequencyTablePanel extends JPanel { + public FrequencyTablePanel() { + // constructeur vide pour l'instant + } + + public void updateFrequencies() { + // Implémentation à ajouter + } } diff --git a/src/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.java b/src/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.java new file mode 100644 index 0000000..404e111 --- /dev/null +++ b/src/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.java @@ -0,0 +1,22 @@ +package fr.iutfbleau.sae.vconverter; + + import javax.swing.JPanel; + + /** + * Le panneau d’aperçu de l’image. + * + *

+ * Ce panneau affiche un aperçu de l’image en cours de conversion. + *

+ */ + + +public class ImagePreviewPanel extends JPanel { + public ImagePreviewPanel() { + // constructeur vide pour l'instant + } + + public void setImage(Object img) { + // Implémentation à ajouter + } +} \ No newline at end of file