diff --git a/PlaningDeTavail.md b/PlaningDeTavail.md
deleted file mode 100644
index c2281f2..0000000
--- a/PlaningDeTavail.md
+++ /dev/null
@@ -1,387 +0,0 @@
-<<<<<<< HEAD
-# Sprint Planning – Projet PIF
-
-## Légende
-AD → Algassimou
-AA → Ayoub
-YB → Youness
-
-🟥 TODO = À faire
-🟨 DOING = En cours
-🟩 DONE = Terminé
-
-
-# ---------------------------------------
-# SPRINT 1 (13–20 décembre 2025)
-# ---------------------------------------
-Objectif : Mise en place des fondations techniques
-(image, binaire, Huffman, canoniques)
-
-| US | Assigné | Statut | | Description |
-|-------|---------|--------|----|----------------------------------------------------|
-| US-D1 | AD | DONE | 🟩 | Implémenter BitInputStream (lecture bit par bit) |
-| US-D2 | AD | DONE | 🟩 | Implémenter BitOutputStream (écriture bit par bit) |
-| US-D3 | AD | DONE | 🟩 | Générer les tables de fréquences RGB |
-| US-D4 | AD | DONE | 🟩 | Construire l’arbre Huffman |
-| US-D5 | AA | DONE | 🟩 | Générer les codes Huffman |
-| US-D6 | AA | DONE | 🟩 | Générer les codes canoniques |
-| US-U5 | YB | DONE | 🟩 | Chargement d’image via ImageIO |
-| US-D8 | YB | DONE | 🟩 | Structure RGBImage + Pixel |
-| US-P1 | AA | DONE | 🟩 | Interface simple d’affichage des fréquences |
-| US-P2 | AD | DONE | 🟩 | Interface simple d’affichage codes Huffman |
-| US-P3 | AA | DONE | 🟩 | Interface simple d’affichage codes canoniques |
-
-## Fichiers à créer – Sprint 1
-
-### `src/mimage/`
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `Pixel.java` | Représente un pixel (r, g, b) | US-D8 |
-| `RGBImage.java` | Matrice de pixels + utilitaires | US-D8, US-U5 |
-
-### `src/mhuffman/`
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `FrequencyTable.java` | Stocke les fréquences R/G/B | US-D3 |
-| `HuffmanNode.java` | Nœud d’arbre Huffman | US-D4 |
-| `HuffmanTree.java` | Construction arbre + génération des codes | US-D4, US-D5 |
-| `CanonicalCode.java` | Génération des codes canoniques | US-D6 |
-
-### `src/util/`
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `BitInputStream.java` | Lecture bit par bit | US-D1 |
-| `BitOutputStream.java` | Écriture bit par bit | US-D2 |
-| `ByteUtils.java` | Conversion int octets | US-D3 et plus |
-| `FileUtils.java` | Méthodes utilitaires fichiers | US-U5 (indirect) |
-
-### `src/vconverter/`
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `ConverterWindow.java` | Fenêtre du convertisseur | US-P1, US-P2, US-P3 |
-| `PreviewPanel.java` | Aperçu de l’image chargée | US-U5 |
-| `FrequencyTablePanel.java` | Affichage fréquences RGB | US-P1 |
-| `CodeTablePanel.java` | Affichage Huffman + canoniques | US-P2, US-P3 |
-
-### `src/` (racine)
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `ConverterController.java` | Contrôleur du convertisseur | US-U5, US-D3..D6, US-P1..P3 |
-| `Convertisseur.java` | Lancement du convertisseur | — |
----
-
-### Résultat attendu Sprint 1
-- Compression entièrement fonctionnelle
-- Import d’image opérationnel
-- GUI minimaliste affichant fréquences / Huffman / canoniques
-- Aucun fichier `.pif` encore écrit
-
-
-# ---------------------------------------
-# SPRINT 2 (20–27 décembre 2025)
-# ---------------------------------------
-Objectif : Écriture du format `.pif` + finalisation convertisseur
-
-| US | Assigné | Statut | | Description |
-|------------|---------|--------|-----|-------------|
-| US-D2 | AA | DONE | 🟩 | Vérifier BitOutputStream avec flux réel |
-| US-C5 | AD | DONE | 🟩 | Implémenter PIFWriter (header + tables + pixels compressés) |
-| US-U6 | AD | DONE | 🟩 | Exporter une image en `.pif` |
-| US-P1 | AA | DONE | 🟩 | Finaliser affichage des fréquences |
-| US-P2 | AA | DONE | 🟩 | Finaliser affichage codes Huffman |
-| US-P3 | AA | DONE | 🟩 | Finaliser affichage codes canoniques |
-| US-U7 | AD | DONE | 🟩 | Implémenter l’aperçu (PreviewPanel) |
-
-## Fichiers à créer – Sprint 2
-
-### `src/mpif/`
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `PIFWriter.java` | Écriture du fichier `.pif` | US-C5, US-U6 |
-
-### `src/vconverter/` (complément)
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `SavePanel.java` en option a voir | Interface de sauvegarde `.pif` | US-U6 |
-
-
----
-
-### Résultat attendu Sprint 2
-- `.pif` généré correctement
-- Convertisseur fonctionnel à 80 %
-- UI complète pour la consultation des tables
-- Aperçu image fonctionnel
-
-
-# ---------------------------------------
-# SPRINT 3 (27 décembre 2025 – 3 janvier 2026)
-# ---------------------------------------
-Objectif : Lecture du fichier `.pif` + visualisateur opérationnel
-
-| US | Assigné | Statut | | Description |
-|----------|---------|--------|-----|-------------|
-| US-D7 | AD | DONE | 🟩 | Reconstruire les codes canoniques depuis fichier |
-| US-D8 | AD | DONE | 🟩 | Décoder pixels (implémenter PIFReader) |
-| US-U1 | YB | TODO | 🟥 | Ouvrir `.pif` via argument ou JFileChooser |
-| US-U2 | AA | TODO | 🟥 | Afficher l’image dans une fenêtre |
-| US-U3 | AA | TODO | 🟥 | Centrer l’image si elle est petite |
-| US-U4 | AD | TODO | 🟥 | Déplacement de l’image à la souris |
-| US-P6 | AA | TODO | 🟥 | Préparer diagrammes UML |
-
-## Fichiers à créer – Sprint 3
-
-### `src/mpif/`
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `PIFReader.java` | Lecture et décodage du `.pif` | US-D7, US-D8 |
-
-### `src/vviewer/`
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `ViewerWindow.java` | Fenêtre visualisation | US-U2 |
-| `ImagePanel.java` | Affichage + déplacement image | US-U2, US-U3, US-U4 |
-
-### `src/`
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `ViewerController.java` | Contrôle du visualisateur | US-U1..U4 |
-| `Viewer.java` | Programme principal du visualisateur | US-U1 |
-
----
-
-### Résultat attendu Sprint 3
-- Visualisateur 100 % fonctionnel
-- Lecture complète du format `.pif`
-- Image affichée, centrée, déplaçable
-- UML structurel prêt pour rapport
-
-
-# ---------------------------------------
-# SPRINT 4 (3–10 janvier 2026)
-# ---------------------------------------
-Objectif : Finalisation complète + livrable final
-
-| US | Assigné | Statut | | Description |
-|------------|---------|--------|-----|-------------|
-| US-P5 | AD | TODO | 🟥 | Javadoc complète |
-| US-P7 | AD | TODO | 🟥 | Makefile (compilation + jar + exécution) |
-| US-P6 | AA | TODO | 🟥 | Finalisation des diagrammes UML |
-| Tests | YB | TODO | 🟥 | Tests convertisseur + visualisateur |
-| Rapport | AD/AA/YB| TODO | 🟥 | Rédaction rapport complet |
-| Livraison | AD/AA/YB| TODO | 🟥 | Vérification dépôt Gitea + JAR exécutables |
-
-## Fichiers à créer – Sprint 4
-
-### Racine creee tout au long
-| Nom du fichier | Rôle |
-|----------------|-------|
-| `Makefile` | Compilation + génération `.jar` |
-
-### `/doc`
-| Nom du fichier | Rôle |
-|----------------|-------|
-| `rapport.pdf` | Livrable final |
-| `UML/___.plantuml` | Sources de diagrammes |
-
----
-
-### Résultat attendu Sprint 4
-- Rapport PDF validé
-- Diagrammes UML terminés
-- Makefile opérationnel
-- Projet soumis proprement sur Gitea
-=======
-# Sprint Planning – Projet PIF
-
-## Légende
-AD → Algassimou
-AA → Ayoub
-YB → Youness
-
-🟥 TODO = À faire
-🟨 DOING = En cours
-🟩 DONE = Terminé
-
-
-# ---------------------------------------
-# SPRINT 1 (13–20 décembre 2025)
-# ---------------------------------------
-Objectif : Mise en place des fondations techniques
-(image, binaire, Huffman, canoniques)
-
-| US | Assigné | Statut | | Description |
-|-------|---------|--------|----|----------------------------------------------------|
-| US-D1 | AD | DONE | 🟩 | Implémenter BitInputStream (lecture bit par bit) |
-| US-D2 | AD | DONE | 🟩 | Implémenter BitOutputStream (écriture bit par bit) |
-| US-D3 | AD | DONE | 🟩 | Générer les tables de fréquences RGB |
-| US-D4 | AD | DONE | 🟩 | Construire l’arbre Huffman |
-| US-D5 | AA | DONE | 🟩 | Générer les codes Huffman |
-| US-D6 | AA | DONE | 🟩 | Générer les codes canoniques |
-| US-U5 | YB | DONE | 🟩 | Chargement d’image via ImageIO |
-| US-D8 | YB | DONE | 🟩 | Structure RGBImage + Pixel |
-| US-P1 | AA | DONE | 🟩 | Interface simple d’affichage des fréquences |
-| US-P2 | AD | DONE | 🟩 | Interface simple d’affichage codes Huffman |
-| US-P3 | AA | DONE | 🟩 | Interface simple d’affichage codes canoniques |
-
-## Fichiers à créer – Sprint 1
-
-### `src/mimage/`
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `Pixel.java` | Représente un pixel (r, g, b) | US-D8 |
-| `RGBImage.java` | Matrice de pixels + utilitaires | US-D8, US-U5 |
-
-### `src/mhuffman/`
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `FrequencyTable.java` | Stocke les fréquences R/G/B | US-D3 |
-| `HuffmanNode.java` | Nœud d’arbre Huffman | US-D4 |
-| `HuffmanTree.java` | Construction arbre + génération des codes | US-D4, US-D5 |
-| `CanonicalCode.java` | Génération des codes canoniques | US-D6 |
-
-### `src/util/`
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `BitInputStream.java` | Lecture bit par bit | US-D1 |
-| `BitOutputStream.java` | Écriture bit par bit | US-D2 |
-| `ByteUtils.java` | Conversion int octets | US-D3 et plus |
-| `FileUtils.java` | Méthodes utilitaires fichiers | US-U5 (indirect) |
-
-### `src/vconverter/`
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `ConverterWindow.java` | Fenêtre du convertisseur | US-P1, US-P2, US-P3 |
-| `PreviewPanel.java` | Aperçu de l’image chargée | US-U5 |
-| `FrequencyTablePanel.java` | Affichage fréquences RGB | US-P1 |
-| `CodeTablePanel.java` | Affichage Huffman + canoniques | US-P2, US-P3 |
-
-### `src/` (racine)
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `ConverterController.java` | Contrôleur du convertisseur | US-U5, US-D3..D6, US-P1..P3 |
-| `Convertisseur.java` | Lancement du convertisseur | — |
----
-
-### Résultat attendu Sprint 1
-- Compression entièrement fonctionnelle
-- Import d’image opérationnel
-- GUI minimaliste affichant fréquences / Huffman / canoniques
-- Aucun fichier `.pif` encore écrit
-
-
-# ---------------------------------------
-# SPRINT 2 (20–27 décembre 2025)
-# ---------------------------------------
-Objectif : Écriture du format `.pif` + finalisation convertisseur
-
-| US | Assigné | Statut | | Description |
-|------------|---------|--------|-----|-------------|
-| US-D2 | AA | DONE | 🟩 | Vérifier BitOutputStream avec flux réel |
-| US-C5 | AD | DONE | 🟩 | Implémenter PIFWriter (header + tables + pixels compressés) |
-| US-U6 | AD | DONE | 🟩 | Exporter une image en `.pif` |
-| US-P1 | AA | DONE | 🟩 | Finaliser affichage des fréquences |
-| US-P2 | AA | DONE | 🟩 | Finaliser affichage codes Huffman |
-| US-P3 | AA | DONE | 🟩 | Finaliser affichage codes canoniques |
-| US-U7 | AD | DONE | 🟩 | Implémenter l’aperçu (PreviewPanel) |
-
-## Fichiers à créer – Sprint 2
-
-### `src/mpif/`
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `PIFWriter.java` | Écriture du fichier `.pif` | US-C5, US-U6 |
-
-### `src/vconverter/` (complément)
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `SavePanel.java` en option a voir | Interface de sauvegarde `.pif` | US-U6 |
-
-
----
-
-### Résultat attendu Sprint 2
-- `.pif` généré correctement
-- Convertisseur fonctionnel à 80 %
-- UI complète pour la consultation des tables
-- Aperçu image fonctionnel
-
-
-# ---------------------------------------
-# SPRINT 3 (27 décembre 2025 – 3 janvier 2026)
-# ---------------------------------------
-Objectif : Lecture du fichier `.pif` + visualisateur opérationnel
-
-| US | Assigné | Statut | | Description |
-|----------|---------|--------|-----|-------------|
-| US-D7 | AD | DONE | 🟩 | Reconstruire les codes canoniques depuis fichier |
-| US-D8 | AD | DONE | 🟩 | Décoder pixels (implémenter PIFReader) |
-| US-U1 | YB | WP | 🟨 | Ouvrir `.pif` via argument ou JFileChooser |
-| US-U2 | AA | TODO | 🟥 | Afficher l’image dans une fenêtre |
-| US-U3 | AA | TODO | 🟥 | Centrer l’image si elle est petite |
-| US-U4 | AD | TODO | 🟥 | Déplacement de l’image à la souris |
-| US-P6 | AA | TODO | 🟥 | Préparer diagrammes UML |
-
-## Fichiers à créer – Sprint 3
-
-### `src/mpif/`
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `PIFReader.java` | Lecture et décodage du `.pif` | US-D7, US-D8 |
-
-### `src/vviewer/`
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `ViewerWindow.java` | Fenêtre visualisation | US-U2 |
-| `ImagePanel.java` | Affichage + déplacement image | US-U2, US-U3, US-U4 |
-
-### `src/`
-| Nom du fichier | Rôle | US |
-|----------------|-------|----|
-| `ViewerController.java` | Contrôle du visualisateur | US-U1..U4 |
-| `Viewer.java` | Programme principal du visualisateur | US-U1 |
-
----
-
-### Résultat attendu Sprint 3
-- Visualisateur 100 % fonctionnel
-- Lecture complète du format `.pif`
-- Image affichée, centrée, déplaçable
-- UML structurel prêt pour rapport
-
-
-# ---------------------------------------
-# SPRINT 4 (3–10 janvier 2026)
-# ---------------------------------------
-Objectif : Finalisation complète + livrable final
-
-| US | Assigné | Statut | | Description |
-|------------|---------|--------|-----|-------------|
-| US-P5 | AD | TODO | 🟥 | Javadoc complète |
-| US-P7 | AD | TODO | 🟥 | Makefile (compilation + jar + exécution) |
-| US-P6 | AA | TODO | 🟥 | Finalisation des diagrammes UML |
-| Tests | YB | TODO | 🟥 | Tests convertisseur + visualisateur |
-| Rapport | AD/AA/YB| TODO | 🟥 | Rédaction rapport complet |
-| Livraison | AD/AA/YB| TODO | 🟥 | Vérification dépôt Gitea + JAR exécutables |
-
-## Fichiers à créer – Sprint 4
-
-### Racine creee tout au long
-| Nom du fichier | Rôle |
-|----------------|-------|
-| `Makefile` | Compilation + génération `.jar` |
-
-### `/doc`
-| Nom du fichier | Rôle |
-|----------------|-------|
-| `rapport.pdf` | Livrable final |
-| `UML/___.plantuml` | Sources de diagrammes |
-
----
-
-### Résultat attendu Sprint 4
-- Rapport PDF validé
-- Diagrammes UML terminés
-- Makefile opérationnel
-- Projet soumis proprement sur Gitea
->>>>>>> 40f71dddd52fc07edc1d47d48d56fd65a2a79fe3
diff --git a/ProductBacklog.MD b/ProductBacklog.MD
deleted file mode 100644
index 7e78c61..0000000
--- a/ProductBacklog.MD
+++ /dev/null
@@ -1,90 +0,0 @@
-# PRODUCT BACKLOG — Projet PIF
-
-
-# 1. US UTILISATEUR
-Ce sont les besoins réels d’un utilisateur final qui voudrait simplement visualiser ou convertir une image.
-
----
-
-### **US-U1 — Ouvrir un fichier PIF**
-En tant qu’utilisateur, je veux pouvoir ouvrir un fichier `.pif` via un argument ou un sélecteur de fichiers, afin d’afficher l’image.
-
-### **US-U2 — Afficher l’image dans une fenêtre**
-En tant qu’utilisateur, je veux voir l’image affichée dans une fenêtre redimensionnable.
-
-### **US-U3 — Centrage automatique**
-En tant qu’utilisateur, je veux que l’image soit centrée si elle est plus petite que la fenêtre, pour une meilleure visibilité.
-
-### **US-U4 — Déplacement de l’image**
-En tant qu’utilisateur, je veux pouvoir déplacer l’image à la souris si elle dépasse la taille de la fenêtre.
-
-### **US-U5 — Charger une image RGB (PNG/JPEG)**
-En tant qu’utilisateur, je veux charger une image standard afin de la convertir en `.pif`.
-
-### **US-U6 — Exporter une image au format PIF**
-En tant qu’utilisateur, je veux enregistrer l’image sous format `.pif`.
-
-### **US-U7 — Aperçu de l’image avant conversion**
-En tant qu’utilisateur, je veux voir une miniature de l’image chargée.
-
----
-
-# 2. US DÉVELOPPEUR
-Ce sont les besoins techniques indispensables au fonctionnement interne du format PIF.
-
----
-
-### **US-D1 — Lire des bits depuis un flux**
-Le système doit permettre la lecture bit par bit depuis un fichier PIF.
-
-### **US-D2 — Écrire des bits dans un fichier**
-Le système doit permettre l’écriture de bits pour générer un fichier PIF.
-
-### **US-D3 — Construire les tables de fréquences RGB**
-Le système doit analyser l’image pour obtenir les fréquences des valeurs R, G, B.
-
-### **US-D4 — Construire un arbre de Huffman**
-Le système doit créer un arbre à partir des fréquences d’une composante.
-
-### **US-D5 — Générer les codes Huffman**
-Le système doit produire les codes initiaux à partir de l’arbre.
-
-### **US-D6 — Générer les codes canoniques**
-Le système doit transformer les codes Huffman en codes canoniques.
-
-### **US-D7 — Reconstruire les codes canoniques en lecture**
-Le système doit pouvoir reconstruire les codes à partir des longueurs contenues dans le fichier .pif.
-
-### **US-D8 — Décoder un fichier PIF**
-Le système doit pouvoir reconstituer l’image RGB à partir des données compressées.
-
----
-
-# 3. US PROFESSEUR (PEDAGOGIQUE)
-Ces fonctionnalités n’ont **aucune utilité pour un utilisateur réel**, mais sont demandées par le professeur pour vérifier le bon fonctionnement de notre projet.
-
----
-
-### **US-P1 — Affichage des tables de fréquences**
-En tant que professeur, je veux consulter la table de fréquences R, G et B pour vérifier que le calcul est correct.
-
-### **US-P2 — Affichage des codes Huffman**
-En tant que professeur, je veux voir les codes Huffman générés afin de valider votre algorithme.
-
-### **US-P3 — Affichage des codes canoniques**
-En tant que professeur, je veux visualiser les codes canoniques afin d’évaluer votre compréhension de leur construction.
-
-### **US-P4 — Affichage de l’arbre Huffman (optionnel)**
-En tant que professeur, je veux pouvoir inspecter la structure de l’arbre pour vérifier votre implémentation.
-
-### **US-P5 — Documentation Javadoc pour chaque classe**
-En tant que professeur, je veux avoir une documentation claire auto-générable.
-
-### **US-P6 — Diagrammes UML dans le rapport**
-En tant que professeur, je veux retrouver un diagramme de classes et un diagramme d’objets dans le rapport.
-
-### **US-P7 — Makefile complet**
-En tant que professeur, je veux pouvoir compiler les deux programmes en .jar exécutables avec un Makefile clair.
-
-
-
diff --git a/temp/2026png.png b/asset/2026png.png
similarity index 100%
rename from temp/2026png.png
rename to asset/2026png.png
diff --git a/temp/bob.jpg b/asset/bob.jpg
similarity index 100%
rename from temp/bob.jpg
rename to asset/bob.jpg
diff --git a/temp/bob.pif b/asset/bob.pif
similarity index 93%
rename from temp/bob.pif
rename to asset/bob.pif
index 4bd454b..678ad86 100644
Binary files a/temp/bob.pif and b/asset/bob.pif differ
diff --git a/temp/hommePommeJPG.jpg b/asset/hommePommeJPG.jpg
similarity index 100%
rename from temp/hommePommeJPG.jpg
rename to asset/hommePommeJPG.jpg
diff --git a/asset/rotsnake.png b/asset/rotsnake.png
new file mode 100644
index 0000000..6047d6a
Binary files /dev/null and b/asset/rotsnake.png differ
diff --git a/temp/test1.jpg b/asset/test1.jpg
similarity index 100%
rename from temp/test1.jpg
rename to asset/test1.jpg
diff --git a/temp/test_checkerboard_256bmp.bmp b/asset/test_checkerboard_256bmp.bmp
similarity index 100%
rename from temp/test_checkerboard_256bmp.bmp
rename to asset/test_checkerboard_256bmp.bmp
diff --git a/docjava/allclasses-index.html b/docjava/allclasses-index.html
new file mode 100644
index 0000000..921be79
--- /dev/null
+++ b/docjava/allclasses-index.html
@@ -0,0 +1,172 @@
+
+
+
+
+All Classes and Interfaces
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
Classes
+
+
+
+
+
+
Décorateur de flux permettant la lecture binaire à granularité du bit.
+
+
+
+
Décorateur de flux permettant l'écriture binaire à granularité du bit.
+
+
+
+
Classe pour generer des codes canoniques de Huffman.
+
+
+
+
Panneau d'affichage des codes Huffman et canoniques.
+
+
+
+
Comparateur utilisé lors de la génération des codes canoniques.
+
+
+
+
Comparateur utilisé pendant la reconstruction des codes canoniques.
+
+
+
+
Comparateur utilisé pour trier les nœuds de l'arbre de Huffman.
+
+
+
+
Controleur pour la conversion d'images au format PIF.
+
+
+
+
Fenêtre principale du convertisseur.
+
+
+
+
Point d'entree principal du programme de conversion d'images au format PIF.
+
+
+
+
Représente un nœud utilisé pour décoder les données dans un arbre binaire.
+
+
+
+
+
+
Classe qui calcule les fréquences des valeurs de couleur dans une image RGB.
+
+
+
+
Panneau qui affiche les fréquences des composantes rouge, verte et bleue.
+
+
+
+
+
+
Représente un nœud de l'arbre de Huffman.
+
+
+
+
Cette classe construit un arbre de Huffman à partir d'un tableau
+ de fréquences.
+
+
+
+
Panneau d'aperçu de l'image.
+
+
+
+
Cette classe permet de lire un fichier .pif et de reconstruire l'image d'origine.
+
+
+
+
Cette classe permet d'écrire une image au format PIF.
+
+
+
+
Cette classe représente un pixel composé de trois valeurs :
+ rouge, vert et bleu.
+
+
+
+
Cette classe représente une image composée de pixels RGB.
+
+
+
+
Thread pour sauvegarder un fichier PIF en arriere-plan.
+
+
+
+
Classe principale qui lance l'application de visualisation d'images PIF.
+
+
+
+
Controleur du visualiseur d'images PIF.
+
+
+
+
Panneau personnalise pour afficher l'image.
+
+
+
+
Fenetre principale du visualiseur d'images PIF.
+
+
+
+
+
+
+
diff --git a/docjava/allpackages-index.html b/docjava/allpackages-index.html
new file mode 100644
index 0000000..cd92655
--- /dev/null
+++ b/docjava/allpackages-index.html
@@ -0,0 +1,70 @@
+
+
+
+
+All Packages
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+Package Summary
+
+
+
+
+
diff --git a/docjava/element-list b/docjava/element-list
new file mode 100644
index 0000000..efdf7cc
--- /dev/null
+++ b/docjava/element-list
@@ -0,0 +1,3 @@
+fr.iutfbleau.sae
+fr.iutfbleau.sae.mhuffman
+fr.iutfbleau.sae.mpif
diff --git a/docjava/fr/iutfbleau/sae/CodeTablePanel.html b/docjava/fr/iutfbleau/sae/CodeTablePanel.html
new file mode 100644
index 0000000..c8c4e5c
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/CodeTablePanel.html
@@ -0,0 +1,282 @@
+
+
+
+
+CodeTablePanel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Nested Class Summary
+Field Summary
+Constructor Summary
+Method Summary
+Constructor Details
+
+CodeTablePanel()
+
+
+Method Details
+
+updateCodes(Map, Map, Map)
+updateCanonicalCodes(Map, Map, Map)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Nested Class Summary
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
Constructeur qui initialise l'interface utilisateur.
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
void
+
+
+
Met à jour l'affichage des codes canoniques.
+
+
void
+
+
+
Met à jour l'affichage des codes Huffman.
+
+
+
+
+
+
+
Methods inherited from class javax.swing.JComponent
+
addAncestorListener , addNotify , addVetoableChangeListener , computeVisibleRect , contains , createToolTip , disable , enable , firePropertyChange , firePropertyChange , firePropertyChange , fireVetoableChange , getActionForKeyStroke , getActionMap , getAlignmentX , getAlignmentY , getAncestorListeners , getAutoscrolls , getBaseline , getBaselineResizeBehavior , getBorder , getBounds , getClientProperty , getComponentGraphics , getComponentPopupMenu , getConditionForKeyStroke , getDebugGraphicsOptions , getDefaultLocale , getFontMetrics , getGraphics , getHeight , getInheritsPopupMenu , getInputMap , getInputMap , getInputVerifier , getInsets , getInsets , getListeners , getLocation , getMaximumSize , getMinimumSize , getNextFocusableComponent , getPopupLocation , getPreferredSize , getRegisteredKeyStrokes , getRootPane , getSize , getToolTipLocation , getToolTipText , getToolTipText , getTopLevelAncestor , getTransferHandler , getVerifyInputWhenFocusTarget , getVetoableChangeListeners , getVisibleRect , getWidth , getX , getY , grabFocus , hide , isDoubleBuffered , isLightweightComponent , isManagingFocus , isOpaque , isOptimizedDrawingEnabled , isPaintingForPrint , isPaintingOrigin , isPaintingTile , isRequestFocusEnabled , isValidateRoot , paint , paintBorder , paintChildren , paintComponent , paintImmediately , paintImmediately , print , printAll , printBorder , printChildren , printComponent , processComponentKeyEvent , processKeyBinding , processKeyEvent , processMouseEvent , processMouseMotionEvent , putClientProperty , registerKeyboardAction , registerKeyboardAction , removeAncestorListener , removeNotify , removeVetoableChangeListener , repaint , repaint , requestDefaultFocus , requestFocus , requestFocus , requestFocusInWindow , requestFocusInWindow , resetKeyboardActions , reshape , revalidate , scrollRectToVisible , setActionMap , setAlignmentX , setAlignmentY , setAutoscrolls , setBackground , setBorder , setComponentPopupMenu , setDebugGraphicsOptions , setDefaultLocale , setDoubleBuffered , setEnabled , setFocusTraversalKeys , setFont , setForeground , setInheritsPopupMenu , setInputMap , setInputVerifier , setMaximumSize , setMinimumSize , setNextFocusableComponent , setOpaque , setPreferredSize , setRequestFocusEnabled , setToolTipText , setTransferHandler , setUI , setVerifyInputWhenFocusTarget , setVisible , unregisterKeyboardAction , update
+
+
Methods inherited from class java.awt.Container
+
add , add , add , add , add , addContainerListener , addImpl , addPropertyChangeListener , addPropertyChangeListener , applyComponentOrientation , areFocusTraversalKeysSet , countComponents , deliverEvent , doLayout , findComponentAt , findComponentAt , getComponent , getComponentAt , getComponentAt , getComponentCount , getComponents , getComponentZOrder , getContainerListeners , getFocusTraversalKeys , getFocusTraversalPolicy , getLayout , getMousePosition , insets , invalidate , isAncestorOf , isFocusCycleRoot , isFocusCycleRoot , isFocusTraversalPolicyProvider , isFocusTraversalPolicySet , layout , list , list , locate , minimumSize , paintComponents , preferredSize , printComponents , processContainerEvent , processEvent , remove , remove , removeAll , removeContainerListener , setComponentZOrder , setFocusCycleRoot , setFocusTraversalPolicy , setFocusTraversalPolicyProvider , setLayout , transferFocusDownCycle , validate , validateTree
+
+
Methods inherited from class java.awt.Component
+
action , add , addComponentListener , addFocusListener , addHierarchyBoundsListener , addHierarchyListener , addInputMethodListener , addKeyListener , addMouseListener , addMouseMotionListener , addMouseWheelListener , bounds , checkImage , checkImage , coalesceEvents , contains , createImage , createImage , createVolatileImage , createVolatileImage , disableEvents , dispatchEvent , enable , enableEvents , enableInputMethods , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , getBackground , getBounds , getColorModel , getComponentListeners , getComponentOrientation , getCursor , getDropTarget , getFocusCycleRootAncestor , getFocusListeners , getFocusTraversalKeysEnabled , getFont , getForeground , getGraphicsConfiguration , getHierarchyBoundsListeners , getHierarchyListeners , getIgnoreRepaint , getInputContext , getInputMethodListeners , getInputMethodRequests , getKeyListeners , getLocale , getLocation , getLocationOnScreen , getMouseListeners , getMouseMotionListeners , getMousePosition , getMouseWheelListeners , getName , getParent , getPropertyChangeListeners , getPropertyChangeListeners , getSize , getToolkit , getTreeLock , gotFocus , handleEvent , hasFocus , imageUpdate , inside , isBackgroundSet , isCursorSet , isDisplayable , isEnabled , isFocusable , isFocusOwner , isFocusTraversable , isFontSet , isForegroundSet , isLightweight , isMaximumSizeSet , isMinimumSizeSet , isPreferredSizeSet , isShowing , isValid , isVisible , keyDown , keyUp , list , list , list , location , lostFocus , mouseDown , mouseDrag , mouseEnter , mouseExit , mouseMove , mouseUp , move , nextFocus , paintAll , postEvent , prepareImage , prepareImage , processComponentEvent , processFocusEvent , processHierarchyBoundsEvent , processHierarchyEvent , processInputMethodEvent , processMouseWheelEvent , remove , removeComponentListener , removeFocusListener , removeHierarchyBoundsListener , removeHierarchyListener , removeInputMethodListener , removeKeyListener , removeMouseListener , removeMouseMotionListener , removeMouseWheelListener , removePropertyChangeListener , removePropertyChangeListener , repaint , repaint , repaint , requestFocus , requestFocus , requestFocusInWindow , resize , resize , setBounds , setBounds , setComponentOrientation , setCursor , setDropTarget , setFocusable , setFocusTraversalKeysEnabled , setIgnoreRepaint , setLocale , setLocation , setLocation , setMixingCutoutShape , setName , setSize , setSize , show , show , size , toString , transferFocus , transferFocusBackward , transferFocusUpCycle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Method Details
+
+
+
+
+
+
+updateCanonicalCodes
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/ConverterController.html b/docjava/fr/iutfbleau/sae/ConverterController.html
new file mode 100644
index 0000000..c6221ae
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/ConverterController.html
@@ -0,0 +1,328 @@
+
+
+
+
+ConverterController
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+ConverterController(ConverterWindow, String, String)
+
+
+Method Details
+
+loadImage(File)
+computeFrequencies()
+computeHuffman()
+computeCanonical()
+saveAsPIF(String)
+saveViaBtn()
+conversionProcess()
+getImage()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
Construit un nouveau controleur de conversion.
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
void
+
+
+
Genere les codes canoniques a partir des codes de Huffman.
+
+
void
+
+
+
Calcule les frequences d'apparition de chaque valeur RGB dans l'image.
+
+
void
+
+
+
Genere les arbres de Huffman pour chaque composante RGB.
+
+
void
+
+
+
Lance le processus complet de conversion d'une image au format PIF.
+
+
+
+
+
Retourne l'image actuellement chargee.
+
+
void
+
+
+
Charge une image depuis un fichier et la convertit en RGBImage.
+
+
void
+
+
+
Sauvegarde l'image au format PIF.
+
+
void
+
+
+
Gere la sauvegarde via le bouton de l'interface.
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
+
+
+
+Method Details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/ConverterWindow.html b/docjava/fr/iutfbleau/sae/ConverterWindow.html
new file mode 100644
index 0000000..1f50067
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/ConverterWindow.html
@@ -0,0 +1,344 @@
+
+
+
+
+ConverterWindow
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Nested Class Summary
+Field Summary
+Constructor Summary
+Method Summary
+Constructor Details
+
+ConverterWindow()
+
+
+Method Details
+
+setImagePreview(BufferedImage)
+setFrequencyTable(int[], int[], int[])
+setHuffmanTable(Map, Map, Map)
+setCanonicalTable(Map, Map, Map)
+addSaveButton(ConverterController)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Nested Class Summary
+
+
+
+
+
+
+
+
+
+
+Field Summary
+
+
+
Fields inherited from class java.awt.Frame
+
CROSSHAIR_CURSOR , DEFAULT_CURSOR , E_RESIZE_CURSOR , HAND_CURSOR , ICONIFIED , MAXIMIZED_BOTH , MAXIMIZED_HORIZ , MAXIMIZED_VERT , MOVE_CURSOR , N_RESIZE_CURSOR , NE_RESIZE_CURSOR , NORMAL , NW_RESIZE_CURSOR , S_RESIZE_CURSOR , SE_RESIZE_CURSOR , SW_RESIZE_CURSOR , TEXT_CURSOR , W_RESIZE_CURSOR , WAIT_CURSOR
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
Constructeur de la fenêtre du convertisseur.
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
void
+
+
+
Ajoute un bouton permettant d'exporter l'image en .pif.
+
+
void
+
+
+
Met à jour l'affichage des codes canoniques.
+
+
void
+
+
+
Met à jour l'affichage des fréquences des trois composantes.
+
+
void
+
+
+
Met à jour l'affichage des codes Huffman.
+
+
void
+
+
+
Affiche l'image chargée dans le panneau d'aperçu.
+
+
+
+
+
+
Methods inherited from class javax.swing.JFrame
+
addImpl , createRootPane , frameInit , getAccessibleContext , getContentPane , getDefaultCloseOperation , getGlassPane , getGraphics , getJMenuBar , getLayeredPane , getRootPane , getTransferHandler , isDefaultLookAndFeelDecorated , isRootPaneCheckingEnabled , paramString , processWindowEvent , remove , repaint , setContentPane , setDefaultCloseOperation , setDefaultLookAndFeelDecorated , setGlassPane , setIconImage , setJMenuBar , setLayeredPane , setLayout , setRootPane , setRootPaneCheckingEnabled , setTransferHandler , update
+
+
Methods inherited from class java.awt.Frame
+
addNotify , getCursorType , getExtendedState , getFrames , getIconImage , getMaximizedBounds , getMenuBar , getState , getTitle , isResizable , isUndecorated , remove , removeNotify , setBackground , setCursor , setExtendedState , setMaximizedBounds , setMenuBar , setOpacity , setResizable , setShape , setState , setTitle , setUndecorated
+
+
Methods inherited from class java.awt.Window
+
addPropertyChangeListener , addPropertyChangeListener , addWindowFocusListener , addWindowListener , addWindowStateListener , applyResourceBundle , applyResourceBundle , createBufferStrategy , createBufferStrategy , dispose , getBackground , getBufferStrategy , getFocusableWindowState , getFocusCycleRootAncestor , getFocusOwner , getFocusTraversalKeys , getIconImages , getInputContext , getListeners , getLocale , getModalExclusionType , getMostRecentFocusOwner , getOpacity , getOwnedWindows , getOwner , getOwnerlessWindows , getShape , getToolkit , getType , getWarningString , getWindowFocusListeners , getWindowListeners , getWindows , getWindowStateListeners , hide , isActive , isAlwaysOnTop , isAlwaysOnTopSupported , isAutoRequestFocus , isFocusableWindow , isFocusCycleRoot , isFocused , isLocationByPlatform , isOpaque , isShowing , isValidateRoot , pack , paint , postEvent , processEvent , processWindowFocusEvent , processWindowStateEvent , removeWindowFocusListener , removeWindowListener , removeWindowStateListener , reshape , setAlwaysOnTop , setAutoRequestFocus , setBounds , setBounds , setCursor , setFocusableWindowState , setFocusCycleRoot , setIconImages , setLocation , setLocation , setLocationByPlatform , setLocationRelativeTo , setMinimumSize , setModalExclusionType , setSize , setSize , setType , setVisible , show , toBack , toFront
+
+
Methods inherited from class java.awt.Container
+
add , add , add , add , add , addContainerListener , applyComponentOrientation , areFocusTraversalKeysSet , countComponents , deliverEvent , doLayout , findComponentAt , findComponentAt , getAlignmentX , getAlignmentY , getComponent , getComponentAt , getComponentAt , getComponentCount , getComponents , getComponentZOrder , getContainerListeners , getFocusTraversalPolicy , getInsets , getLayout , getMaximumSize , getMinimumSize , getMousePosition , getPreferredSize , insets , invalidate , isAncestorOf , isFocusCycleRoot , isFocusTraversalPolicyProvider , isFocusTraversalPolicySet , layout , list , list , locate , minimumSize , paintComponents , preferredSize , print , printComponents , processContainerEvent , remove , removeAll , removeContainerListener , setComponentZOrder , setFocusTraversalKeys , setFocusTraversalPolicy , setFocusTraversalPolicyProvider , setFont , transferFocusDownCycle , validate , validateTree
+
+
Methods inherited from class java.awt.Component
+
action , add , addComponentListener , addFocusListener , addHierarchyBoundsListener , addHierarchyListener , addInputMethodListener , addKeyListener , addMouseListener , addMouseMotionListener , addMouseWheelListener , bounds , checkImage , checkImage , coalesceEvents , contains , contains , createImage , createImage , createVolatileImage , createVolatileImage , disable , disableEvents , dispatchEvent , enable , enable , enableEvents , enableInputMethods , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , getBaseline , getBaselineResizeBehavior , getBounds , getBounds , getColorModel , getComponentListeners , getComponentOrientation , getCursor , getDropTarget , getFocusListeners , getFocusTraversalKeysEnabled , getFont , getFontMetrics , getForeground , getGraphicsConfiguration , getHeight , getHierarchyBoundsListeners , getHierarchyListeners , getIgnoreRepaint , getInputMethodListeners , getInputMethodRequests , getKeyListeners , getLocation , getLocation , getLocationOnScreen , getMouseListeners , getMouseMotionListeners , getMousePosition , getMouseWheelListeners , getName , getParent , getPropertyChangeListeners , getPropertyChangeListeners , getSize , getSize , getTreeLock , getWidth , getX , getY , gotFocus , handleEvent , hasFocus , imageUpdate , inside , isBackgroundSet , isCursorSet , isDisplayable , isDoubleBuffered , isEnabled , isFocusable , isFocusOwner , isFocusTraversable , isFontSet , isForegroundSet , isLightweight , isMaximumSizeSet , isMinimumSizeSet , isPreferredSizeSet , isValid , isVisible , keyDown , keyUp , list , list , list , location , lostFocus , mouseDown , mouseDrag , mouseEnter , mouseExit , mouseMove , mouseUp , move , nextFocus , paintAll , prepareImage , prepareImage , printAll , processComponentEvent , processFocusEvent , processHierarchyBoundsEvent , processHierarchyEvent , processInputMethodEvent , processKeyEvent , processMouseEvent , processMouseMotionEvent , processMouseWheelEvent , removeComponentListener , removeFocusListener , removeHierarchyBoundsListener , removeHierarchyListener , removeInputMethodListener , removeKeyListener , removeMouseListener , removeMouseMotionListener , removeMouseWheelListener , removePropertyChangeListener , removePropertyChangeListener , repaint , repaint , repaint , requestFocus , requestFocus , requestFocus , requestFocus , requestFocusInWindow , requestFocusInWindow , requestFocusInWindow , resize , resize , revalidate , setComponentOrientation , setDropTarget , setEnabled , setFocusable , setFocusTraversalKeysEnabled , setForeground , setIgnoreRepaint , setLocale , setMaximumSize , setMixingCutoutShape , setName , setPreferredSize , show , size , toString , transferFocus , transferFocusBackward , transferFocusUpCycle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Method Details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/Convertisseur.html b/docjava/fr/iutfbleau/sae/Convertisseur.html
new file mode 100644
index 0000000..6f3ce8e
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/Convertisseur.html
@@ -0,0 +1,188 @@
+
+
+
+
+Convertisseur
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+Convertisseur()
+
+
+Method Details
+
+main(String[])
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
+Method Summary
+
+
All Methods Static Methods Concrete Methods
+
+
+
+
+
+
static void
+
+
+
Methode principale qui demarre l'application de conversion.
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/ExportButtonListener.html b/docjava/fr/iutfbleau/sae/ExportButtonListener.html
new file mode 100644
index 0000000..4a7917d
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/ExportButtonListener.html
@@ -0,0 +1,181 @@
+
+
+
+
+ExportButtonListener
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+ExportButtonListener(ConverterController)
+
+
+Method Details
+
+actionPerformed(ActionEvent)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+Constructor Details
+
+
+
+ExportButtonListener
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/FrequencyTablePanel.html b/docjava/fr/iutfbleau/sae/FrequencyTablePanel.html
new file mode 100644
index 0000000..6ea61de
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/FrequencyTablePanel.html
@@ -0,0 +1,258 @@
+
+
+
+
+FrequencyTablePanel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Nested Class Summary
+Field Summary
+Constructor Summary
+Method Summary
+Constructor Details
+
+FrequencyTablePanel()
+
+
+Method Details
+
+updateFrequencies(int[], int[], int[])
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Nested Class Summary
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
Constructeur du panneau.
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
void
+
+
+
Met à jour les trois zones d'affichage avec les nouvelles valeurs.
+
+
+
+
+
+
+
Methods inherited from class javax.swing.JComponent
+
addAncestorListener , addNotify , addVetoableChangeListener , computeVisibleRect , contains , createToolTip , disable , enable , firePropertyChange , firePropertyChange , firePropertyChange , fireVetoableChange , getActionForKeyStroke , getActionMap , getAlignmentX , getAlignmentY , getAncestorListeners , getAutoscrolls , getBaseline , getBaselineResizeBehavior , getBorder , getBounds , getClientProperty , getComponentGraphics , getComponentPopupMenu , getConditionForKeyStroke , getDebugGraphicsOptions , getDefaultLocale , getFontMetrics , getGraphics , getHeight , getInheritsPopupMenu , getInputMap , getInputMap , getInputVerifier , getInsets , getInsets , getListeners , getLocation , getMaximumSize , getMinimumSize , getNextFocusableComponent , getPopupLocation , getPreferredSize , getRegisteredKeyStrokes , getRootPane , getSize , getToolTipLocation , getToolTipText , getToolTipText , getTopLevelAncestor , getTransferHandler , getVerifyInputWhenFocusTarget , getVetoableChangeListeners , getVisibleRect , getWidth , getX , getY , grabFocus , hide , isDoubleBuffered , isLightweightComponent , isManagingFocus , isOpaque , isOptimizedDrawingEnabled , isPaintingForPrint , isPaintingOrigin , isPaintingTile , isRequestFocusEnabled , isValidateRoot , paint , paintBorder , paintChildren , paintComponent , paintImmediately , paintImmediately , print , printAll , printBorder , printChildren , printComponent , processComponentKeyEvent , processKeyBinding , processKeyEvent , processMouseEvent , processMouseMotionEvent , putClientProperty , registerKeyboardAction , registerKeyboardAction , removeAncestorListener , removeNotify , removeVetoableChangeListener , repaint , repaint , requestDefaultFocus , requestFocus , requestFocus , requestFocusInWindow , requestFocusInWindow , resetKeyboardActions , reshape , revalidate , scrollRectToVisible , setActionMap , setAlignmentX , setAlignmentY , setAutoscrolls , setBackground , setBorder , setComponentPopupMenu , setDebugGraphicsOptions , setDefaultLocale , setDoubleBuffered , setEnabled , setFocusTraversalKeys , setFont , setForeground , setInheritsPopupMenu , setInputMap , setInputVerifier , setMaximumSize , setMinimumSize , setNextFocusableComponent , setOpaque , setPreferredSize , setRequestFocusEnabled , setToolTipText , setTransferHandler , setUI , setVerifyInputWhenFocusTarget , setVisible , unregisterKeyboardAction , update
+
+
Methods inherited from class java.awt.Container
+
add , add , add , add , add , addContainerListener , addImpl , addPropertyChangeListener , addPropertyChangeListener , applyComponentOrientation , areFocusTraversalKeysSet , countComponents , deliverEvent , doLayout , findComponentAt , findComponentAt , getComponent , getComponentAt , getComponentAt , getComponentCount , getComponents , getComponentZOrder , getContainerListeners , getFocusTraversalKeys , getFocusTraversalPolicy , getLayout , getMousePosition , insets , invalidate , isAncestorOf , isFocusCycleRoot , isFocusCycleRoot , isFocusTraversalPolicyProvider , isFocusTraversalPolicySet , layout , list , list , locate , minimumSize , paintComponents , preferredSize , printComponents , processContainerEvent , processEvent , remove , remove , removeAll , removeContainerListener , setComponentZOrder , setFocusCycleRoot , setFocusTraversalPolicy , setFocusTraversalPolicyProvider , setLayout , transferFocusDownCycle , validate , validateTree
+
+
Methods inherited from class java.awt.Component
+
action , add , addComponentListener , addFocusListener , addHierarchyBoundsListener , addHierarchyListener , addInputMethodListener , addKeyListener , addMouseListener , addMouseMotionListener , addMouseWheelListener , bounds , checkImage , checkImage , coalesceEvents , contains , createImage , createImage , createVolatileImage , createVolatileImage , disableEvents , dispatchEvent , enable , enableEvents , enableInputMethods , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , getBackground , getBounds , getColorModel , getComponentListeners , getComponentOrientation , getCursor , getDropTarget , getFocusCycleRootAncestor , getFocusListeners , getFocusTraversalKeysEnabled , getFont , getForeground , getGraphicsConfiguration , getHierarchyBoundsListeners , getHierarchyListeners , getIgnoreRepaint , getInputContext , getInputMethodListeners , getInputMethodRequests , getKeyListeners , getLocale , getLocation , getLocationOnScreen , getMouseListeners , getMouseMotionListeners , getMousePosition , getMouseWheelListeners , getName , getParent , getPropertyChangeListeners , getPropertyChangeListeners , getSize , getToolkit , getTreeLock , gotFocus , handleEvent , hasFocus , imageUpdate , inside , isBackgroundSet , isCursorSet , isDisplayable , isEnabled , isFocusable , isFocusOwner , isFocusTraversable , isFontSet , isForegroundSet , isLightweight , isMaximumSizeSet , isMinimumSizeSet , isPreferredSizeSet , isShowing , isValid , isVisible , keyDown , keyUp , list , list , list , location , lostFocus , mouseDown , mouseDrag , mouseEnter , mouseExit , mouseMove , mouseUp , move , nextFocus , paintAll , postEvent , prepareImage , prepareImage , processComponentEvent , processFocusEvent , processHierarchyBoundsEvent , processHierarchyEvent , processInputMethodEvent , processMouseWheelEvent , remove , removeComponentListener , removeFocusListener , removeHierarchyBoundsListener , removeHierarchyListener , removeInputMethodListener , removeKeyListener , removeMouseListener , removeMouseMotionListener , removeMouseWheelListener , removePropertyChangeListener , removePropertyChangeListener , repaint , repaint , repaint , requestFocus , requestFocus , requestFocusInWindow , resize , resize , setBounds , setBounds , setComponentOrientation , setCursor , setDropTarget , setFocusable , setFocusTraversalKeysEnabled , setIgnoreRepaint , setLocale , setLocation , setLocation , setMixingCutoutShape , setName , setSize , setSize , show , show , size , toString , transferFocus , transferFocusBackward , transferFocusUpCycle
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/GestionErreur.html b/docjava/fr/iutfbleau/sae/GestionErreur.html
new file mode 100644
index 0000000..f678266
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/GestionErreur.html
@@ -0,0 +1,184 @@
+
+
+
+
+GestionErreur
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+GestionErreur()
+
+
+Method Details
+
+afficherErreur(String)
+afficherInfo(String)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
+Method Summary
+
+
All Methods Static Methods Concrete Methods
+
+
+
+
+
+
static void
+
+
+
static void
+
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/ImagePreviewPanel.html b/docjava/fr/iutfbleau/sae/ImagePreviewPanel.html
new file mode 100644
index 0000000..d63bcaf
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/ImagePreviewPanel.html
@@ -0,0 +1,274 @@
+
+
+
+
+ImagePreviewPanel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Nested Class Summary
+Field Summary
+Constructor Summary
+Method Summary
+Constructor Details
+
+ImagePreviewPanel()
+
+
+Method Details
+
+setImage(BufferedImage)
+paintComponent(Graphics)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Nested Class Summary
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
Constructeur du panneau d'aperçu.
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
protected void
+
+
+
Affiche l'image dans le panneau.
+
+
void
+
+
+
Met à jour l'image à afficher et demande le rafraîchissement du panneau.
+
+
+
+
+
+
+
Methods inherited from class javax.swing.JComponent
+
addAncestorListener , addNotify , addVetoableChangeListener , computeVisibleRect , contains , createToolTip , disable , enable , firePropertyChange , firePropertyChange , firePropertyChange , fireVetoableChange , getActionForKeyStroke , getActionMap , getAlignmentX , getAlignmentY , getAncestorListeners , getAutoscrolls , getBaseline , getBaselineResizeBehavior , getBorder , getBounds , getClientProperty , getComponentGraphics , getComponentPopupMenu , getConditionForKeyStroke , getDebugGraphicsOptions , getDefaultLocale , getFontMetrics , getGraphics , getHeight , getInheritsPopupMenu , getInputMap , getInputMap , getInputVerifier , getInsets , getInsets , getListeners , getLocation , getMaximumSize , getMinimumSize , getNextFocusableComponent , getPopupLocation , getPreferredSize , getRegisteredKeyStrokes , getRootPane , getSize , getToolTipLocation , getToolTipText , getToolTipText , getTopLevelAncestor , getTransferHandler , getVerifyInputWhenFocusTarget , getVetoableChangeListeners , getVisibleRect , getWidth , getX , getY , grabFocus , hide , isDoubleBuffered , isLightweightComponent , isManagingFocus , isOpaque , isOptimizedDrawingEnabled , isPaintingForPrint , isPaintingOrigin , isPaintingTile , isRequestFocusEnabled , isValidateRoot , paint , paintBorder , paintChildren , paintImmediately , paintImmediately , print , printAll , printBorder , printChildren , printComponent , processComponentKeyEvent , processKeyBinding , processKeyEvent , processMouseEvent , processMouseMotionEvent , putClientProperty , registerKeyboardAction , registerKeyboardAction , removeAncestorListener , removeNotify , removeVetoableChangeListener , repaint , repaint , requestDefaultFocus , requestFocus , requestFocus , requestFocusInWindow , requestFocusInWindow , resetKeyboardActions , reshape , revalidate , scrollRectToVisible , setActionMap , setAlignmentX , setAlignmentY , setAutoscrolls , setBackground , setBorder , setComponentPopupMenu , setDebugGraphicsOptions , setDefaultLocale , setDoubleBuffered , setEnabled , setFocusTraversalKeys , setFont , setForeground , setInheritsPopupMenu , setInputMap , setInputVerifier , setMaximumSize , setMinimumSize , setNextFocusableComponent , setOpaque , setPreferredSize , setRequestFocusEnabled , setToolTipText , setTransferHandler , setUI , setVerifyInputWhenFocusTarget , setVisible , unregisterKeyboardAction , update
+
+
Methods inherited from class java.awt.Container
+
add , add , add , add , add , addContainerListener , addImpl , addPropertyChangeListener , addPropertyChangeListener , applyComponentOrientation , areFocusTraversalKeysSet , countComponents , deliverEvent , doLayout , findComponentAt , findComponentAt , getComponent , getComponentAt , getComponentAt , getComponentCount , getComponents , getComponentZOrder , getContainerListeners , getFocusTraversalKeys , getFocusTraversalPolicy , getLayout , getMousePosition , insets , invalidate , isAncestorOf , isFocusCycleRoot , isFocusCycleRoot , isFocusTraversalPolicyProvider , isFocusTraversalPolicySet , layout , list , list , locate , minimumSize , paintComponents , preferredSize , printComponents , processContainerEvent , processEvent , remove , remove , removeAll , removeContainerListener , setComponentZOrder , setFocusCycleRoot , setFocusTraversalPolicy , setFocusTraversalPolicyProvider , setLayout , transferFocusDownCycle , validate , validateTree
+
+
Methods inherited from class java.awt.Component
+
action , add , addComponentListener , addFocusListener , addHierarchyBoundsListener , addHierarchyListener , addInputMethodListener , addKeyListener , addMouseListener , addMouseMotionListener , addMouseWheelListener , bounds , checkImage , checkImage , coalesceEvents , contains , createImage , createImage , createVolatileImage , createVolatileImage , disableEvents , dispatchEvent , enable , enableEvents , enableInputMethods , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , getBackground , getBounds , getColorModel , getComponentListeners , getComponentOrientation , getCursor , getDropTarget , getFocusCycleRootAncestor , getFocusListeners , getFocusTraversalKeysEnabled , getFont , getForeground , getGraphicsConfiguration , getHierarchyBoundsListeners , getHierarchyListeners , getIgnoreRepaint , getInputContext , getInputMethodListeners , getInputMethodRequests , getKeyListeners , getLocale , getLocation , getLocationOnScreen , getMouseListeners , getMouseMotionListeners , getMousePosition , getMouseWheelListeners , getName , getParent , getPropertyChangeListeners , getPropertyChangeListeners , getSize , getToolkit , getTreeLock , gotFocus , handleEvent , hasFocus , imageUpdate , inside , isBackgroundSet , isCursorSet , isDisplayable , isEnabled , isFocusable , isFocusOwner , isFocusTraversable , isFontSet , isForegroundSet , isLightweight , isMaximumSizeSet , isMinimumSizeSet , isPreferredSizeSet , isShowing , isValid , isVisible , keyDown , keyUp , list , list , list , location , lostFocus , mouseDown , mouseDrag , mouseEnter , mouseExit , mouseMove , mouseUp , move , nextFocus , paintAll , postEvent , prepareImage , prepareImage , processComponentEvent , processFocusEvent , processHierarchyBoundsEvent , processHierarchyEvent , processInputMethodEvent , processMouseWheelEvent , remove , removeComponentListener , removeFocusListener , removeHierarchyBoundsListener , removeHierarchyListener , removeInputMethodListener , removeKeyListener , removeMouseListener , removeMouseMotionListener , removeMouseWheelListener , removePropertyChangeListener , removePropertyChangeListener , repaint , repaint , repaint , requestFocus , requestFocus , requestFocusInWindow , resize , resize , setBounds , setBounds , setComponentOrientation , setCursor , setDropTarget , setFocusable , setFocusTraversalKeysEnabled , setIgnoreRepaint , setLocale , setLocation , setLocation , setMixingCutoutShape , setName , setSize , setSize , show , show , size , toString , transferFocus , transferFocusBackward , transferFocusUpCycle
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/ThreadSauvegardePIF.html b/docjava/fr/iutfbleau/sae/ThreadSauvegardePIF.html
new file mode 100644
index 0000000..7c1dafe
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/ThreadSauvegardePIF.html
@@ -0,0 +1,222 @@
+
+
+
+
+ThreadSauvegardePIF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Nested Class Summary
+Field Summary
+Constructor Summary
+Method Summary
+Constructor Details
+
+ThreadSauvegardePIF(ConverterController, File)
+
+
+Method Details
+
+run()
+
+
+
+
+
+
+
+
+
+
+All Implemented Interfaces:
+Runnable
+
+
+
+
+
+
+
+
+
+Nested Class Summary
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
Construit un nouveau thread de sauvegarde.
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
void
+
+
+
Execute la sauvegarde du fichier PIF.
+
+
+
+
+
+
Methods inherited from class java.lang.Thread
+
activeCount , checkAccess , clone , currentThread , dumpStack , enumerate , getAllStackTraces , getContextClassLoader , getDefaultUncaughtExceptionHandler , getId , getName , getPriority , getStackTrace , getState , getThreadGroup , getUncaughtExceptionHandler , holdsLock , interrupt , interrupted , isAlive , isDaemon , isInterrupted , isVirtual , join , join , join , join , ofPlatform , ofVirtual , onSpinWait , setContextClassLoader , setDaemon , setDefaultUncaughtExceptionHandler , setName , setPriority , setUncaughtExceptionHandler , sleep , sleep , sleep , start , startVirtualThread , stop , threadId , toString , yield
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/Viewer.html b/docjava/fr/iutfbleau/sae/Viewer.html
new file mode 100644
index 0000000..6c403a7
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/Viewer.html
@@ -0,0 +1,183 @@
+
+
+
+
+Viewer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+Viewer()
+
+
+Method Details
+
+main(String[])
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
+Method Summary
+
+
All Methods Static Methods Concrete Methods
+
+
+
+
+
+
static void
+
+
+
Point d'entree de l'application.
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/ViewerControleur.html b/docjava/fr/iutfbleau/sae/ViewerControleur.html
new file mode 100644
index 0000000..b205682
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/ViewerControleur.html
@@ -0,0 +1,189 @@
+
+
+
+
+ViewerControleur
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+ViewerControleur(ViewerWindow, String)
+
+
+Method Details
+
+loadPIF()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
Constructeur du controleur.
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
void
+
+
+
Charge et affiche un fichier PIF.
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/ViewerImagePanel.html b/docjava/fr/iutfbleau/sae/ViewerImagePanel.html
new file mode 100644
index 0000000..5f001c2
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/ViewerImagePanel.html
@@ -0,0 +1,400 @@
+
+
+
+
+ViewerImagePanel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Nested Class Summary
+Field Summary
+Constructor Summary
+Method Summary
+Constructor Details
+
+ViewerImagePanel()
+
+
+Method Details
+
+setImage(BufferedImage)
+paintComponent(Graphics)
+mousePressed(MouseEvent)
+mouseDragged(MouseEvent)
+mouseReleased(MouseEvent)
+mouseClicked(MouseEvent)
+mouseEntered(MouseEvent)
+mouseExited(MouseEvent)
+mouseMoved(MouseEvent)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Nested Class Summary
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
Constructeur du panneau.
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
void
+
+
+
void
+
+
+
Detecte quand l'utilisateur fait glisser la souris.
+
+
void
+
+
+
void
+
+
+
void
+
+
+
void
+
+
+
Detecte quand l'utilisateur appuie sur le bouton de la souris.
+
+
void
+
+
+
protected void
+
+
+
Methode de dessin du panneau.
+
+
void
+
+
+
Definit l'image a afficher et reinitialise le decalage.
+
+
+
+
+
+
+
Methods inherited from class javax.swing.JComponent
+
addAncestorListener , addNotify , addVetoableChangeListener , computeVisibleRect , contains , createToolTip , disable , enable , firePropertyChange , firePropertyChange , firePropertyChange , fireVetoableChange , getActionForKeyStroke , getActionMap , getAlignmentX , getAlignmentY , getAncestorListeners , getAutoscrolls , getBaseline , getBaselineResizeBehavior , getBorder , getBounds , getClientProperty , getComponentGraphics , getComponentPopupMenu , getConditionForKeyStroke , getDebugGraphicsOptions , getDefaultLocale , getFontMetrics , getGraphics , getHeight , getInheritsPopupMenu , getInputMap , getInputMap , getInputVerifier , getInsets , getInsets , getListeners , getLocation , getMaximumSize , getMinimumSize , getNextFocusableComponent , getPopupLocation , getPreferredSize , getRegisteredKeyStrokes , getRootPane , getSize , getToolTipLocation , getToolTipText , getToolTipText , getTopLevelAncestor , getTransferHandler , getVerifyInputWhenFocusTarget , getVetoableChangeListeners , getVisibleRect , getWidth , getX , getY , grabFocus , hide , isDoubleBuffered , isLightweightComponent , isManagingFocus , isOpaque , isOptimizedDrawingEnabled , isPaintingForPrint , isPaintingOrigin , isPaintingTile , isRequestFocusEnabled , isValidateRoot , paint , paintBorder , paintChildren , paintImmediately , paintImmediately , print , printAll , printBorder , printChildren , printComponent , processComponentKeyEvent , processKeyBinding , processKeyEvent , processMouseEvent , processMouseMotionEvent , putClientProperty , registerKeyboardAction , registerKeyboardAction , removeAncestorListener , removeNotify , removeVetoableChangeListener , repaint , repaint , requestDefaultFocus , requestFocus , requestFocus , requestFocusInWindow , requestFocusInWindow , resetKeyboardActions , reshape , revalidate , scrollRectToVisible , setActionMap , setAlignmentX , setAlignmentY , setAutoscrolls , setBackground , setBorder , setComponentPopupMenu , setDebugGraphicsOptions , setDefaultLocale , setDoubleBuffered , setEnabled , setFocusTraversalKeys , setFont , setForeground , setInheritsPopupMenu , setInputMap , setInputVerifier , setMaximumSize , setMinimumSize , setNextFocusableComponent , setOpaque , setPreferredSize , setRequestFocusEnabled , setToolTipText , setTransferHandler , setUI , setVerifyInputWhenFocusTarget , setVisible , unregisterKeyboardAction , update
+
+
Methods inherited from class java.awt.Container
+
add , add , add , add , add , addContainerListener , addImpl , addPropertyChangeListener , addPropertyChangeListener , applyComponentOrientation , areFocusTraversalKeysSet , countComponents , deliverEvent , doLayout , findComponentAt , findComponentAt , getComponent , getComponentAt , getComponentAt , getComponentCount , getComponents , getComponentZOrder , getContainerListeners , getFocusTraversalKeys , getFocusTraversalPolicy , getLayout , getMousePosition , insets , invalidate , isAncestorOf , isFocusCycleRoot , isFocusCycleRoot , isFocusTraversalPolicyProvider , isFocusTraversalPolicySet , layout , list , list , locate , minimumSize , paintComponents , preferredSize , printComponents , processContainerEvent , processEvent , remove , remove , removeAll , removeContainerListener , setComponentZOrder , setFocusCycleRoot , setFocusTraversalPolicy , setFocusTraversalPolicyProvider , setLayout , transferFocusDownCycle , validate , validateTree
+
+
Methods inherited from class java.awt.Component
+
action , add , addComponentListener , addFocusListener , addHierarchyBoundsListener , addHierarchyListener , addInputMethodListener , addKeyListener , addMouseListener , addMouseMotionListener , addMouseWheelListener , bounds , checkImage , checkImage , coalesceEvents , contains , createImage , createImage , createVolatileImage , createVolatileImage , disableEvents , dispatchEvent , enable , enableEvents , enableInputMethods , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , getBackground , getBounds , getColorModel , getComponentListeners , getComponentOrientation , getCursor , getDropTarget , getFocusCycleRootAncestor , getFocusListeners , getFocusTraversalKeysEnabled , getFont , getForeground , getGraphicsConfiguration , getHierarchyBoundsListeners , getHierarchyListeners , getIgnoreRepaint , getInputContext , getInputMethodListeners , getInputMethodRequests , getKeyListeners , getLocale , getLocation , getLocationOnScreen , getMouseListeners , getMouseMotionListeners , getMousePosition , getMouseWheelListeners , getName , getParent , getPropertyChangeListeners , getPropertyChangeListeners , getSize , getToolkit , getTreeLock , gotFocus , handleEvent , hasFocus , imageUpdate , inside , isBackgroundSet , isCursorSet , isDisplayable , isEnabled , isFocusable , isFocusOwner , isFocusTraversable , isFontSet , isForegroundSet , isLightweight , isMaximumSizeSet , isMinimumSizeSet , isPreferredSizeSet , isShowing , isValid , isVisible , keyDown , keyUp , list , list , list , location , lostFocus , mouseDown , mouseDrag , mouseEnter , mouseExit , mouseMove , mouseUp , move , nextFocus , paintAll , postEvent , prepareImage , prepareImage , processComponentEvent , processFocusEvent , processHierarchyBoundsEvent , processHierarchyEvent , processInputMethodEvent , processMouseWheelEvent , remove , removeComponentListener , removeFocusListener , removeHierarchyBoundsListener , removeHierarchyListener , removeInputMethodListener , removeKeyListener , removeMouseListener , removeMouseMotionListener , removeMouseWheelListener , removePropertyChangeListener , removePropertyChangeListener , repaint , repaint , repaint , requestFocus , requestFocus , requestFocusInWindow , resize , resize , setBounds , setBounds , setComponentOrientation , setCursor , setDropTarget , setFocusable , setFocusTraversalKeysEnabled , setIgnoreRepaint , setLocale , setLocation , setLocation , setMixingCutoutShape , setName , setSize , setSize , show , show , size , toString , transferFocus , transferFocusBackward , transferFocusUpCycle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Method Details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/ViewerWindow.html b/docjava/fr/iutfbleau/sae/ViewerWindow.html
new file mode 100644
index 0000000..a432760
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/ViewerWindow.html
@@ -0,0 +1,270 @@
+
+
+
+
+ViewerWindow
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Nested Class Summary
+Field Summary
+Constructor Summary
+Method Summary
+Constructor Details
+
+ViewerWindow()
+
+
+Method Details
+
+displayImage(BufferedImage)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Nested Class Summary
+
+
+
+
+
+
+
+
+
+
+Field Summary
+
+
+
Fields inherited from class java.awt.Frame
+
CROSSHAIR_CURSOR , DEFAULT_CURSOR , E_RESIZE_CURSOR , HAND_CURSOR , ICONIFIED , MAXIMIZED_BOTH , MAXIMIZED_HORIZ , MAXIMIZED_VERT , MOVE_CURSOR , N_RESIZE_CURSOR , NE_RESIZE_CURSOR , NORMAL , NW_RESIZE_CURSOR , S_RESIZE_CURSOR , SE_RESIZE_CURSOR , SW_RESIZE_CURSOR , TEXT_CURSOR , W_RESIZE_CURSOR , WAIT_CURSOR
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
Constructeur de la fenetre.
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
void
+
+
+
Affiche une image dans la fenetre.
+
+
+
+
+
+
Methods inherited from class javax.swing.JFrame
+
addImpl , createRootPane , frameInit , getAccessibleContext , getContentPane , getDefaultCloseOperation , getGlassPane , getGraphics , getJMenuBar , getLayeredPane , getRootPane , getTransferHandler , isDefaultLookAndFeelDecorated , isRootPaneCheckingEnabled , paramString , processWindowEvent , remove , repaint , setContentPane , setDefaultCloseOperation , setDefaultLookAndFeelDecorated , setGlassPane , setIconImage , setJMenuBar , setLayeredPane , setLayout , setRootPane , setRootPaneCheckingEnabled , setTransferHandler , update
+
+
Methods inherited from class java.awt.Frame
+
addNotify , getCursorType , getExtendedState , getFrames , getIconImage , getMaximizedBounds , getMenuBar , getState , getTitle , isResizable , isUndecorated , remove , removeNotify , setBackground , setCursor , setExtendedState , setMaximizedBounds , setMenuBar , setOpacity , setResizable , setShape , setState , setTitle , setUndecorated
+
+
Methods inherited from class java.awt.Window
+
addPropertyChangeListener , addPropertyChangeListener , addWindowFocusListener , addWindowListener , addWindowStateListener , applyResourceBundle , applyResourceBundle , createBufferStrategy , createBufferStrategy , dispose , getBackground , getBufferStrategy , getFocusableWindowState , getFocusCycleRootAncestor , getFocusOwner , getFocusTraversalKeys , getIconImages , getInputContext , getListeners , getLocale , getModalExclusionType , getMostRecentFocusOwner , getOpacity , getOwnedWindows , getOwner , getOwnerlessWindows , getShape , getToolkit , getType , getWarningString , getWindowFocusListeners , getWindowListeners , getWindows , getWindowStateListeners , hide , isActive , isAlwaysOnTop , isAlwaysOnTopSupported , isAutoRequestFocus , isFocusableWindow , isFocusCycleRoot , isFocused , isLocationByPlatform , isOpaque , isShowing , isValidateRoot , pack , paint , postEvent , processEvent , processWindowFocusEvent , processWindowStateEvent , removeWindowFocusListener , removeWindowListener , removeWindowStateListener , reshape , setAlwaysOnTop , setAutoRequestFocus , setBounds , setBounds , setCursor , setFocusableWindowState , setFocusCycleRoot , setIconImages , setLocation , setLocation , setLocationByPlatform , setLocationRelativeTo , setMinimumSize , setModalExclusionType , setSize , setSize , setType , setVisible , show , toBack , toFront
+
+
Methods inherited from class java.awt.Container
+
add , add , add , add , add , addContainerListener , applyComponentOrientation , areFocusTraversalKeysSet , countComponents , deliverEvent , doLayout , findComponentAt , findComponentAt , getAlignmentX , getAlignmentY , getComponent , getComponentAt , getComponentAt , getComponentCount , getComponents , getComponentZOrder , getContainerListeners , getFocusTraversalPolicy , getInsets , getLayout , getMaximumSize , getMinimumSize , getMousePosition , getPreferredSize , insets , invalidate , isAncestorOf , isFocusCycleRoot , isFocusTraversalPolicyProvider , isFocusTraversalPolicySet , layout , list , list , locate , minimumSize , paintComponents , preferredSize , print , printComponents , processContainerEvent , remove , removeAll , removeContainerListener , setComponentZOrder , setFocusTraversalKeys , setFocusTraversalPolicy , setFocusTraversalPolicyProvider , setFont , transferFocusDownCycle , validate , validateTree
+
+
Methods inherited from class java.awt.Component
+
action , add , addComponentListener , addFocusListener , addHierarchyBoundsListener , addHierarchyListener , addInputMethodListener , addKeyListener , addMouseListener , addMouseMotionListener , addMouseWheelListener , bounds , checkImage , checkImage , coalesceEvents , contains , contains , createImage , createImage , createVolatileImage , createVolatileImage , disable , disableEvents , dispatchEvent , enable , enable , enableEvents , enableInputMethods , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , firePropertyChange , getBaseline , getBaselineResizeBehavior , getBounds , getBounds , getColorModel , getComponentListeners , getComponentOrientation , getCursor , getDropTarget , getFocusListeners , getFocusTraversalKeysEnabled , getFont , getFontMetrics , getForeground , getGraphicsConfiguration , getHeight , getHierarchyBoundsListeners , getHierarchyListeners , getIgnoreRepaint , getInputMethodListeners , getInputMethodRequests , getKeyListeners , getLocation , getLocation , getLocationOnScreen , getMouseListeners , getMouseMotionListeners , getMousePosition , getMouseWheelListeners , getName , getParent , getPropertyChangeListeners , getPropertyChangeListeners , getSize , getSize , getTreeLock , getWidth , getX , getY , gotFocus , handleEvent , hasFocus , imageUpdate , inside , isBackgroundSet , isCursorSet , isDisplayable , isDoubleBuffered , isEnabled , isFocusable , isFocusOwner , isFocusTraversable , isFontSet , isForegroundSet , isLightweight , isMaximumSizeSet , isMinimumSizeSet , isPreferredSizeSet , isValid , isVisible , keyDown , keyUp , list , list , list , location , lostFocus , mouseDown , mouseDrag , mouseEnter , mouseExit , mouseMove , mouseUp , move , nextFocus , paintAll , prepareImage , prepareImage , printAll , processComponentEvent , processFocusEvent , processHierarchyBoundsEvent , processHierarchyEvent , processInputMethodEvent , processKeyEvent , processMouseEvent , processMouseMotionEvent , processMouseWheelEvent , removeComponentListener , removeFocusListener , removeHierarchyBoundsListener , removeHierarchyListener , removeInputMethodListener , removeKeyListener , removeMouseListener , removeMouseMotionListener , removeMouseWheelListener , removePropertyChangeListener , removePropertyChangeListener , repaint , repaint , repaint , requestFocus , requestFocus , requestFocus , requestFocus , requestFocusInWindow , requestFocusInWindow , requestFocusInWindow , resize , resize , revalidate , setComponentOrientation , setDropTarget , setEnabled , setFocusable , setFocusTraversalKeysEnabled , setForeground , setIgnoreRepaint , setLocale , setMaximumSize , setMixingCutoutShape , setName , setPreferredSize , show , size , toString , transferFocus , transferFocusBackward , transferFocusUpCycle
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mhuffman/CanonicalCode.html b/docjava/fr/iutfbleau/sae/mhuffman/CanonicalCode.html
new file mode 100644
index 0000000..21334de
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mhuffman/CanonicalCode.html
@@ -0,0 +1,232 @@
+
+
+
+
+CanonicalCode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+CanonicalCode()
+
+
+Method Details
+
+generateCodes(Map)
+getCode(Map, int)
+getLength(Map, int)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
+
+
+
Genere des codes canoniques a partir de codes de Huffman.
+
+
+
+
+
Recupere le code canonique d'une valeur.
+
+
int
+
+
+
Recupere la longueur d'un code pour une valeur donnee.
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mhuffman/ComparateurCanonique.html b/docjava/fr/iutfbleau/sae/mhuffman/ComparateurCanonique.html
new file mode 100644
index 0000000..aad31b4
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mhuffman/ComparateurCanonique.html
@@ -0,0 +1,202 @@
+
+
+
+
+ComparateurCanonique
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+ComparateurCanonique()
+
+
+Method Details
+
+compare(Map.Entry, Map.Entry)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
int
+
+
+
Compare deux entrées contenant un symbole et son code Huffman.
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
+Constructor Details
+
+
+
+ComparateurCanonique
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mhuffman/ComparateurHuffmanNode.html b/docjava/fr/iutfbleau/sae/mhuffman/ComparateurHuffmanNode.html
new file mode 100644
index 0000000..0938758
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mhuffman/ComparateurHuffmanNode.html
@@ -0,0 +1,200 @@
+
+
+
+
+ComparateurHuffmanNode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+ComparateurHuffmanNode()
+
+
+Method Details
+
+compare(HuffmanNode, HuffmanNode)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
int
+
+
+
Compare deux nœuds en fonction de leur fréquence.
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
+Constructor Details
+
+
+
+ComparateurHuffmanNode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mhuffman/FrequencyTable.html b/docjava/fr/iutfbleau/sae/mhuffman/FrequencyTable.html
new file mode 100644
index 0000000..4178636
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mhuffman/FrequencyTable.html
@@ -0,0 +1,248 @@
+
+
+
+
+FrequencyTable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+FrequencyTable()
+
+
+Method Details
+
+computeFromImage(RGBImage)
+getRed()
+getGreen()
+getBlue()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
Constructeur qui initialise les trois tableaux de fréquences
+ à zéro pour toutes les valeurs possibles.
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
void
+
+
+
Analyse une image et remplit les tableaux de fréquences.
+
+
int[]
+
+
+
Renvoie les fréquences des valeurs bleues.
+
+
int[]
+
+
+
Renvoie les fréquences des valeurs vertes.
+
+
int[]
+
+
+
Renvoie les fréquences des valeurs rouges.
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
+
+
+
+Method Details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mhuffman/HuffmanNode.html b/docjava/fr/iutfbleau/sae/mhuffman/HuffmanNode.html
new file mode 100644
index 0000000..c35340a
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mhuffman/HuffmanNode.html
@@ -0,0 +1,316 @@
+
+
+
+
+HuffmanNode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+HuffmanNode(int, int)
+HuffmanNode(HuffmanNode, HuffmanNode)
+
+
+Method Details
+
+isLeaf()
+getFrequence()
+getLeft()
+getRight()
+getValue()
+toString()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
Constructeur d'un nœud feuille.
+
+
+
+
Constructeur d'un nœud interne (créé lors de la fusion de deux sous-arbres).
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
int
+
+
+
Renvoie la fréquence associée à ce nœud.
+
+
+
+
+
Renvoie le fils gauche.
+
+
+
+
+
Renvoie le fils droit.
+
+
int
+
+
+
Renvoie la valeur du symbole représenté.
+
+
boolean
+
+
+
Indique si le nœud est une feuille.
+
+
+
+
+
Représentation textuelle du nœud.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Method Details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mhuffman/HuffmanTree.html b/docjava/fr/iutfbleau/sae/mhuffman/HuffmanTree.html
new file mode 100644
index 0000000..3c0f12c
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mhuffman/HuffmanTree.html
@@ -0,0 +1,236 @@
+
+
+
+
+HuffmanTree
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+HuffmanTree(int[])
+
+
+Method Details
+
+generateCodes()
+getRoot()
+getCodes()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
Construit l'arbre de Huffman à partir d'un tableau de fréquences.
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
+
+
+
Lance la génération des codes Huffman en parcourant l'arbre.
+
+
+
+
+
Retourne les codes Huffman générés.
+
+
+
+
+
Permet de récupérer la racine de l'arbre.
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mhuffman/package-summary.html b/docjava/fr/iutfbleau/sae/mhuffman/package-summary.html
new file mode 100644
index 0000000..1e6c100
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mhuffman/package-summary.html
@@ -0,0 +1,126 @@
+
+
+
+
+fr.iutfbleau.sae.mhuffman
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Related Packages
+Classes and Interfaces
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Classes
+
+
+
+
+
+
Classe pour generer des codes canoniques de Huffman.
+
+
+
+
Comparateur utilisé lors de la génération des codes canoniques.
+
+
+
+
Comparateur utilisé pour trier les nœuds de l'arbre de Huffman.
+
+
+
+
Classe qui calcule les fréquences des valeurs de couleur dans une image RGB.
+
+
+
+
Représente un nœud de l'arbre de Huffman.
+
+
+
+
Cette classe construit un arbre de Huffman à partir d'un tableau
+ de fréquences.
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mhuffman/package-tree.html b/docjava/fr/iutfbleau/sae/mhuffman/package-tree.html
new file mode 100644
index 0000000..499bde6
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mhuffman/package-tree.html
@@ -0,0 +1,81 @@
+
+
+
+
+fr.iutfbleau.sae.mhuffman Class Hierarchy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+Package Hierarchies:
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mpif/BitInputStream.html b/docjava/fr/iutfbleau/sae/mpif/BitInputStream.html
new file mode 100644
index 0000000..6183b39
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mpif/BitInputStream.html
@@ -0,0 +1,251 @@
+
+
+
+
+BitInputStream
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+BitInputStream(InputStream)
+
+
+Method Details
+
+readBit()
+readBits(int)
+closeFlux()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
Construit un lecteur binaire à partir d'un flux existant.
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
void
+
+
+
Ferme le flux d'entrée sous-jacent.
+
+
int
+
+
+
Lit un bit depuis le flux binaire.
+
+
int
+
+
+
Lit une séquence de bits consécutifs et les assemble dans un entier.
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mpif/BitOutputStream.html b/docjava/fr/iutfbleau/sae/mpif/BitOutputStream.html
new file mode 100644
index 0000000..fd8154b
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mpif/BitOutputStream.html
@@ -0,0 +1,294 @@
+
+
+
+
+BitOutputStream
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+BitOutputStream(OutputStream)
+
+
+Method Details
+
+writeBit(int)
+writeBits(int, int)
+flush()
+writeBitString(String)
+fermerFlux()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
Construit un écrivain binaire à partir d'un flux existant.
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
void
+
+
+
Vide les buffers internes et ferme le flux de sortie.
+
+
void
+
+
+
Force l'écriture immédiate des données accumulées dans le flux sous-jacent.
+
+
void
+
+
+
Écrit un bit dans le flux binaire.
+
+
void
+
+
+
Écrit une séquence de bits correspondant à une valeur entière.
+
+
void
+
+
+
Écrit une séquence de bits à partir d'une chaîne de '0' et '1'.
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
+
+
+
+Method Details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mpif/ComparateurEntreeCanonique.html b/docjava/fr/iutfbleau/sae/mpif/ComparateurEntreeCanonique.html
new file mode 100644
index 0000000..943476e
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mpif/ComparateurEntreeCanonique.html
@@ -0,0 +1,206 @@
+
+
+
+
+ComparateurEntreeCanonique
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+ComparateurEntreeCanonique()
+
+
+Method Details
+
+compare(Map.Entry, Map.Entry)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
int
+
+
+
Compare deux entrées contenant chacune un symbole et sa longueur de code.
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
+Constructor Details
+
+
+
+ComparateurEntreeCanonique
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mpif/DecodeNode.html b/docjava/fr/iutfbleau/sae/mpif/DecodeNode.html
new file mode 100644
index 0000000..bd622b7
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mpif/DecodeNode.html
@@ -0,0 +1,288 @@
+
+
+
+
+DecodeNode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Field Summary
+Constructor Summary
+Method Summary
+Field Details
+
+left
+right
+value
+
+
+Constructor Details
+
+DecodeNode()
+DecodeNode(DecodeNode, DecodeNode, Integer)
+
+
+Method Details
+
+isLeaf()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Field Summary
+Fields
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Valeur associée à la feuille.
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
Constructeur d'un nœud interne vide.
+
+
+
+
Constructeur d'un nœud complet, utilisé pour créer une feuille ou un nœud interne.
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
boolean
+
+
+
Indique si le nœud est une feuille (aucun enfant).
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mpif/PIFReader.html b/docjava/fr/iutfbleau/sae/mpif/PIFReader.html
new file mode 100644
index 0000000..d842d8c
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mpif/PIFReader.html
@@ -0,0 +1,346 @@
+
+
+
+
+PIFReader
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+PIFReader()
+
+
+Method Details
+
+decodePifFile(File)
+readHeader(BitInputStream)
+readCanonicalTables(BitInputStream)
+rebuildCanonical(int[])
+buildDecodageTree(Map)
+decodePixels(BitInputStream, DecodeNode, DecodeNode, DecodeNode)
+isPIFFile(File)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
+Method Summary
+
+
All Methods Static Methods Instance Methods Concrete Methods
+
+
+
+
+
+
+
+
+
Construit un arbre de décodage à partir des codes canoniques.
+
+
+
+
+
Cette methode sert de point d'entrer pour le decodage d'un pif.
+
+
+
+
+
Décode l'ensemble des pixels de l'image en utilisant les trois arbres
+ correspondant aux composantes rouge, verte et bleue.
+
+
static boolean
+
+
+
Vérifie si un fichier est un fichier .pif valide.
+
+
void
+
+
+
Lit les longueurs des code canoniques pour les trois composantes
+ rouge, vert et bleu.
+
+
void
+
+
+
Lit l'en-tête du fichier .pif.
+
+
+
+
+
Reconstruit les codes canoniques à partir des longueurs stockées dans le fichier.
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
+
+
+
+Method Details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mpif/PIFWriter.html b/docjava/fr/iutfbleau/sae/mpif/PIFWriter.html
new file mode 100644
index 0000000..d1dbe91
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mpif/PIFWriter.html
@@ -0,0 +1,294 @@
+
+
+
+
+PIFWriter
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+PIFWriter()
+
+
+Method Details
+
+writeTOFile(String, RGBImage, Map, Map, Map)
+writeHeader(BitOutputStream, int, int)
+writeTables(BitOutputStream, Map, Map, Map)
+encodePixels(BitOutputStream, RGBImage, Map, Map, Map)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
void
+
+
+
Encode chaque pixel de l'image en utilisant les codes canoniques.
+
+
void
+
+
+
Écrit l'en-tête du fichier PIF.
+
+
void
+
+
+
Écrit dans le fichier les longueurs des codes canoniques.
+
+
void
+
+
+
Sauvegarde une image au format PIF dans un fichier.
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
+
+
+
+Method Details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mpif/Pixel.html b/docjava/fr/iutfbleau/sae/mpif/Pixel.html
new file mode 100644
index 0000000..6d523b5
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mpif/Pixel.html
@@ -0,0 +1,266 @@
+
+
+
+
+Pixel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+Pixel(int, int, int)
+
+
+Method Details
+
+getB()
+getG()
+getR()
+setR(int)
+setB(int)
+setG(int)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
Pixel (int red,
+ int green,
+ int blue)
+
+
Crée un pixel avec ses trois composantes.
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
int
+
+
+
Retourne la composante bleue du pixel.
+
+
int
+
+
+
Retourne la composante verte du pixel.
+
+
int
+
+
+
Retourne la composante rouge du pixel.
+
+
void
+
+
+
Modifie la composante bleue du pixel.
+
+
void
+
+
+
Modifie la composante verte du pixel.
+
+
void
+
+
+
Modifie la composante rouge du pixel.
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
+
+
+
+Method Details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mpif/RGBImage.html b/docjava/fr/iutfbleau/sae/mpif/RGBImage.html
new file mode 100644
index 0000000..9e7e432
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mpif/RGBImage.html
@@ -0,0 +1,253 @@
+
+
+
+
+RGBImage
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Constructor Summary
+Method Summary
+Constructor Details
+
+RGBImage(int, int)
+
+
+Method Details
+
+getWidth()
+getHeight()
+setPixel(int, int, Pixel)
+getPixel(int, int)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Constructor Summary
+Constructors
+
+
+
+
+
+
Crée une image vide avec une largeur et une hauteur données.
+
+
+
+
+
+
+
+Method Summary
+
+
All Methods Instance Methods Concrete Methods
+
+
+
+
+
+
int
+
+
+
Retourne la hauteur de l'image.
+
+
+
+
+
Retourne le pixel situé aux coordonnées indiquées.
+
+
int
+
+
+
Retourne la largeur de l'image.
+
+
void
+
+
+
Place un pixel aux coordonnées indiquées.
+
+
+
+
+
+
Methods inherited from class java.lang.Object
+
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
+
+
+
+
+
+
+
+
+
+
+
+
+
+Method Details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mpif/package-summary.html b/docjava/fr/iutfbleau/sae/mpif/package-summary.html
new file mode 100644
index 0000000..db478db
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mpif/package-summary.html
@@ -0,0 +1,134 @@
+
+
+
+
+fr.iutfbleau.sae.mpif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Related Packages
+Classes and Interfaces
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Classes
+
+
+
+
+
+
Décorateur de flux permettant la lecture binaire à granularité du bit.
+
+
+
+
Décorateur de flux permettant l'écriture binaire à granularité du bit.
+
+
+
+
Comparateur utilisé pendant la reconstruction des codes canoniques.
+
+
+
+
Représente un nœud utilisé pour décoder les données dans un arbre binaire.
+
+
+
+
Cette classe permet de lire un fichier .pif et de reconstruire l'image d'origine.
+
+
+
+
Cette classe permet d'écrire une image au format PIF.
+
+
+
+
Cette classe représente un pixel composé de trois valeurs :
+ rouge, vert et bleu.
+
+
+
+
Cette classe représente une image composée de pixels RGB.
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/mpif/package-tree.html b/docjava/fr/iutfbleau/sae/mpif/package-tree.html
new file mode 100644
index 0000000..6ee4849
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/mpif/package-tree.html
@@ -0,0 +1,83 @@
+
+
+
+
+fr.iutfbleau.sae.mpif Class Hierarchy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+Package Hierarchies:
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/package-summary.html b/docjava/fr/iutfbleau/sae/package-summary.html
new file mode 100644
index 0000000..d906b5e
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/package-summary.html
@@ -0,0 +1,149 @@
+
+
+
+
+fr.iutfbleau.sae
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+Description
+Related Packages
+Classes and Interfaces
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Classes
+
+
+
+
+
+
Panneau d'affichage des codes Huffman et canoniques.
+
+
+
+
Controleur pour la conversion d'images au format PIF.
+
+
+
+
Fenêtre principale du convertisseur.
+
+
+
+
Point d'entree principal du programme de conversion d'images au format PIF.
+
+
+
+
+
+
Panneau qui affiche les fréquences des composantes rouge, verte et bleue.
+
+
+
+
+
+
Panneau d'aperçu de l'image.
+
+
+
+
Thread pour sauvegarder un fichier PIF en arriere-plan.
+
+
+
+
Classe principale qui lance l'application de visualisation d'images PIF.
+
+
+
+
Controleur du visualiseur d'images PIF.
+
+
+
+
Panneau personnalise pour afficher l'image.
+
+
+
+
Fenetre principale du visualiseur d'images PIF.
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/fr/iutfbleau/sae/package-tree.html b/docjava/fr/iutfbleau/sae/package-tree.html
new file mode 100644
index 0000000..eddddde
--- /dev/null
+++ b/docjava/fr/iutfbleau/sae/package-tree.html
@@ -0,0 +1,120 @@
+
+
+
+
+fr.iutfbleau.sae Class Hierarchy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+Package Hierarchies:
+
+
+
+
+
+
diff --git a/docjava/help-doc.html b/docjava/help-doc.html
new file mode 100644
index 0000000..41fa6f1
--- /dev/null
+++ b/docjava/help-doc.html
@@ -0,0 +1,183 @@
+
+
+
+
+API Help
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+JavaDoc Help
+
+Navigation
+
+Search
+
+
+Kinds of Pages
+
+Overview
+Package
+Class or Interface
+Other Files
+Tree (Class Hierarchy)
+Serialized Form
+All Packages
+All Classes and Interfaces
+Index
+
+
+
+
+
+
+
+JavaDoc Help
+
+
+
Navigation
+Starting from the
Overview page, you can browse the documentation using the links in each page, and in the navigation bar at the top of each page. The
Index and Search box allow you to navigate to specific declarations and summary pages, including:
All Packages ,
All Classes and Interfaces
+
+Search
+You can search for definitions of modules, packages, types, fields, methods, system properties and other terms defined in the API. These items can be searched using part or all of the name, optionally using "camelCase" abbreviations, or multiple search terms separated by whitespace. Some examples:
+
+"j.l.obj" matches "java.lang.Object"
+"InpStr" matches "java.io.InputStream"
+"math exact long" matches "java.lang.Math.absExact(long)"
+
+Refer to the Javadoc Search Specification for a full description of search features.
+
+
+
+
+
Kinds of Pages
+The following sections describe the different kinds of pages in this collection.
+
+Overview
+The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.
+
+
+Package
+Each package has a page that contains a list of its classes and interfaces, with a summary for each. These pages may contain the following categories:
+
+Interfaces
+Classes
+Enum Classes
+Exception Classes
+Annotation Interfaces
+
+
+
+Class or Interface
+Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a declaration and description, member summary tables, and detailed member descriptions. Entries in each of these sections are omitted if they are empty or not applicable.
+
+Class Inheritance Diagram
+Direct Subclasses
+All Known Subinterfaces
+All Known Implementing Classes
+Class or Interface Declaration
+Class or Interface Description
+
+
+
+Nested Class Summary
+Enum Constant Summary
+Field Summary
+Property Summary
+Constructor Summary
+Method Summary
+Required Element Summary
+Optional Element Summary
+
+
+
+Enum Constant Details
+Field Details
+Property Details
+Constructor Details
+Method Details
+Element Details
+
+Note: Annotation interfaces have required and optional elements, but not methods. Only enum classes have enum constants. The components of a record class are displayed as part of the declaration of the record class. Properties are a feature of JavaFX.
+The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
+
+
+Other Files
+Packages and modules may contain pages with additional information related to the declarations nearby.
+
+
+Tree (Class Hierarchy)
+There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. Classes are organized by inheritance structure starting with java.lang.Object. Interfaces do not inherit from java.lang.Object.
+
+When viewing the Overview page, clicking on TREE displays the hierarchy for all packages.
+When viewing a particular package, class or interface page, clicking on TREE displays the hierarchy for only that package.
+
+
+
+
+All Packages
+The All Packages page contains an alphabetic index of all packages contained in the documentation.
+
+
+All Classes and Interfaces
+The All Classes and Interfaces page contains an alphabetic index of all classes and interfaces contained in the documentation, including annotation interfaces, enum classes, and record classes.
+
+
+
+
+
+
+
+
diff --git a/docjava/index-all.html b/docjava/index-all.html
new file mode 100644
index 0000000..15c8f3d
--- /dev/null
+++ b/docjava/index-all.html
@@ -0,0 +1,657 @@
+
+
+
+
+Index
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+A B C D E F G H I L M P R S T U V W All Classes and Interfaces | All Packages | Serialized Form
+A
+
+actionPerformed(ActionEvent) - Method in class fr.iutfbleau.sae.ExportButtonListener
+
+addSaveButton(ConverterController) - Method in class fr.iutfbleau.sae.ConverterWindow
+
+Ajoute un bouton permettant d'exporter l'image en .pif.
+
+afficherErreur(String) - Static method in class fr.iutfbleau.sae.GestionErreur
+
+afficherInfo(String) - Static method in class fr.iutfbleau.sae.GestionErreur
+
+
+B
+
+BitInputStream - Class in fr.iutfbleau.sae.mpif
+
+Décorateur de flux permettant la lecture binaire à granularité du bit.
+
+BitInputStream(InputStream) - Constructor for class fr.iutfbleau.sae.mpif.BitInputStream
+
+Construit un lecteur binaire à partir d'un flux existant.
+
+BitOutputStream - Class in fr.iutfbleau.sae.mpif
+
+Décorateur de flux permettant l'écriture binaire à granularité du bit.
+
+BitOutputStream(OutputStream) - Constructor for class fr.iutfbleau.sae.mpif.BitOutputStream
+
+Construit un écrivain binaire à partir d'un flux existant.
+
+buildDecodageTree(Map<String, Integer>) - Method in class fr.iutfbleau.sae.mpif.PIFReader
+
+Construit un arbre de décodage à partir des codes canoniques.
+
+
+C
+
+CanonicalCode - Class in fr.iutfbleau.sae.mhuffman
+
+Classe pour generer des codes canoniques de Huffman.
+
+CanonicalCode() - Constructor for class fr.iutfbleau.sae.mhuffman.CanonicalCode
+
+closeFlux() - Method in class fr.iutfbleau.sae.mpif.BitInputStream
+
+Ferme le flux d'entrée sous-jacent.
+
+CodeTablePanel - Class in fr.iutfbleau.sae
+
+Panneau d'affichage des codes Huffman et canoniques.
+
+CodeTablePanel() - Constructor for class fr.iutfbleau.sae.CodeTablePanel
+
+Constructeur qui initialise l'interface utilisateur.
+
+ComparateurCanonique - Class in fr.iutfbleau.sae.mhuffman
+
+Comparateur utilisé lors de la génération des codes canoniques.
+
+ComparateurCanonique() - Constructor for class fr.iutfbleau.sae.mhuffman.ComparateurCanonique
+
+ComparateurEntreeCanonique - Class in fr.iutfbleau.sae.mpif
+
+Comparateur utilisé pendant la reconstruction des codes canoniques.
+
+ComparateurEntreeCanonique() - Constructor for class fr.iutfbleau.sae.mpif.ComparateurEntreeCanonique
+
+ComparateurHuffmanNode - Class in fr.iutfbleau.sae.mhuffman
+
+Comparateur utilisé pour trier les nœuds de l'arbre de Huffman.
+
+ComparateurHuffmanNode() - Constructor for class fr.iutfbleau.sae.mhuffman.ComparateurHuffmanNode
+
+compare(HuffmanNode, HuffmanNode) - Method in class fr.iutfbleau.sae.mhuffman.ComparateurHuffmanNode
+
+Compare deux nœuds en fonction de leur fréquence.
+
+compare(Map.Entry<Integer, Integer>, Map.Entry<Integer, Integer>) - Method in class fr.iutfbleau.sae.mpif.ComparateurEntreeCanonique
+
+Compare deux entrées contenant chacune un symbole et sa longueur de code.
+
+compare(Map.Entry<Integer, String>, Map.Entry<Integer, String>) - Method in class fr.iutfbleau.sae.mhuffman.ComparateurCanonique
+
+Compare deux entrées contenant un symbole et son code Huffman.
+
+computeCanonical() - Method in class fr.iutfbleau.sae.ConverterController
+
+Genere les codes canoniques a partir des codes de Huffman.
+
+computeFrequencies() - Method in class fr.iutfbleau.sae.ConverterController
+
+Calcule les frequences d'apparition de chaque valeur RGB dans l'image.
+
+computeFromImage(RGBImage) - Method in class fr.iutfbleau.sae.mhuffman.FrequencyTable
+
+Analyse une image et remplit les tableaux de fréquences.
+
+computeHuffman() - Method in class fr.iutfbleau.sae.ConverterController
+
+Genere les arbres de Huffman pour chaque composante RGB.
+
+conversionProcess() - Method in class fr.iutfbleau.sae.ConverterController
+
+Lance le processus complet de conversion d'une image au format PIF.
+
+ConverterController - Class in fr.iutfbleau.sae
+
+Controleur pour la conversion d'images au format PIF.
+
+ConverterController(ConverterWindow, String, String) - Constructor for class fr.iutfbleau.sae.ConverterController
+
+Construit un nouveau controleur de conversion.
+
+ConverterWindow - Class in fr.iutfbleau.sae
+
+Fenêtre principale du convertisseur.
+
+ConverterWindow() - Constructor for class fr.iutfbleau.sae.ConverterWindow
+
+Constructeur de la fenêtre du convertisseur.
+
+Convertisseur - Class in fr.iutfbleau.sae
+
+Point d'entree principal du programme de conversion d'images au format PIF.
+
+Convertisseur() - Constructor for class fr.iutfbleau.sae.Convertisseur
+
+
+D
+
+DecodeNode - Class in fr.iutfbleau.sae.mpif
+
+Représente un nœud utilisé pour décoder les données dans un arbre binaire.
+
+DecodeNode() - Constructor for class fr.iutfbleau.sae.mpif.DecodeNode
+
+Constructeur d'un nœud interne vide.
+
+DecodeNode(DecodeNode, DecodeNode, Integer) - Constructor for class fr.iutfbleau.sae.mpif.DecodeNode
+
+Constructeur d'un nœud complet, utilisé pour créer une feuille ou un nœud interne.
+
+decodePifFile(File) - Method in class fr.iutfbleau.sae.mpif.PIFReader
+
+Cette methode sert de point d'entrer pour le decodage d'un pif.
+
+decodePixels(BitInputStream, DecodeNode, DecodeNode, DecodeNode) - Method in class fr.iutfbleau.sae.mpif.PIFReader
+
+Décode l'ensemble des pixels de l'image en utilisant les trois arbres
+ correspondant aux composantes rouge, verte et bleue.
+
+displayImage(BufferedImage) - Method in class fr.iutfbleau.sae.ViewerWindow
+
+Affiche une image dans la fenetre.
+
+
+E
+
+encodePixels(BitOutputStream, RGBImage, Map<Integer, String>, Map<Integer, String>, Map<Integer, String>) - Method in class fr.iutfbleau.sae.mpif.PIFWriter
+
+Encode chaque pixel de l'image en utilisant les codes canoniques.
+
+ExportButtonListener - Class in fr.iutfbleau.sae
+
+ExportButtonListener(ConverterController) - Constructor for class fr.iutfbleau.sae.ExportButtonListener
+
+
+F
+
+fermerFlux() - Method in class fr.iutfbleau.sae.mpif.BitOutputStream
+
+Vide les buffers internes et ferme le flux de sortie.
+
+flush() - Method in class fr.iutfbleau.sae.mpif.BitOutputStream
+
+Force l'écriture immédiate des données accumulées dans le flux sous-jacent.
+
+fr.iutfbleau.sae - package fr.iutfbleau.sae
+
+fr.iutfbleau.sae.mhuffman - package fr.iutfbleau.sae.mhuffman
+
+fr.iutfbleau.sae.mpif - package fr.iutfbleau.sae.mpif
+
+FrequencyTable - Class in fr.iutfbleau.sae.mhuffman
+
+Classe qui calcule les fréquences des valeurs de couleur dans une image RGB.
+
+FrequencyTable() - Constructor for class fr.iutfbleau.sae.mhuffman.FrequencyTable
+
+Constructeur qui initialise les trois tableaux de fréquences
+ à zéro pour toutes les valeurs possibles.
+
+FrequencyTablePanel - Class in fr.iutfbleau.sae
+
+Panneau qui affiche les fréquences des composantes rouge, verte et bleue.
+
+FrequencyTablePanel() - Constructor for class fr.iutfbleau.sae.FrequencyTablePanel
+
+Constructeur du panneau.
+
+
+G
+
+generateCodes() - Method in class fr.iutfbleau.sae.mhuffman.HuffmanTree
+
+Lance la génération des codes Huffman en parcourant l'arbre.
+
+generateCodes(Map<Integer, String>) - Method in class fr.iutfbleau.sae.mhuffman.CanonicalCode
+
+Genere des codes canoniques a partir de codes de Huffman.
+
+GestionErreur - Class in fr.iutfbleau.sae
+
+GestionErreur() - Constructor for class fr.iutfbleau.sae.GestionErreur
+
+getB() - Method in class fr.iutfbleau.sae.mpif.Pixel
+
+Retourne la composante bleue du pixel.
+
+getBlue() - Method in class fr.iutfbleau.sae.mhuffman.FrequencyTable
+
+Renvoie les fréquences des valeurs bleues.
+
+getCode(Map<Integer, String>, int) - Method in class fr.iutfbleau.sae.mhuffman.CanonicalCode
+
+Recupere le code canonique d'une valeur.
+
+getCodes() - Method in class fr.iutfbleau.sae.mhuffman.HuffmanTree
+
+Retourne les codes Huffman générés.
+
+getFrequence() - Method in class fr.iutfbleau.sae.mhuffman.HuffmanNode
+
+Renvoie la fréquence associée à ce nœud.
+
+getG() - Method in class fr.iutfbleau.sae.mpif.Pixel
+
+Retourne la composante verte du pixel.
+
+getGreen() - Method in class fr.iutfbleau.sae.mhuffman.FrequencyTable
+
+Renvoie les fréquences des valeurs vertes.
+
+getHeight() - Method in class fr.iutfbleau.sae.mpif.RGBImage
+
+Retourne la hauteur de l'image.
+
+getImage() - Method in class fr.iutfbleau.sae.ConverterController
+
+Retourne l'image actuellement chargee.
+
+getLeft() - Method in class fr.iutfbleau.sae.mhuffman.HuffmanNode
+
+Renvoie le fils gauche.
+
+getLength(Map<Integer, String>, int) - Method in class fr.iutfbleau.sae.mhuffman.CanonicalCode
+
+Recupere la longueur d'un code pour une valeur donnee.
+
+getPixel(int, int) - Method in class fr.iutfbleau.sae.mpif.RGBImage
+
+Retourne le pixel situé aux coordonnées indiquées.
+
+getR() - Method in class fr.iutfbleau.sae.mpif.Pixel
+
+Retourne la composante rouge du pixel.
+
+getRed() - Method in class fr.iutfbleau.sae.mhuffman.FrequencyTable
+
+Renvoie les fréquences des valeurs rouges.
+
+getRight() - Method in class fr.iutfbleau.sae.mhuffman.HuffmanNode
+
+Renvoie le fils droit.
+
+getRoot() - Method in class fr.iutfbleau.sae.mhuffman.HuffmanTree
+
+Permet de récupérer la racine de l'arbre.
+
+getValue() - Method in class fr.iutfbleau.sae.mhuffman.HuffmanNode
+
+Renvoie la valeur du symbole représenté.
+
+getWidth() - Method in class fr.iutfbleau.sae.mpif.RGBImage
+
+Retourne la largeur de l'image.
+
+
+H
+
+HuffmanNode - Class in fr.iutfbleau.sae.mhuffman
+
+Représente un nœud de l'arbre de Huffman.
+
+HuffmanNode(int, int) - Constructor for class fr.iutfbleau.sae.mhuffman.HuffmanNode
+
+Constructeur d'un nœud feuille.
+
+HuffmanNode(HuffmanNode, HuffmanNode) - Constructor for class fr.iutfbleau.sae.mhuffman.HuffmanNode
+
+Constructeur d'un nœud interne (créé lors de la fusion de deux sous-arbres).
+
+HuffmanTree - Class in fr.iutfbleau.sae.mhuffman
+
+Cette classe construit un arbre de Huffman à partir d'un tableau
+ de fréquences.
+
+HuffmanTree(int[]) - Constructor for class fr.iutfbleau.sae.mhuffman.HuffmanTree
+
+Construit l'arbre de Huffman à partir d'un tableau de fréquences.
+
+
+I
+
+ImagePreviewPanel - Class in fr.iutfbleau.sae
+
+Panneau d'aperçu de l'image.
+
+ImagePreviewPanel() - Constructor for class fr.iutfbleau.sae.ImagePreviewPanel
+
+Constructeur du panneau d'aperçu.
+
+isLeaf() - Method in class fr.iutfbleau.sae.mhuffman.HuffmanNode
+
+Indique si le nœud est une feuille.
+
+isLeaf() - Method in class fr.iutfbleau.sae.mpif.DecodeNode
+
+Indique si le nœud est une feuille (aucun enfant).
+
+isPIFFile(File) - Static method in class fr.iutfbleau.sae.mpif.PIFReader
+
+Vérifie si un fichier est un fichier .pif valide.
+
+
+L
+
+left - Variable in class fr.iutfbleau.sae.mpif.DecodeNode
+
+Fils gauche du nœud.
+
+loadImage(File) - Method in class fr.iutfbleau.sae.ConverterController
+
+Charge une image depuis un fichier et la convertit en RGBImage.
+
+loadPIF() - Method in class fr.iutfbleau.sae.ViewerControleur
+
+Charge et affiche un fichier PIF.
+
+
+M
+
+main(String[]) - Static method in class fr.iutfbleau.sae.Convertisseur
+
+Methode principale qui demarre l'application de conversion.
+
+main(String[]) - Static method in class fr.iutfbleau.sae.Viewer
+
+Point d'entree de l'application.
+
+mouseClicked(MouseEvent) - Method in class fr.iutfbleau.sae.ViewerImagePanel
+
+mouseDragged(MouseEvent) - Method in class fr.iutfbleau.sae.ViewerImagePanel
+
+Detecte quand l'utilisateur fait glisser la souris.
+
+mouseEntered(MouseEvent) - Method in class fr.iutfbleau.sae.ViewerImagePanel
+
+mouseExited(MouseEvent) - Method in class fr.iutfbleau.sae.ViewerImagePanel
+
+mouseMoved(MouseEvent) - Method in class fr.iutfbleau.sae.ViewerImagePanel
+
+mousePressed(MouseEvent) - Method in class fr.iutfbleau.sae.ViewerImagePanel
+
+Detecte quand l'utilisateur appuie sur le bouton de la souris.
+
+mouseReleased(MouseEvent) - Method in class fr.iutfbleau.sae.ViewerImagePanel
+
+
+P
+
+paintComponent(Graphics) - Method in class fr.iutfbleau.sae.ImagePreviewPanel
+
+Affiche l'image dans le panneau.
+
+paintComponent(Graphics) - Method in class fr.iutfbleau.sae.ViewerImagePanel
+
+Methode de dessin du panneau.
+
+PIFReader - Class in fr.iutfbleau.sae.mpif
+
+Cette classe permet de lire un fichier .pif et de reconstruire l'image d'origine.
+
+PIFReader() - Constructor for class fr.iutfbleau.sae.mpif.PIFReader
+
+PIFWriter - Class in fr.iutfbleau.sae.mpif
+
+Cette classe permet d'écrire une image au format PIF.
+
+PIFWriter() - Constructor for class fr.iutfbleau.sae.mpif.PIFWriter
+
+Pixel - Class in fr.iutfbleau.sae.mpif
+
+Cette classe représente un pixel composé de trois valeurs :
+ rouge, vert et bleu.
+
+Pixel(int, int, int) - Constructor for class fr.iutfbleau.sae.mpif.Pixel
+
+Crée un pixel avec ses trois composantes.
+
+
+R
+
+readBit() - Method in class fr.iutfbleau.sae.mpif.BitInputStream
+
+Lit un bit depuis le flux binaire.
+
+readBits(int) - Method in class fr.iutfbleau.sae.mpif.BitInputStream
+
+Lit une séquence de bits consécutifs et les assemble dans un entier.
+
+readCanonicalTables(BitInputStream) - Method in class fr.iutfbleau.sae.mpif.PIFReader
+
+Lit les longueurs des code canoniques pour les trois composantes
+ rouge, vert et bleu.
+
+readHeader(BitInputStream) - Method in class fr.iutfbleau.sae.mpif.PIFReader
+
+Lit l'en-tête du fichier .pif.
+
+rebuildCanonical(int[]) - Method in class fr.iutfbleau.sae.mpif.PIFReader
+
+Reconstruit les codes canoniques à partir des longueurs stockées dans le fichier.
+
+RGBImage - Class in fr.iutfbleau.sae.mpif
+
+Cette classe représente une image composée de pixels RGB.
+
+RGBImage(int, int) - Constructor for class fr.iutfbleau.sae.mpif.RGBImage
+
+Crée une image vide avec une largeur et une hauteur données.
+
+right - Variable in class fr.iutfbleau.sae.mpif.DecodeNode
+
+Fils droit du nœud.
+
+run() - Method in class fr.iutfbleau.sae.ThreadSauvegardePIF
+
+Execute la sauvegarde du fichier PIF.
+
+
+S
+
+saveAsPIF(String) - Method in class fr.iutfbleau.sae.ConverterController
+
+Sauvegarde l'image au format PIF.
+
+saveViaBtn() - Method in class fr.iutfbleau.sae.ConverterController
+
+Gere la sauvegarde via le bouton de l'interface.
+
+setB(int) - Method in class fr.iutfbleau.sae.mpif.Pixel
+
+Modifie la composante bleue du pixel.
+
+setCanonicalTable(Map<Integer, String>, Map<Integer, String>, Map<Integer, String>) - Method in class fr.iutfbleau.sae.ConverterWindow
+
+Met à jour l'affichage des codes canoniques.
+
+setFrequencyTable(int[], int[], int[]) - Method in class fr.iutfbleau.sae.ConverterWindow
+
+Met à jour l'affichage des fréquences des trois composantes.
+
+setG(int) - Method in class fr.iutfbleau.sae.mpif.Pixel
+
+Modifie la composante verte du pixel.
+
+setHuffmanTable(Map<Integer, String>, Map<Integer, String>, Map<Integer, String>) - Method in class fr.iutfbleau.sae.ConverterWindow
+
+Met à jour l'affichage des codes Huffman.
+
+setImage(BufferedImage) - Method in class fr.iutfbleau.sae.ImagePreviewPanel
+
+Met à jour l'image à afficher et demande le rafraîchissement du panneau.
+
+setImage(BufferedImage) - Method in class fr.iutfbleau.sae.ViewerImagePanel
+
+Definit l'image a afficher et reinitialise le decalage.
+
+setImagePreview(BufferedImage) - Method in class fr.iutfbleau.sae.ConverterWindow
+
+Affiche l'image chargée dans le panneau d'aperçu.
+
+setPixel(int, int, Pixel) - Method in class fr.iutfbleau.sae.mpif.RGBImage
+
+Place un pixel aux coordonnées indiquées.
+
+setR(int) - Method in class fr.iutfbleau.sae.mpif.Pixel
+
+Modifie la composante rouge du pixel.
+
+
+T
+
+ThreadSauvegardePIF - Class in fr.iutfbleau.sae
+
+Thread pour sauvegarder un fichier PIF en arriere-plan.
+
+ThreadSauvegardePIF(ConverterController, File) - Constructor for class fr.iutfbleau.sae.ThreadSauvegardePIF
+
+Construit un nouveau thread de sauvegarde.
+
+toString() - Method in class fr.iutfbleau.sae.mhuffman.HuffmanNode
+
+Représentation textuelle du nœud.
+
+
+U
+
+updateCanonicalCodes(Map<Integer, String>, Map<Integer, String>, Map<Integer, String>) - Method in class fr.iutfbleau.sae.CodeTablePanel
+
+Met à jour l'affichage des codes canoniques.
+
+updateCodes(Map<Integer, String>, Map<Integer, String>, Map<Integer, String>) - Method in class fr.iutfbleau.sae.CodeTablePanel
+
+Met à jour l'affichage des codes Huffman.
+
+updateFrequencies(int[], int[], int[]) - Method in class fr.iutfbleau.sae.FrequencyTablePanel
+
+Met à jour les trois zones d'affichage avec les nouvelles valeurs.
+
+
+V
+
+value - Variable in class fr.iutfbleau.sae.mpif.DecodeNode
+
+Valeur associée à la feuille.
+
+Viewer - Class in fr.iutfbleau.sae
+
+Classe principale qui lance l'application de visualisation d'images PIF.
+
+Viewer() - Constructor for class fr.iutfbleau.sae.Viewer
+
+ViewerControleur - Class in fr.iutfbleau.sae
+
+Controleur du visualiseur d'images PIF.
+
+ViewerControleur(ViewerWindow, String) - Constructor for class fr.iutfbleau.sae.ViewerControleur
+
+Constructeur du controleur.
+
+ViewerImagePanel - Class in fr.iutfbleau.sae
+
+Panneau personnalise pour afficher l'image.
+
+ViewerImagePanel() - Constructor for class fr.iutfbleau.sae.ViewerImagePanel
+
+Constructeur du panneau.
+
+ViewerWindow - Class in fr.iutfbleau.sae
+
+Fenetre principale du visualiseur d'images PIF.
+
+ViewerWindow() - Constructor for class fr.iutfbleau.sae.ViewerWindow
+
+Constructeur de la fenetre.
+
+
+W
+
+writeBit(int) - Method in class fr.iutfbleau.sae.mpif.BitOutputStream
+
+Écrit un bit dans le flux binaire.
+
+writeBits(int, int) - Method in class fr.iutfbleau.sae.mpif.BitOutputStream
+
+Écrit une séquence de bits correspondant à une valeur entière.
+
+writeBitString(String) - Method in class fr.iutfbleau.sae.mpif.BitOutputStream
+
+Écrit une séquence de bits à partir d'une chaîne de '0' et '1'.
+
+writeHeader(BitOutputStream, int, int) - Method in class fr.iutfbleau.sae.mpif.PIFWriter
+
+Écrit l'en-tête du fichier PIF.
+
+writeTables(BitOutputStream, Map<Integer, String>, Map<Integer, String>, Map<Integer, String>) - Method in class fr.iutfbleau.sae.mpif.PIFWriter
+
+Écrit dans le fichier les longueurs des codes canoniques.
+
+writeTOFile(String, RGBImage, Map<Integer, String>, Map<Integer, String>, Map<Integer, String>) - Method in class fr.iutfbleau.sae.mpif.PIFWriter
+
+Sauvegarde une image au format PIF dans un fichier.
+
+
+A B C D E F G H I L M P R S T U V W All Classes and Interfaces | All Packages | Serialized Form
+
+
+
diff --git a/docjava/index.html b/docjava/index.html
new file mode 100644
index 0000000..713478d
--- /dev/null
+++ b/docjava/index.html
@@ -0,0 +1,69 @@
+
+
+
+
+Overview
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
diff --git a/docjava/legal/COPYRIGHT b/docjava/legal/COPYRIGHT
new file mode 100644
index 0000000..7a42888
--- /dev/null
+++ b/docjava/legal/COPYRIGHT
@@ -0,0 +1,69 @@
+Copyright © 1993, 2025, Oracle and/or its affiliates.
+All rights reserved.
+
+This software and related documentation are provided under a
+license agreement containing restrictions on use and
+disclosure and are protected by intellectual property laws.
+Except as expressly permitted in your license agreement or
+allowed by law, you may not use, copy, reproduce, translate,
+broadcast, modify, license, transmit, distribute, exhibit,
+perform, publish, or display any part, in any form, or by
+any means. Reverse engineering, disassembly, or
+decompilation of this software, unless required by law for
+interoperability, is prohibited.
+
+The information contained herein is subject to change
+without notice and is not warranted to be error-free. If you
+find any errors, please report them to us in writing.
+
+If this is software or related documentation that is
+delivered to the U.S. Government or anyone licensing it on
+behalf of the U.S. Government, the following notice is
+applicable:
+
+U.S. GOVERNMENT END USERS: Oracle programs, including any
+operating system, integrated software, any programs
+installed on the hardware, and/or documentation, delivered
+to U.S. Government end users are "commercial computer
+software" pursuant to the applicable Federal Acquisition
+Regulation and agency-specific supplemental regulations. As
+such, use, duplication, disclosure, modification, and
+adaptation of the programs, including any operating system,
+integrated software, any programs installed on the hardware,
+and/or documentation, shall be subject to license terms and
+license restrictions applicable to the programs. No other
+rights are granted to the U.S. Government.
+
+This software or hardware is developed for general use in a
+variety of information management applications. It is not
+developed or intended for use in any inherently dangerous
+applications, including applications that may create a risk
+of personal injury. If you use this software or hardware in
+dangerous applications, then you shall be responsible to
+take all appropriate fail-safe, backup, redundancy, and
+other measures to ensure its safe use. Oracle Corporation
+and its affiliates disclaim any liability for any damages
+caused by use of this software or hardware in dangerous
+applications.
+
+Oracle and Java are registered trademarks of Oracle and/or
+its affiliates. Other names may be trademarks of their
+respective owners.
+
+Intel and Intel Xeon are trademarks or registered trademarks
+of Intel Corporation. All SPARC trademarks are used under
+license and are trademarks or registered trademarks of SPARC
+International, Inc. AMD, Opteron, the AMD logo, and the AMD
+Opteron logo are trademarks or registered trademarks of
+Advanced Micro Devices. UNIX is a registered trademark of
+The Open Group.
+
+This software or hardware and documentation may provide
+access to or information on content, products, and services
+from third parties. Oracle Corporation and its affiliates
+are not responsible for and expressly disclaim all
+warranties of any kind with respect to third-party content,
+products, and services. Oracle Corporation and its
+affiliates will not be responsible for any loss, costs, or
+damages incurred due to your access to or use of third-party
+content, products, or services.
diff --git a/docjava/legal/LICENSE b/docjava/legal/LICENSE
new file mode 100644
index 0000000..ee860d3
--- /dev/null
+++ b/docjava/legal/LICENSE
@@ -0,0 +1,118 @@
+Your use of this Program is governed by the No-Fee Terms and Conditions set
+forth below, unless you have received this Program (alone or as part of another
+Oracle product) under an Oracle license agreement (including but not limited to
+the Oracle Master Agreement), in which case your use of this Program is governed
+solely by such license agreement with Oracle.
+
+Oracle No-Fee Terms and Conditions (NFTC)
+
+Definitions
+
+"Oracle" refers to Oracle America, Inc. "You" and "Your" refers to (a) a company
+or organization (each an "Entity") accessing the Programs, if use of the
+Programs will be on behalf of such Entity; or (b) an individual accessing the
+Programs, if use of the Programs will not be on behalf of an Entity.
+"Program(s)" refers to Oracle software provided by Oracle pursuant to the
+following terms and any updates, error corrections, and/or Program Documentation
+provided by Oracle. "Program Documentation" refers to Program user manuals and
+Program installation manuals, if any. If available, Program Documentation may be
+delivered with the Programs and/or may be accessed from
+www.oracle.com/documentation. "Separate Terms" refers to separate license terms
+that are specified in the Program Documentation, readmes or notice files and
+that apply to Separately Licensed Technology. "Separately Licensed Technology"
+refers to Oracle or third party technology that is licensed under Separate Terms
+and not under the terms of this license.
+
+Separately Licensed Technology
+
+Oracle may provide certain notices to You in Program Documentation, readmes or
+notice files in connection with Oracle or third party technology provided as or
+with the Programs. If specified in the Program Documentation, readmes or notice
+files, such technology will be licensed to You under Separate Terms. Your rights
+to use Separately Licensed Technology under Separate Terms are not restricted in
+any way by the terms herein. For clarity, notwithstanding the existence of a
+notice, third party technology that is not Separately Licensed Technology shall
+be deemed part of the Programs licensed to You under the terms of this license.
+
+Source Code for Open Source Software
+
+For software that You receive from Oracle in binary form that is licensed under
+an open source license that gives You the right to receive the source code for
+that binary, You can obtain a copy of the applicable source code from
+https://oss.oracle.com/sources/ or http://www.oracle.com/goto/opensourcecode. If
+the source code for such software was not provided to You with the binary, You
+can also receive a copy of the source code on physical media by submitting a
+written request pursuant to the instructions in the "Written Offer for Source
+Code" section of the latter website.
+
+-------------------------------------------------------------------------------
+
+The following license terms apply to those Programs that are not provided to You
+under Separate Terms.
+
+License Rights and Restrictions
+
+Oracle grants to You, as a recipient of this Program, subject to the conditions
+stated herein, a nonexclusive, nontransferable, limited license to:
+
+(a) internally use the unmodified Programs for the purposes of developing,
+testing, prototyping and demonstrating your applications, and running the
+Program for Your own personal use or internal business operations; and
+
+(b) redistribute the unmodified Program and Program Documentation, under the
+terms of this License, provided that You do not charge Your licensees any fees
+associated with such distribution or use of the Program, including, without
+limitation, fees for products that include or are bundled with a copy of the
+Program or for services that involve the use of the distributed Program.
+
+You may make copies of the Programs to the extent reasonably necessary for
+exercising the license rights granted herein and for backup purposes. You are
+granted the right to use the Programs to provide third party training in the use
+of the Programs and associated Separately Licensed Technology only if there is
+express authorization of such use by Oracle on the Program's download page or in
+the Program Documentation.
+
+Your license is contingent on compliance with the following conditions:
+
+- You do not remove markings or notices of either Oracle's or a licensor's
+ proprietary rights from the Programs or Program Documentation;
+
+- You comply with all U.S. and applicable export control and economic sanctions
+ laws and regulations that govern Your use of the Programs (including technical
+ data);
+
+- You do not cause or permit reverse engineering, disassembly or decompilation
+ of the Programs (except as allowed by law) by You nor allow an associated
+ party to do so.
+
+For clarity, any source code that may be included in the distribution with the
+Programs is provided solely for reference purposes and may not be modified,
+unless such source code is under Separate Terms permitting modification.
+
+Ownership
+
+Oracle or its licensors retain all ownership and intellectual property rights to
+the Programs.
+
+Information Collection
+
+The Programs' installation and/or auto-update processes, if any, may transmit a
+limited amount of data to Oracle or its service provider about those processes
+to help Oracle understand and optimize them. Oracle does not associate the data
+with personally identifiable information. Refer to Oracle's Privacy Policy at
+www.oracle.com/privacy.
+
+Disclaimer of Warranties; Limitation of Liability
+
+THE PROGRAMS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. ORACLE FURTHER
+DISCLAIMS ALL WARRANTIES, EXPRESS AND IMPLIED, INCLUDING WITHOUT LIMITATION, ANY
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+NONINFRINGEMENT.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL ORACLE BE LIABLE TO YOU FOR
+DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT
+LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
diff --git a/docjava/legal/dejavufonts.md b/docjava/legal/dejavufonts.md
new file mode 100644
index 0000000..8c9e3cf
--- /dev/null
+++ b/docjava/legal/dejavufonts.md
@@ -0,0 +1,191 @@
+## DejaVu fonts v2.37
+
+### DejaVu License
+
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
+
+
+Bitstream Vera Fonts Copyright
+------------------------------
+
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
+a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated
+documentation files (the "Font Software"), to reproduce and distribute the
+Font Software, including without limitation the rights to use, copy, merge,
+publish, distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to the
+following conditions:
+
+The above copyright and trademark notices and this permission notice shall
+be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the fonts
+are renamed to names not containing either the words "Bitstream" or the word
+"Vera".
+
+This License becomes null and void to the extent applicable to Fonts or Font
+Software that has been modified and is distributed under the "Bitstream
+Vera" names.
+
+The Font Software may be sold as part of a larger software package but no
+copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
+FONT SOFTWARE.
+
+Except as contained in this notice, the names of Gnome, the Gnome
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the Gnome Foundation or Bitstream
+Inc., respectively. For further information, contact: fonts at gnome dot
+org.
+
+Arev Fonts Copyright
+------------------------------
+
+Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the fonts accompanying this license ("Fonts") and
+associated documentation files (the "Font Software"), to reproduce
+and distribute the modifications to the Bitstream Vera Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software
+typefaces.
+
+The Font Software may be modified, altered, or added to, and in
+particular the designs of glyphs or characters in the Fonts may be
+modified and additional glyphs or characters may be added to the
+Fonts, only if the fonts are renamed to names not containing either
+the words "Tavmjong Bah" or the word "Arev".
+
+This License becomes null and void to the extent applicable to Fonts
+or Font Software that has been modified and is distributed under the
+"Tavmjong Bah Arev" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by
+itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
+TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the name of Tavmjong Bah shall not
+be used in advertising or otherwise to promote the sale, use or other
+dealings in this Font Software without prior written authorization
+from Tavmjong Bah. For further information, contact: tavmjong @ free
+. fr.
+
+TeX Gyre DJV Math
+-----------------
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+
+Math extensions done by B. Jackowski, P. Strzelczyk and P. Pianowski
+(on behalf of TeX users groups) are in public domain.
+
+Letters imported from Euler Fraktur from AMSfonts are (c) American
+Mathematical Society (see below).
+Bitstream Vera Fonts Copyright
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera
+is a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated
+documentation
+files (the "Font Software"), to reproduce and distribute the Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute,
+and/or sell copies of the Font Software, and to permit persons to whom
+the Font Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be
+included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional
+glyphs or characters may be added to the Fonts, only if the fonts are
+renamed
+to names not containing either the words "Bitstream" or the word "Vera".
+
+This License becomes null and void to the extent applicable to Fonts or
+Font Software
+that has been modified and is distributed under the "Bitstream Vera"
+names.
+
+The Font Software may be sold as part of a larger software package but
+no copy
+of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION
+BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL,
+SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN
+ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR
+INABILITY TO USE
+THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
+Except as contained in this notice, the names of GNOME, the GNOME
+Foundation,
+and Bitstream Inc., shall not be used in advertising or otherwise to promote
+the sale, use or other dealings in this Font Software without prior written
+authorization from the GNOME Foundation or Bitstream Inc., respectively.
+For further information, contact: fonts at gnome dot org.
+
+AMSFonts (v. 2.2) copyright
+
+The PostScript Type 1 implementation of the AMSFonts produced by and
+previously distributed by Blue Sky Research and Y&Y, Inc. are now freely
+available for general use. This has been accomplished through the
+cooperation
+of a consortium of scientific publishers with Blue Sky Research and Y&Y.
+Members of this consortium include:
+
+Elsevier Science IBM Corporation Society for Industrial and Applied
+Mathematics (SIAM) Springer-Verlag American Mathematical Society (AMS)
+
+In order to assure the authenticity of these fonts, copyright will be
+held by
+the American Mathematical Society. This is not meant to restrict in any way
+the legitimate use of the fonts, such as (but not limited to) electronic
+distribution of documents containing these fonts, inclusion of these fonts
+into other public domain or commercial font collections or computer
+applications, use of the outline data to create derivative fonts and/or
+faces, etc. However, the AMS does require that the AMS copyright notice be
+removed from any derivative versions of the fonts which have been altered in
+any way. In addition, to ensure the fidelity of TeX documents using Computer
+Modern fonts, Professor Donald Knuth, creator of the Computer Modern faces,
+has requested that any alterations which yield different font metrics be
+given a different name.
+
+
diff --git a/docjava/legal/jquery.md b/docjava/legal/jquery.md
new file mode 100644
index 0000000..a763ec6
--- /dev/null
+++ b/docjava/legal/jquery.md
@@ -0,0 +1,26 @@
+## jQuery v3.7.1
+
+### jQuery License
+```
+jQuery v 3.7.1
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+```
diff --git a/docjava/legal/jqueryUI.md b/docjava/legal/jqueryUI.md
new file mode 100644
index 0000000..8bda9d7
--- /dev/null
+++ b/docjava/legal/jqueryUI.md
@@ -0,0 +1,49 @@
+## jQuery UI v1.13.2
+
+### jQuery UI License
+```
+Copyright jQuery Foundation and other contributors, https://jquery.org/
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/jquery/jquery-ui
+
+The following license applies to all parts of this software except as
+documented below:
+
+====
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+====
+
+Copyright and related rights for sample code are waived via CC0. Sample
+code is defined as all source code contained within the demos directory.
+
+CC0: http://creativecommons.org/publicdomain/zero/1.0/
+
+====
+
+All files located in the node_modules and external directories are
+externally maintained libraries used by this software which have their
+own licenses; we recommend you read them, as their terms may differ from
+the terms above.
+
+```
diff --git a/docjava/member-search-index.js b/docjava/member-search-index.js
new file mode 100644
index 0000000..898d680
--- /dev/null
+++ b/docjava/member-search-index.js
@@ -0,0 +1 @@
+memberSearchIndex = [{"p":"fr.iutfbleau.sae","c":"ExportButtonListener","l":"actionPerformed(ActionEvent)","u":"actionPerformed(java.awt.event.ActionEvent)"},{"p":"fr.iutfbleau.sae","c":"ConverterWindow","l":"addSaveButton(ConverterController)","u":"addSaveButton(fr.iutfbleau.sae.ConverterController)"},{"p":"fr.iutfbleau.sae","c":"GestionErreur","l":"afficherErreur(String)","u":"afficherErreur(java.lang.String)"},{"p":"fr.iutfbleau.sae","c":"GestionErreur","l":"afficherInfo(String)","u":"afficherInfo(java.lang.String)"},{"p":"fr.iutfbleau.sae.mpif","c":"BitInputStream","l":"BitInputStream(InputStream)","u":"%3Cinit%3E(java.io.InputStream)"},{"p":"fr.iutfbleau.sae.mpif","c":"BitOutputStream","l":"BitOutputStream(OutputStream)","u":"%3Cinit%3E(java.io.OutputStream)"},{"p":"fr.iutfbleau.sae.mpif","c":"PIFReader","l":"buildDecodageTree(Map)","u":"buildDecodageTree(java.util.Map)"},{"p":"fr.iutfbleau.sae.mhuffman","c":"CanonicalCode","l":"CanonicalCode()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae.mpif","c":"BitInputStream","l":"closeFlux()"},{"p":"fr.iutfbleau.sae","c":"CodeTablePanel","l":"CodeTablePanel()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"ComparateurCanonique","l":"ComparateurCanonique()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae.mpif","c":"ComparateurEntreeCanonique","l":"ComparateurEntreeCanonique()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"ComparateurHuffmanNode","l":"ComparateurHuffmanNode()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"ComparateurHuffmanNode","l":"compare(HuffmanNode, HuffmanNode)","u":"compare(fr.iutfbleau.sae.mhuffman.HuffmanNode,fr.iutfbleau.sae.mhuffman.HuffmanNode)"},{"p":"fr.iutfbleau.sae.mpif","c":"ComparateurEntreeCanonique","l":"compare(Map.Entry, Map.Entry)","u":"compare(java.util.Map.Entry,java.util.Map.Entry)"},{"p":"fr.iutfbleau.sae.mhuffman","c":"ComparateurCanonique","l":"compare(Map.Entry, Map.Entry)","u":"compare(java.util.Map.Entry,java.util.Map.Entry)"},{"p":"fr.iutfbleau.sae","c":"ConverterController","l":"computeCanonical()"},{"p":"fr.iutfbleau.sae","c":"ConverterController","l":"computeFrequencies()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"FrequencyTable","l":"computeFromImage(RGBImage)","u":"computeFromImage(fr.iutfbleau.sae.mpif.RGBImage)"},{"p":"fr.iutfbleau.sae","c":"ConverterController","l":"computeHuffman()"},{"p":"fr.iutfbleau.sae","c":"ConverterController","l":"conversionProcess()"},{"p":"fr.iutfbleau.sae","c":"ConverterController","l":"ConverterController(ConverterWindow, String, String)","u":"%3Cinit%3E(fr.iutfbleau.sae.ConverterWindow,java.lang.String,java.lang.String)"},{"p":"fr.iutfbleau.sae","c":"ConverterWindow","l":"ConverterWindow()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae","c":"Convertisseur","l":"Convertisseur()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae.mpif","c":"DecodeNode","l":"DecodeNode()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae.mpif","c":"DecodeNode","l":"DecodeNode(DecodeNode, DecodeNode, Integer)","u":"%3Cinit%3E(fr.iutfbleau.sae.mpif.DecodeNode,fr.iutfbleau.sae.mpif.DecodeNode,java.lang.Integer)"},{"p":"fr.iutfbleau.sae.mpif","c":"PIFReader","l":"decodePifFile(File)","u":"decodePifFile(java.io.File)"},{"p":"fr.iutfbleau.sae.mpif","c":"PIFReader","l":"decodePixels(BitInputStream, DecodeNode, DecodeNode, DecodeNode)","u":"decodePixels(fr.iutfbleau.sae.mpif.BitInputStream,fr.iutfbleau.sae.mpif.DecodeNode,fr.iutfbleau.sae.mpif.DecodeNode,fr.iutfbleau.sae.mpif.DecodeNode)"},{"p":"fr.iutfbleau.sae","c":"ViewerWindow","l":"displayImage(BufferedImage)","u":"displayImage(java.awt.image.BufferedImage)"},{"p":"fr.iutfbleau.sae.mpif","c":"PIFWriter","l":"encodePixels(BitOutputStream, RGBImage, Map, Map, Map)","u":"encodePixels(fr.iutfbleau.sae.mpif.BitOutputStream,fr.iutfbleau.sae.mpif.RGBImage,java.util.Map,java.util.Map,java.util.Map)"},{"p":"fr.iutfbleau.sae","c":"ExportButtonListener","l":"ExportButtonListener(ConverterController)","u":"%3Cinit%3E(fr.iutfbleau.sae.ConverterController)"},{"p":"fr.iutfbleau.sae.mpif","c":"BitOutputStream","l":"fermerFlux()"},{"p":"fr.iutfbleau.sae.mpif","c":"BitOutputStream","l":"flush()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"FrequencyTable","l":"FrequencyTable()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae","c":"FrequencyTablePanel","l":"FrequencyTablePanel()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"HuffmanTree","l":"generateCodes()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"CanonicalCode","l":"generateCodes(Map)","u":"generateCodes(java.util.Map)"},{"p":"fr.iutfbleau.sae","c":"GestionErreur","l":"GestionErreur()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae.mpif","c":"Pixel","l":"getB()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"FrequencyTable","l":"getBlue()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"CanonicalCode","l":"getCode(Map, int)","u":"getCode(java.util.Map,int)"},{"p":"fr.iutfbleau.sae.mhuffman","c":"HuffmanTree","l":"getCodes()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"HuffmanNode","l":"getFrequence()"},{"p":"fr.iutfbleau.sae.mpif","c":"Pixel","l":"getG()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"FrequencyTable","l":"getGreen()"},{"p":"fr.iutfbleau.sae.mpif","c":"RGBImage","l":"getHeight()"},{"p":"fr.iutfbleau.sae","c":"ConverterController","l":"getImage()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"HuffmanNode","l":"getLeft()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"CanonicalCode","l":"getLength(Map, int)","u":"getLength(java.util.Map,int)"},{"p":"fr.iutfbleau.sae.mpif","c":"RGBImage","l":"getPixel(int, int)","u":"getPixel(int,int)"},{"p":"fr.iutfbleau.sae.mpif","c":"Pixel","l":"getR()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"FrequencyTable","l":"getRed()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"HuffmanNode","l":"getRight()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"HuffmanTree","l":"getRoot()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"HuffmanNode","l":"getValue()"},{"p":"fr.iutfbleau.sae.mpif","c":"RGBImage","l":"getWidth()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"HuffmanNode","l":"HuffmanNode(HuffmanNode, HuffmanNode)","u":"%3Cinit%3E(fr.iutfbleau.sae.mhuffman.HuffmanNode,fr.iutfbleau.sae.mhuffman.HuffmanNode)"},{"p":"fr.iutfbleau.sae.mhuffman","c":"HuffmanNode","l":"HuffmanNode(int, int)","u":"%3Cinit%3E(int,int)"},{"p":"fr.iutfbleau.sae.mhuffman","c":"HuffmanTree","l":"HuffmanTree(int[])","u":"%3Cinit%3E(int[])"},{"p":"fr.iutfbleau.sae","c":"ImagePreviewPanel","l":"ImagePreviewPanel()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae.mhuffman","c":"HuffmanNode","l":"isLeaf()"},{"p":"fr.iutfbleau.sae.mpif","c":"DecodeNode","l":"isLeaf()"},{"p":"fr.iutfbleau.sae.mpif","c":"PIFReader","l":"isPIFFile(File)","u":"isPIFFile(java.io.File)"},{"p":"fr.iutfbleau.sae.mpif","c":"DecodeNode","l":"left"},{"p":"fr.iutfbleau.sae","c":"ConverterController","l":"loadImage(File)","u":"loadImage(java.io.File)"},{"p":"fr.iutfbleau.sae","c":"ViewerControleur","l":"loadPIF()"},{"p":"fr.iutfbleau.sae","c":"Convertisseur","l":"main(String[])","u":"main(java.lang.String[])"},{"p":"fr.iutfbleau.sae","c":"Viewer","l":"main(String[])","u":"main(java.lang.String[])"},{"p":"fr.iutfbleau.sae","c":"ViewerImagePanel","l":"mouseClicked(MouseEvent)","u":"mouseClicked(java.awt.event.MouseEvent)"},{"p":"fr.iutfbleau.sae","c":"ViewerImagePanel","l":"mouseDragged(MouseEvent)","u":"mouseDragged(java.awt.event.MouseEvent)"},{"p":"fr.iutfbleau.sae","c":"ViewerImagePanel","l":"mouseEntered(MouseEvent)","u":"mouseEntered(java.awt.event.MouseEvent)"},{"p":"fr.iutfbleau.sae","c":"ViewerImagePanel","l":"mouseExited(MouseEvent)","u":"mouseExited(java.awt.event.MouseEvent)"},{"p":"fr.iutfbleau.sae","c":"ViewerImagePanel","l":"mouseMoved(MouseEvent)","u":"mouseMoved(java.awt.event.MouseEvent)"},{"p":"fr.iutfbleau.sae","c":"ViewerImagePanel","l":"mousePressed(MouseEvent)","u":"mousePressed(java.awt.event.MouseEvent)"},{"p":"fr.iutfbleau.sae","c":"ViewerImagePanel","l":"mouseReleased(MouseEvent)","u":"mouseReleased(java.awt.event.MouseEvent)"},{"p":"fr.iutfbleau.sae","c":"ImagePreviewPanel","l":"paintComponent(Graphics)","u":"paintComponent(java.awt.Graphics)"},{"p":"fr.iutfbleau.sae","c":"ViewerImagePanel","l":"paintComponent(Graphics)","u":"paintComponent(java.awt.Graphics)"},{"p":"fr.iutfbleau.sae.mpif","c":"PIFReader","l":"PIFReader()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae.mpif","c":"PIFWriter","l":"PIFWriter()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae.mpif","c":"Pixel","l":"Pixel(int, int, int)","u":"%3Cinit%3E(int,int,int)"},{"p":"fr.iutfbleau.sae.mpif","c":"BitInputStream","l":"readBit()"},{"p":"fr.iutfbleau.sae.mpif","c":"BitInputStream","l":"readBits(int)"},{"p":"fr.iutfbleau.sae.mpif","c":"PIFReader","l":"readCanonicalTables(BitInputStream)","u":"readCanonicalTables(fr.iutfbleau.sae.mpif.BitInputStream)"},{"p":"fr.iutfbleau.sae.mpif","c":"PIFReader","l":"readHeader(BitInputStream)","u":"readHeader(fr.iutfbleau.sae.mpif.BitInputStream)"},{"p":"fr.iutfbleau.sae.mpif","c":"PIFReader","l":"rebuildCanonical(int[])"},{"p":"fr.iutfbleau.sae.mpif","c":"RGBImage","l":"RGBImage(int, int)","u":"%3Cinit%3E(int,int)"},{"p":"fr.iutfbleau.sae.mpif","c":"DecodeNode","l":"right"},{"p":"fr.iutfbleau.sae","c":"ThreadSauvegardePIF","l":"run()"},{"p":"fr.iutfbleau.sae","c":"ConverterController","l":"saveAsPIF(String)","u":"saveAsPIF(java.lang.String)"},{"p":"fr.iutfbleau.sae","c":"ConverterController","l":"saveViaBtn()"},{"p":"fr.iutfbleau.sae.mpif","c":"Pixel","l":"setB(int)"},{"p":"fr.iutfbleau.sae","c":"ConverterWindow","l":"setCanonicalTable(Map, Map, Map)","u":"setCanonicalTable(java.util.Map,java.util.Map,java.util.Map)"},{"p":"fr.iutfbleau.sae","c":"ConverterWindow","l":"setFrequencyTable(int[], int[], int[])","u":"setFrequencyTable(int[],int[],int[])"},{"p":"fr.iutfbleau.sae.mpif","c":"Pixel","l":"setG(int)"},{"p":"fr.iutfbleau.sae","c":"ConverterWindow","l":"setHuffmanTable(Map, Map, Map)","u":"setHuffmanTable(java.util.Map,java.util.Map,java.util.Map)"},{"p":"fr.iutfbleau.sae","c":"ImagePreviewPanel","l":"setImage(BufferedImage)","u":"setImage(java.awt.image.BufferedImage)"},{"p":"fr.iutfbleau.sae","c":"ViewerImagePanel","l":"setImage(BufferedImage)","u":"setImage(java.awt.image.BufferedImage)"},{"p":"fr.iutfbleau.sae","c":"ConverterWindow","l":"setImagePreview(BufferedImage)","u":"setImagePreview(java.awt.image.BufferedImage)"},{"p":"fr.iutfbleau.sae.mpif","c":"RGBImage","l":"setPixel(int, int, Pixel)","u":"setPixel(int,int,fr.iutfbleau.sae.mpif.Pixel)"},{"p":"fr.iutfbleau.sae.mpif","c":"Pixel","l":"setR(int)"},{"p":"fr.iutfbleau.sae","c":"ThreadSauvegardePIF","l":"ThreadSauvegardePIF(ConverterController, File)","u":"%3Cinit%3E(fr.iutfbleau.sae.ConverterController,java.io.File)"},{"p":"fr.iutfbleau.sae.mhuffman","c":"HuffmanNode","l":"toString()"},{"p":"fr.iutfbleau.sae","c":"CodeTablePanel","l":"updateCanonicalCodes(Map, Map, Map)","u":"updateCanonicalCodes(java.util.Map,java.util.Map,java.util.Map)"},{"p":"fr.iutfbleau.sae","c":"CodeTablePanel","l":"updateCodes(Map, Map, Map)","u":"updateCodes(java.util.Map,java.util.Map,java.util.Map)"},{"p":"fr.iutfbleau.sae","c":"FrequencyTablePanel","l":"updateFrequencies(int[], int[], int[])","u":"updateFrequencies(int[],int[],int[])"},{"p":"fr.iutfbleau.sae.mpif","c":"DecodeNode","l":"value"},{"p":"fr.iutfbleau.sae","c":"Viewer","l":"Viewer()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae","c":"ViewerControleur","l":"ViewerControleur(ViewerWindow, String)","u":"%3Cinit%3E(fr.iutfbleau.sae.ViewerWindow,java.lang.String)"},{"p":"fr.iutfbleau.sae","c":"ViewerImagePanel","l":"ViewerImagePanel()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae","c":"ViewerWindow","l":"ViewerWindow()","u":"%3Cinit%3E()"},{"p":"fr.iutfbleau.sae.mpif","c":"BitOutputStream","l":"writeBit(int)"},{"p":"fr.iutfbleau.sae.mpif","c":"BitOutputStream","l":"writeBits(int, int)","u":"writeBits(int,int)"},{"p":"fr.iutfbleau.sae.mpif","c":"BitOutputStream","l":"writeBitString(String)","u":"writeBitString(java.lang.String)"},{"p":"fr.iutfbleau.sae.mpif","c":"PIFWriter","l":"writeHeader(BitOutputStream, int, int)","u":"writeHeader(fr.iutfbleau.sae.mpif.BitOutputStream,int,int)"},{"p":"fr.iutfbleau.sae.mpif","c":"PIFWriter","l":"writeTables(BitOutputStream, Map, Map, Map)","u":"writeTables(fr.iutfbleau.sae.mpif.BitOutputStream,java.util.Map,java.util.Map,java.util.Map)"},{"p":"fr.iutfbleau.sae.mpif","c":"PIFWriter","l":"writeTOFile(String, RGBImage, Map, Map, Map)","u":"writeTOFile(java.lang.String,fr.iutfbleau.sae.mpif.RGBImage,java.util.Map,java.util.Map,java.util.Map)"}];updateSearchResults();
\ No newline at end of file
diff --git a/docjava/module-search-index.js b/docjava/module-search-index.js
new file mode 100644
index 0000000..0d59754
--- /dev/null
+++ b/docjava/module-search-index.js
@@ -0,0 +1 @@
+moduleSearchIndex = [];updateSearchResults();
\ No newline at end of file
diff --git a/docjava/overview-summary.html b/docjava/overview-summary.html
new file mode 100644
index 0000000..7a3d71c
--- /dev/null
+++ b/docjava/overview-summary.html
@@ -0,0 +1,26 @@
+
+
+
+
+Generated Documentation (Untitled)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+index.html
+
+
+
diff --git a/docjava/overview-tree.html b/docjava/overview-tree.html
new file mode 100644
index 0000000..5518d2d
--- /dev/null
+++ b/docjava/overview-tree.html
@@ -0,0 +1,133 @@
+
+
+
+
+Class Hierarchy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+Package Hierarchies:
+
+
+
+
+
+
diff --git a/docjava/package-search-index.js b/docjava/package-search-index.js
new file mode 100644
index 0000000..c2f4c37
--- /dev/null
+++ b/docjava/package-search-index.js
@@ -0,0 +1 @@
+packageSearchIndex = [{"l":"All Packages","u":"allpackages-index.html"},{"l":"fr.iutfbleau.sae"},{"l":"fr.iutfbleau.sae.mhuffman"},{"l":"fr.iutfbleau.sae.mpif"}];updateSearchResults();
\ No newline at end of file
diff --git a/docjava/resource-files/copy.svg b/docjava/resource-files/copy.svg
new file mode 100644
index 0000000..b07ac7e
--- /dev/null
+++ b/docjava/resource-files/copy.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
diff --git a/docjava/resource-files/fonts/DejaVuLGCSans-Bold.woff b/docjava/resource-files/fonts/DejaVuLGCSans-Bold.woff
new file mode 100644
index 0000000..63a79c0
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSans-Bold.woff differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSans-Bold.woff2 b/docjava/resource-files/fonts/DejaVuLGCSans-Bold.woff2
new file mode 100644
index 0000000..0665554
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSans-Bold.woff2 differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSans-BoldOblique.woff b/docjava/resource-files/fonts/DejaVuLGCSans-BoldOblique.woff
new file mode 100644
index 0000000..dead290
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSans-BoldOblique.woff differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSans-BoldOblique.woff2 b/docjava/resource-files/fonts/DejaVuLGCSans-BoldOblique.woff2
new file mode 100644
index 0000000..89328f3
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSans-BoldOblique.woff2 differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSans-Oblique.woff b/docjava/resource-files/fonts/DejaVuLGCSans-Oblique.woff
new file mode 100644
index 0000000..6c62443
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSans-Oblique.woff differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSans-Oblique.woff2 b/docjava/resource-files/fonts/DejaVuLGCSans-Oblique.woff2
new file mode 100644
index 0000000..8a50fa1
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSans-Oblique.woff2 differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSans.woff b/docjava/resource-files/fonts/DejaVuLGCSans.woff
new file mode 100644
index 0000000..a0f1efa
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSans.woff differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSans.woff2 b/docjava/resource-files/fonts/DejaVuLGCSans.woff2
new file mode 100644
index 0000000..fecdbd8
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSans.woff2 differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSansMono-Bold.woff b/docjava/resource-files/fonts/DejaVuLGCSansMono-Bold.woff
new file mode 100644
index 0000000..9f646ba
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSansMono-Bold.woff differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSansMono-Bold.woff2 b/docjava/resource-files/fonts/DejaVuLGCSansMono-Bold.woff2
new file mode 100644
index 0000000..346de2d
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSansMono-Bold.woff2 differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSansMono-BoldOblique.woff b/docjava/resource-files/fonts/DejaVuLGCSansMono-BoldOblique.woff
new file mode 100644
index 0000000..7a6b3ac
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSansMono-BoldOblique.woff differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSansMono-BoldOblique.woff2 b/docjava/resource-files/fonts/DejaVuLGCSansMono-BoldOblique.woff2
new file mode 100644
index 0000000..ede24ef
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSansMono-BoldOblique.woff2 differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSansMono-Oblique.woff b/docjava/resource-files/fonts/DejaVuLGCSansMono-Oblique.woff
new file mode 100644
index 0000000..892833b
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSansMono-Oblique.woff differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSansMono-Oblique.woff2 b/docjava/resource-files/fonts/DejaVuLGCSansMono-Oblique.woff2
new file mode 100644
index 0000000..9e90514
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSansMono-Oblique.woff2 differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSansMono.woff b/docjava/resource-files/fonts/DejaVuLGCSansMono.woff
new file mode 100644
index 0000000..e94e844
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSansMono.woff differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSansMono.woff2 b/docjava/resource-files/fonts/DejaVuLGCSansMono.woff2
new file mode 100644
index 0000000..9460c05
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSansMono.woff2 differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSerif-Bold.woff b/docjava/resource-files/fonts/DejaVuLGCSerif-Bold.woff
new file mode 100644
index 0000000..0f38846
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSerif-Bold.woff differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSerif-Bold.woff2 b/docjava/resource-files/fonts/DejaVuLGCSerif-Bold.woff2
new file mode 100644
index 0000000..d65a5e9
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSerif-Bold.woff2 differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSerif-BoldItalic.woff b/docjava/resource-files/fonts/DejaVuLGCSerif-BoldItalic.woff
new file mode 100644
index 0000000..63fd5e3
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSerif-BoldItalic.woff differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSerif-BoldItalic.woff2 b/docjava/resource-files/fonts/DejaVuLGCSerif-BoldItalic.woff2
new file mode 100644
index 0000000..e29307e
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSerif-BoldItalic.woff2 differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSerif-Italic.woff b/docjava/resource-files/fonts/DejaVuLGCSerif-Italic.woff
new file mode 100644
index 0000000..5df6d00
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSerif-Italic.woff differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSerif-Italic.woff2 b/docjava/resource-files/fonts/DejaVuLGCSerif-Italic.woff2
new file mode 100644
index 0000000..61ff146
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSerif-Italic.woff2 differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSerif.woff b/docjava/resource-files/fonts/DejaVuLGCSerif.woff
new file mode 100644
index 0000000..280e378
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSerif.woff differ
diff --git a/docjava/resource-files/fonts/DejaVuLGCSerif.woff2 b/docjava/resource-files/fonts/DejaVuLGCSerif.woff2
new file mode 100644
index 0000000..bbd32cd
Binary files /dev/null and b/docjava/resource-files/fonts/DejaVuLGCSerif.woff2 differ
diff --git a/docjava/resource-files/fonts/dejavu.css b/docjava/resource-files/fonts/dejavu.css
new file mode 100644
index 0000000..b450caa
--- /dev/null
+++ b/docjava/resource-files/fonts/dejavu.css
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
+ */
+
+/* DejaVu fonts v2.37 */
+
+@font-face {
+ font-family: 'DejaVu Sans Mono';
+ src: url('DejaVuLGCSansMono.woff2') format('woff2'),
+ url('DejaVuLGCSansMono.woff') format('woff');
+ font-weight: normal;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'DejaVu Sans Mono';
+ src: url('DejaVuLGCSansMono-Oblique.woff2') format('woff2'),
+ url('DejaVuLGCSansMono-Oblique.woff') format('woff');
+ font-weight: normal;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'DejaVu Sans Mono';
+ src: url('DejaVuLGCSansMono-Bold.woff2') format('woff2'),
+ url('DejaVuLGCSansMono-Bold.woff') format('woff');
+ font-weight: bold;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'DejaVu Sans Mono';
+ src: url('DejaVuLGCSansMono-BoldOblique.woff2') format('woff2'),
+ url('DejaVuLGCSansMono-BoldOblique.woff') format('woff');
+ font-weight: bold;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'DejaVu Sans';
+ src: url('DejaVuLGCSans.woff2') format('woff2'),
+ url('DejaVuLGCSans.woff') format('woff');
+ font-weight: normal;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'DejaVu Sans';
+ src: url('DejaVuLGCSans-Oblique.woff2') format('woff2'),
+ url('DejaVuLGCSans-Oblique.woff') format('woff');
+ font-weight: normal;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'DejaVu Sans';
+ src: url('DejaVuLGCSans-Bold.woff2') format('woff2'),
+ url('DejaVuLGCSans-Bold.woff') format('woff');
+ font-weight: bold;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'DejaVu Sans';
+ src: url('DejaVuLGCSans-BoldOblique.woff2') format('woff2'),
+ url('DejaVuLGCSans-BoldOblique.woff') format('woff');
+ font-weight: bold;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'DejaVu Serif';
+ src: url('DejaVuLGCSerif.woff2') format('woff2'),
+ url('DejaVuLGCSerif.woff') format('woff');
+ font-weight: normal;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'DejaVu Serif';
+ src: url('DejaVuLGCSerif-Italic.woff2') format('woff2'),
+ url('DejaVuLGCSerif-Italic.woff') format('woff');
+ font-weight: normal;
+ font-style: italic;
+}
+
+@font-face {
+ font-family: 'DejaVu Serif';
+ src: url('DejaVuLGCSerif-Bold.woff2') format('woff2'),
+ url('DejaVuLGCSerif-Bold.woff') format('woff');
+ font-weight: bold;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'DejaVu Serif';
+ src: url('DejaVuLGCSerif-BoldItalic.woff2') format('woff2'),
+ url('DejaVuLGCSerif-BoldItalic.woff') format('woff');
+ font-weight: bold;
+ font-style: italic;
+}
diff --git a/docjava/resource-files/glass.png b/docjava/resource-files/glass.png
new file mode 100644
index 0000000..a7f591f
Binary files /dev/null and b/docjava/resource-files/glass.png differ
diff --git a/docjava/resource-files/jquery-ui.min.css b/docjava/resource-files/jquery-ui.min.css
new file mode 100644
index 0000000..693327f
--- /dev/null
+++ b/docjava/resource-files/jquery-ui.min.css
@@ -0,0 +1,6 @@
+/*! jQuery UI - v1.13.2 - 2023-02-27
+* http://jqueryui.com
+* Includes: core.css, autocomplete.css, menu.css
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;-ms-filter:"alpha(opacity=0)"}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}
\ No newline at end of file
diff --git a/docjava/resource-files/link.svg b/docjava/resource-files/link.svg
new file mode 100644
index 0000000..2bbac38
--- /dev/null
+++ b/docjava/resource-files/link.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
diff --git a/docjava/resource-files/stylesheet.css b/docjava/resource-files/stylesheet.css
new file mode 100644
index 0000000..bdf84dc
--- /dev/null
+++ b/docjava/resource-files/stylesheet.css
@@ -0,0 +1,1492 @@
+/*
+ * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
+ */
+
+/*
+ * Javadoc style sheet
+ */
+
+@import url('fonts/dejavu.css');
+
+/*
+ * These CSS custom properties (variables) define the core color and font
+ * properties used in this stylesheet.
+ */
+:root {
+ /* body, block and code fonts */
+ --body-font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif;
+ --block-font-family: 'DejaVu Serif', Georgia, "Times New Roman", Times, serif;
+ --code-font-family: 'DejaVu Sans Mono', monospace;
+ /* Base font sizes for body and code elements */
+ --body-font-size: 14px;
+ --block-font-size: 14px;
+ --code-font-size: 14px;
+ --nav-font-size: 13.2px;
+ /* Line height for continuous text blocks */
+ --block-line-height: 1.4em;
+ /* Text colors for body and block elements */
+ --body-text-color: #282828;
+ --block-text-color: #282828;
+ /* Background colors for various elements */
+ --body-background-color: #ffffff;
+ --section-background-color: #f8f8f8;
+ --detail-background-color: #ffffff;
+ --mark-background-color: #f7f7f7;
+ /* Colors for navigation bar and table captions */
+ --navbar-background-color: #4D7A97;
+ --navbar-text-color: #ffffff;
+ /* Background color for subnavigation and various headers */
+ --subnav-background-color: #dee3e9;
+ /* Background and text colors for selected tabs and navigation items */
+ --selected-background-color: #f8981d;
+ --selected-text-color: #253441;
+ --selected-link-color: #1f389c;
+ /* Background colors for generated tables */
+ --even-row-color: #ffffff;
+ --odd-row-color: #eeeeef;
+ /* Text color for page title */
+ --title-color: #2c4557;
+ /* Text colors for links */
+ --link-color: #437291;
+ --link-color-active: #bb7a2a;
+ /* Table of contents */
+ --toc-background-color: var(--section-background-color);
+ --toc-link-color: #4a698a;
+ /* Snippet colors */
+ --snippet-background-color: #ebecee;
+ --snippet-text-color: var(--block-text-color);
+ --snippet-highlight-color: #f7c590;
+ /* Border colors for structural elements and user defined tables */
+ --border-color: #ededed;
+ --table-border-color: #000000;
+ /* Search input colors */
+ --search-input-background-color: #ffffff;
+ --search-input-text-color: #000000;
+ --search-input-placeholder-color: #909090;
+ /* Highlight color for active search tag target */
+ --search-tag-highlight-color: #ffff66;
+ /* Adjustments for icon and active background colors of copy-to-clipboard buttons */
+ --copy-icon-brightness: 100%;
+ --copy-button-background-color-active: rgba(168, 168, 176, 0.3);
+ /* Colors for invalid tag notifications */
+ --invalid-tag-background-color: #ffe6e6;
+ --invalid-tag-text-color: #000000;
+ /* Navigation bar dimensions */
+ --top-nav-height: 44px;
+ --sub-nav-height: 34px;
+ --nav-height: calc(var(--top-nav-height) + var(--sub-nav-height));
+ scroll-behavior: smooth;
+}
+/*
+ * Styles for individual HTML elements.
+ *
+ * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular
+ * HTML element throughout the page.
+ */
+body {
+ background-color:var(--body-background-color);
+ color:var(--body-text-color);
+ font-family:var(--body-font-family);
+ font-size:var(--body-font-size);
+ margin:0;
+ padding:0;
+ height:100%;
+ width:100%;
+}
+main [id] {
+ scroll-margin-top: calc(var(--nav-height) + 6px);
+}
+a:link, a:visited {
+ text-decoration:none;
+ color:var(--link-color);
+}
+nav a:link, nav a:visited {
+ color: var(--toc-link-color);
+}
+a[href]:hover, a[href]:active {
+ text-decoration:none;
+ color:var(--link-color-active);
+}
+pre {
+ font-family:var(--code-font-family);
+ font-size:var(--code-font-size);
+}
+h1 {
+ font-size:1.428em;
+}
+h2 {
+ font-size:1.285em;
+}
+h3 {
+ font-size:1.14em;
+}
+h4 {
+ font-size:1.072em;
+}
+h5 {
+ font-size:1.001em;
+}
+h6 {
+ font-size:0.93em;
+}
+/* Disable font boosting for selected elements */
+h1, h2, h3, h4, h5, h6, div.member-signature {
+ max-height: 1000em;
+}
+ul {
+ list-style-type:disc;
+}
+code, tt {
+ font-family:var(--code-font-family);
+}
+:not(h1, h2, h3, h4, h5, h6, sup, sub, small, big) > :is(code, tt) {
+ font-size:var(--code-font-size);
+ line-height:1.4em;
+}
+dt code {
+ font-family:var(--code-font-family);
+ font-size:1em;
+ padding-top:4px;
+}
+.summary-table dt code {
+ font-family:var(--code-font-family);
+ font-size:1em;
+ vertical-align:top;
+ padding-top:4px;
+}
+button {
+ font-family: var(--body-font-family);
+ font-size: 1em;
+}
+hr {
+ border-color: #aaa;
+}
+/*
+ * Styles for HTML generated by javadoc.
+ *
+ * These are style classes that are used by the standard doclet to generate HTML documentation.
+ */
+
+/*
+ * Styles for document title and copyright.
+ */
+.about-language {
+ flex: 0 0 auto;
+ padding:0 20px;
+ margin:0;
+ font-size:0.915em;
+ max-width: 50%;
+ white-space: nowrap;
+}
+.legal-copy {
+}
+/*
+ * Styles for navigation bar.
+ */
+@media screen {
+ header {
+ position:sticky;
+ top:0;
+ z-index:2;
+ background: var(--body-background-color);
+ }
+}
+.nav-content {
+ display:flex;
+ flex-direction: row;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+}
+.top-nav {
+ background-color:var(--navbar-background-color);
+ color:var(--navbar-text-color);
+ width:100%;
+ height:var(--top-nav-height);
+ overflow:visible;
+ font-size:0.857em;
+ position:relative;
+}
+.top-nav nav.toc {
+ display: none;
+ flex-direction: column;
+}
+.top-nav nav.toc button.show-sidebar,
+.top-nav nav.toc button.hide-sidebar {
+ display: none;
+}
+button#navbar-toggle-button {
+ display:none;
+}
+ul.nav-list {
+ display:inline-flex;
+ margin:0;
+ padding-left:4px;
+ flex: 1 1 auto;
+ white-space: nowrap;
+}
+ul.nav-list li {
+ list-style:none;
+ padding: 5px 6px;
+ text-transform:uppercase;
+ height: 1.2em;
+}
+div.sub-nav {
+ background-color:var(--subnav-background-color);
+ width:100%;
+ overflow:hidden;
+ font-size:var(--nav-font-size);
+ height: var(--sub-nav-height);
+}
+ol.sub-nav-list {
+ flex: 1 1 90%;
+ line-height: 1.8em;
+ display: inline-flex;
+ overflow: auto;
+ scroll-snap-type: x mandatory;
+ scroll-padding-left: 13px;
+ scrollbar-width: none;
+ padding-left:6px;
+ white-space: nowrap;
+ margin:0;
+}
+ol.sub-nav-list::-webkit-scrollbar {
+ display: none;
+}
+ol.sub-nav-list li {
+ list-style:none;
+ scroll-snap-align: start;
+}
+ol.sub-nav-list li:not(:first-child) {
+ list-style-type: " > ";
+ margin-left: 20px;
+}
+ol.sub-nav-list a {
+ padding: 3px;
+}
+ol.sub-nav-list a.current-selection {
+ background-color: var(--section-background-color);
+ border-radius: 4px;
+}
+.sub-nav .nav-list-search {
+ flex: 1 1 10%;
+ margin:0;
+ padding:6px;
+ position:relative;
+ white-space: nowrap;
+}
+.top-nav .nav-list a:link, .top-nav .nav-list a:active, .top-nav .nav-list a:visited {
+ color:var(--navbar-text-color);
+ text-decoration:none;
+ text-transform:uppercase;
+}
+.top-nav .nav-list a:hover {
+ color:var(--link-color-active);
+}
+.nav-bar-cell1-rev {
+ background-color:var(--selected-background-color);
+ color:var(--selected-text-color);
+ margin: 0 5px;
+}
+.skip-nav {
+ position:absolute;
+ top:auto;
+ left:-9999px;
+ overflow:hidden;
+}
+/*
+ * Hide navigation links and search box in print layout
+ */
+@media print {
+ ul.nav-list, div.sub-nav {
+ display:none;
+ }
+}
+/*
+ * Styles for page header.
+ */
+.title {
+ color:var(--title-color);
+ margin:10px 0 12px 0;
+}
+.sub-title {
+ margin:5px 0 0 0;
+}
+ul.contents-list {
+ margin: 0 0 15px 0;
+ padding: 0;
+ list-style: none;
+}
+ul.contents-list li {
+ font-size:0.93em;
+}
+/*
+ * Styles for headings.
+ */
+body.class-declaration-page .summary h2,
+body.class-declaration-page .details h2,
+body.class-use-page h2,
+body.module-declaration-page .block-list h2 {
+ font-style: italic;
+ padding:0;
+ margin:15px 0;
+ overflow-x:auto;
+}
+body.class-declaration-page .summary h3,
+body.class-declaration-page .details h3 {
+ background-color:var(--subnav-background-color);
+ border:1px solid var(--border-color);
+ margin:0 0 6px -8px;
+ padding:7px 5px;
+ overflow-x:auto;
+}
+/*
+ * Styles for page layout containers.
+ */
+.main-grid {
+ display: flex;
+ flex-direction: row;
+}
+.main-grid main {
+ flex: 3 1 0;
+ min-width: 240px
+}
+.main-grid nav.toc {
+ flex: 1 1 0;
+ min-width: 240px;
+}
+main {
+ clear:both;
+ padding:10px 20px;
+ position:relative;
+}
+/* Compensate for non-collapsing margins between element description and summary tables */
+div.horizontal-scroll > section[id$=-description] > :is(dl, ol, ul, p, div, blockquote, pre):last-child,
+div.horizontal-scroll > section[id$=-description] > :last-child > :is(li, dd):last-child,
+section.class-description > div.horizontal-scroll > :is(dl, ol, ul, p, div, blockquote, pre):last-child,
+section.class-description > div.horizontal-scroll > :last-child > :is(li, dd):last-child {
+ margin-bottom:4px;
+}
+dl.notes > dt {
+ font-family: var(--body-font-family);
+ font-size:0.856em;
+ font-weight:bold;
+ margin:10px 0 0 0;
+ color:var(--body-text-color);
+}
+dl.notes > dd {
+ margin:5px 10px 10px 15px;
+ font-size:var(--block-font-size);
+ font-family:var(--block-font-family);
+}
+dl.notes > dd > ul, dl.notes > dd > ol {
+ margin-bottom: 1em;
+ margin-top: 1em;
+}
+dl.name-value > dt {
+ margin-left:1px;
+ font-size:1.1em;
+ display:inline;
+ font-weight:bold;
+}
+dl.name-value > dd {
+ margin:0 0 0 1px;
+ font-size:1.1em;
+ display:inline;
+}
+/*
+ * Styles for table of contents.
+ */
+.main-grid nav.toc {
+ background-color: var(--toc-background-color);
+ border-right: 1px solid var(--border-color);
+ position: sticky;
+ top: calc(var(--nav-height));
+ max-height: calc(100vh - var(--nav-height));
+ display: flex;
+ flex-direction: column;
+ font-family: var(--body-font-family);
+ z-index: 1;
+}
+.main-grid nav.toc div.toc-header {
+ top: var(--nav-height);
+ z-index: 1;
+ padding: 15px 20px;
+}
+.main-grid nav.toc > ol.toc-list {
+ max-height: calc(100vh - var(--nav-height) - 100px);
+ padding-left: 12px;
+}
+.main-grid nav.toc button {
+ position: absolute;
+ bottom: 16px;
+ z-index: 3;
+ background-color: var(--section-background-color);
+ color: #666666;
+ font-size: 0.76rem;
+ border: none;
+ cursor: pointer;
+ padding: 6px 10px;
+ white-space: nowrap;
+}
+.main-grid nav.toc button.hide-sidebar {
+ right: 0;
+}
+.main-grid nav.toc button.show-sidebar {
+ left: 0;
+ display: none;
+}
+.main-grid nav.toc button span {
+ display: none;
+}
+.main-grid nav.toc button:hover {
+ color: var(--body-text-color);
+ border: 1px solid var(--subnav-background-color);
+}
+.main-grid nav.toc button:active {
+ background-color: var(--subnav-background-color);
+ color: var(--link-color-active);
+}
+.main-grid nav.toc button:hover span,
+.main-grid nav.toc button:active span {
+ display: inline;
+}
+.main-grid nav.toc button:hover {
+ box-shadow: 1px 1px 5px rgba(0,0,0,0.2);
+}
+.main-grid nav.toc.hide-sidebar {
+ min-width: revert;
+ max-width: 28px;
+}
+.main-grid nav.toc.hide-sidebar div.toc-header,
+.main-grid nav.toc.hide-sidebar ol.toc-list,
+.main-grid nav.toc.hide-sidebar button.hide-sidebar {
+ display: none;
+}
+.main-grid nav.toc.hide-sidebar button.show-sidebar {
+ display: inline;
+}
+nav.toc div.toc-header {
+ padding: 15px;
+ display: inline-flex;
+ align-items: center;
+ color: var(--body-text-color);
+ font-size: 0.856em;
+ font-weight: bold;
+ white-space: nowrap;
+ overflow-x: hidden;
+ position: sticky;
+ min-height: 20px;
+}
+nav.toc > ol.toc-list {
+ overflow: hidden auto;
+ overscroll-behavior: contain;
+}
+nav.toc ol.toc-list {
+ list-style: none;
+ padding-left: 8px;
+ margin: 0;
+}
+nav.toc ol.toc-list ol.toc-list {
+ margin-left: 8px;
+}
+nav.toc ol.toc-list li {
+ margin: 0;
+ font-size: var(--nav-font-size);
+ overflow-x: hidden;
+}
+a.current-selection {
+ font-weight: bold;
+}
+nav.toc a {
+ display: block;
+ padding: 8px;
+}
+nav.toc a.current-selection {
+ background-color: var(--subnav-background-color);
+}
+/*
+ * Styles for lists.
+ */
+li.circle {
+ list-style:circle;
+}
+ul.horizontal li {
+ display:inline;
+ font-size:0.9em;
+}
+div.inheritance {
+ margin:0;
+ padding:0;
+}
+div.inheritance div.inheritance {
+ margin-left:2em;
+}
+main > div.inheritance {
+ overflow-x:auto;
+}
+ul.block-list,
+ul.details-list,
+ul.member-list,
+ul.summary-list {
+ margin:4px 0 10px 0;
+ padding:0;
+}
+ul.block-list > li,
+ul.details-list > li,
+ul.member-list > li,
+ul.summary-list > li {
+ list-style:none;
+ margin-bottom:15px;
+ line-height:1.4;
+}
+ul.ref-list {
+ padding:0;
+ margin:0;
+}
+ul.ref-list > li {
+ list-style:none;
+}
+.summary-table dl, .summary-table dl dt, .summary-table dl dd {
+ margin-top:0;
+ margin-bottom:1px;
+}
+dl.notes > dd > ul.tag-list, dl.notes > dd > ul.tag-list-long {
+ padding-left: 0;
+ margin: 0;
+ list-style: none;
+}
+ul.tag-list li {
+ display: inline;
+}
+ul.tag-list li:not(:last-child):after,
+ul.tag-list-long li:not(:last-child):after
+{
+ content: ", ";
+ white-space: pre-wrap;
+}
+ul.preview-feature-list {
+ list-style: none;
+ margin:0;
+ padding:0.1em;
+ line-height: 1.6em;
+}
+/*
+ * Styles for tables.
+ */
+.summary-table, .details-table {
+ width:100%;
+ border-spacing:0;
+ border:1px solid var(--border-color);
+ border-top:0;
+ padding:0;
+}
+.caption {
+ position:relative;
+ text-align:left;
+ background-repeat:no-repeat;
+ color:var(--selected-text-color);
+ clear:none;
+ overflow:hidden;
+ padding: 10px 0 0 1px;
+ margin:0;
+}
+.caption a:link, .caption a:visited {
+ color:var(--selected-link-color);
+}
+.caption a:hover,
+.caption a:active {
+ color:var(--navbar-text-color);
+}
+.caption span {
+ font-weight:bold;
+ white-space:nowrap;
+ padding:5px 12px 7px 12px;
+ display:inline-block;
+ float:left;
+ background-color:var(--selected-background-color);
+ border: none;
+ height:16px;
+}
+div.table-tabs {
+ padding: 10px 0 0 1px;
+ margin: 0;
+}
+div.table-tabs > button {
+ border: none;
+ cursor: pointer;
+ padding: 5px 12px 7px 12px;
+ font-weight: bold;
+ margin-right: 8px;
+}
+div.table-tabs > .active-table-tab {
+ background: var(--selected-background-color);
+ color: var(--selected-text-color);
+}
+div.table-tabs > button.table-tab {
+ background: var(--navbar-background-color);
+ color: var(--navbar-text-color);
+}
+.two-column-search-results {
+ display: grid;
+ grid-template-columns: minmax(400px, max-content) minmax(400px, auto);
+}
+div.checkboxes {
+ line-height: 2em;
+}
+div.checkboxes > span {
+ margin-left: 10px;
+}
+div.checkboxes > label {
+ margin-left: 8px;
+ white-space: nowrap;
+}
+div.checkboxes > label > input {
+ margin: 0 2px;
+}
+.two-column-summary {
+ display: grid;
+ grid-template-columns: minmax(25%, max-content) minmax(25%, auto);
+}
+.three-column-summary {
+ display: grid;
+ grid-template-columns: minmax(15%, max-content) minmax(20%, max-content) minmax(20%, auto);
+}
+.three-column-release-summary {
+ display: grid;
+ grid-template-columns: minmax(40%, max-content) minmax(10%, max-content) minmax(40%, auto);
+}
+.four-column-summary {
+ display: grid;
+ grid-template-columns: minmax(10%, max-content) minmax(15%, max-content) minmax(15%, max-content) minmax(15%, auto);
+}
+@media screen and (max-width: 1000px) {
+ .four-column-summary {
+ display: grid;
+ grid-template-columns: minmax(15%, max-content) minmax(15%, auto);
+ }
+}
+@media screen and (max-width: 800px) {
+ .two-column-search-results {
+ display: grid;
+ grid-template-columns: minmax(40%, max-content) minmax(40%, auto);
+ }
+ .three-column-summary {
+ display: grid;
+ grid-template-columns: minmax(10%, max-content) minmax(25%, auto);
+ }
+ .three-column-release-summary {
+ display: grid;
+ grid-template-columns: minmax(70%, max-content) minmax(30%, max-content)
+ }
+ .three-column-summary .col-last,
+ .three-column-release-summary .col-last{
+ grid-column-end: span 2;
+ }
+}
+@media screen and (max-width: 600px) {
+ .two-column-summary {
+ display: grid;
+ grid-template-columns: 1fr;
+ }
+}
+.summary-table > div, .details-table > div {
+ text-align:left;
+ padding: 8px 3px 3px 7px;
+ overflow: auto hidden;
+ scrollbar-width: thin;
+}
+.col-first, .col-second, .col-last, .col-constructor-name, .col-summary-item-name {
+ vertical-align:top;
+ padding-right:0;
+ padding-top:8px;
+ padding-bottom:3px;
+}
+.table-header {
+ background:var(--subnav-background-color);
+ font-weight: bold;
+}
+/* Sortable table columns */
+.table-header[onclick] {
+ cursor: pointer;
+}
+.table-header[onclick]::after {
+ content:"";
+ display:inline-block;
+ background-image:url('data:image/svg+xml; utf8, \
+ \
+ ');
+ background-size:100% 100%;
+ width:9px;
+ height:14px;
+ margin-left:4px;
+ margin-bottom:-3px;
+}
+.table-header[onclick].sort-asc::after {
+ background-image:url('data:image/svg+xml; utf8, \
+ \
+ \
+ ');
+
+}
+.table-header[onclick].sort-desc::after {
+ background-image:url('data:image/svg+xml; utf8, \
+ \
+ \
+ ');
+}
+.col-first, .col-first {
+ font-size:0.93em;
+}
+.col-second, .col-second, .col-last, .col-constructor-name, .col-summary-item-name, .col-last {
+ font-size:0.93em;
+}
+.col-first, .col-second, .col-constructor-name {
+ vertical-align:top;
+ overflow: auto;
+}
+.col-last {
+ white-space:normal;
+}
+.col-first a:link, .col-first a:visited,
+.col-second a:link, .col-second a:visited,
+.col-first a:link, .col-first a:visited,
+.col-second a:link, .col-second a:visited,
+.col-constructor-name a:link, .col-constructor-name a:visited,
+.col-summary-item-name a:link, .col-summary-item-name a:visited {
+ font-weight:bold;
+}
+.even-row-color, .even-row-color .table-header {
+ background-color:var(--even-row-color);
+}
+.odd-row-color, .odd-row-color .table-header {
+ background-color:var(--odd-row-color);
+}
+/*
+ * Styles for contents.
+ */
+div.block {
+ font-size:var(--block-font-size);
+ font-family:var(--block-font-family);
+ line-height:var(--block-line-height);
+}
+.col-last div {
+ padding-top:0;
+}
+.col-last a {
+ padding-bottom:3px;
+}
+.module-signature,
+.package-signature,
+.type-signature,
+.member-signature {
+ font-family:var(--code-font-family);
+ font-size:1em;
+ margin:8px 0 14px 0;
+ white-space: pre-wrap;
+}
+.module-signature,
+.package-signature,
+.type-signature {
+ margin-top: 0;
+}
+.member-signature .parameters,
+.member-signature .exceptions {
+ display: inline-block;
+ vertical-align: top;
+ white-space: pre;
+}
+.member-signature .type-parameters {
+ white-space: normal;
+}
+/*
+ * Styles for formatting effect.
+ */
+.source-line-no {
+ /* Color of line numbers in source pages can be set via custom property below */
+ color:var(--source-linenumber-color, green);
+ padding:0 30px 0 0;
+}
+.block {
+ display:block;
+ margin:0 10px 5px 0;
+ color:var(--block-text-color);
+}
+.deprecated-label, .description-from-type-label, .implementation-label, .member-name-link,
+.package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link, .preview-label, .restricted-label {
+ font-weight:bold;
+}
+sup.preview-mark,
+sup.restricted-mark {
+ font-family: var(--code-font-family);
+ font-weight: normal;
+ font-size: 8px;
+ background-color: var(--mark-background-color);
+ padding: 1px;
+ border-radius: 2px;
+}
+sup.preview-mark > a:link,
+sup.restricted-mark > a:link {
+ font-weight: normal;
+}
+.deprecation-comment, .help-footnote, .preview-comment, .restricted-comment {
+ font-style:italic;
+}
+.deprecation-block, .preview-block, .restricted-block {
+ font-size:1em;
+ font-family:var(--block-font-family);
+ border-style:solid;
+ border-width:thin;
+ border-radius:10px;
+ padding:10px;
+ margin-bottom:10px;
+ margin-right:10px;
+ display:inline-block;
+}
+div.block div.deprecation-comment {
+ font-style:normal;
+}
+details.invalid-tag, span.invalid-tag {
+ font-size:1em;
+ font-family:var(--block-font-family);
+ color: var(--invalid-tag-text-color);
+ background: var(--invalid-tag-background-color);
+ border: thin solid var(--table-border-color);
+ border-radius:2px;
+ padding: 2px 4px;
+ display:inline-block;
+}
+details summary {
+ cursor: pointer;
+}
+/*
+ * Styles specific to HTML5 elements.
+ */
+main, nav, header, footer, section {
+ display:block;
+}
+/*
+ * Styles for javadoc search.
+ */
+.ui-menu .ui-state-active {
+ /* Overrides the color of selection used in jQuery UI */
+ background: var(--selected-background-color);
+ color: var(--selected-text-color);
+ /* Workaround for browser bug, see JDK-8275889 */
+ margin: -1px 0;
+ border-top: 1px solid var(--selected-background-color);
+ border-bottom: 1px solid var(--selected-background-color);
+}
+.ui-autocomplete-category {
+ font-weight:bold;
+ font-size:15px;
+ padding:7px 0 7px 3px;
+ background-color:var(--navbar-background-color);
+ color:var(--navbar-text-color);
+ box-sizing: border-box;
+}
+.ui-autocomplete {
+ max-height:85%;
+ max-width:65%;
+ overflow:auto;
+ white-space:nowrap;
+ box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23);
+ overscroll-behavior: contain;
+}
+ul.ui-autocomplete {
+ position:fixed;
+ z-index:10;
+ background-color: var(--body-background-color);
+}
+ul.ui-autocomplete li {
+ float:left;
+ clear:both;
+ min-width:100%;
+ box-sizing: border-box;
+}
+ul.ui-autocomplete li.ui-static-link {
+ position:sticky;
+ bottom:0;
+ left:0;
+ background: var(--subnav-background-color);
+ padding: 5px 0;
+ font-family: var(--body-font-family);
+ font-size: 0.93em;
+ font-weight: bolder;
+ z-index: 10;
+}
+li.ui-static-link a, li.ui-static-link a:visited {
+ text-decoration:none;
+ color:var(--link-color);
+ float:right;
+ margin-right:20px;
+}
+.ui-autocomplete .result-item {
+ font-size: inherit;
+}
+.ui-autocomplete .result-highlight {
+ font-weight:bold;
+}
+.ui-menu .ui-menu-item-wrapper {
+ padding-top: 0.4em;
+ padding-bottom: 0.4em;
+}
+.ui-menu .ui-menu-item-wrapper {
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+input[type="text"] {
+ background-image:url('glass.png');
+ background-size:13px;
+ background-repeat:no-repeat;
+ background-position:2px 3px;
+ background-color: var(--search-input-background-color);
+ color: var(--search-input-text-color);
+ border-color: var(--border-color);
+ border-radius: 4px;
+ padding-left:20px;
+ font-size: var(--nav-font-size);
+ height: 17px;
+}
+input#search-input, input#page-search-input {
+ width: calc(180px + 10vw);
+ margin: 0;
+}
+input#search-input {
+ margin: 0 4px;
+ padding-right: 18px;
+ max-width: 340px;
+}
+input.filter-input {
+ width: 40%;
+ max-width: 140px;
+ margin: 0 4px;
+ padding-right: 18px;
+}
+input#reset-search, input.reset-filter {
+ background-color: transparent;
+ background-image:url('x.png');
+ background-repeat:no-repeat;
+ background-size:contain;
+ border:0;
+ border-radius:0;
+ width:12px;
+ height:12px;
+ font-size:0;
+ display:none;
+}
+input#reset-search {
+ position:absolute;
+ right:15px;
+ top:11px;
+}
+input.reset-filter {
+ position: relative;
+ right: 20px;
+ top: 0;
+}
+input::placeholder {
+ color:var(--search-input-placeholder-color);
+ opacity: 1;
+}
+.search-tag-desc-result {
+ font-style:italic;
+ font-size:11px;
+}
+.search-tag-holder-result {
+ font-style:italic;
+ font-size:12px;
+}
+.search-tag-result:target {
+ background-color:var(--search-tag-highlight-color);
+}
+dd > span:target,
+h1 > span:target {
+ animation: 2.4s ease-out highlight;
+}
+section.class-description dd > span:target,
+section.class-description h1 > span:target {
+ scroll-margin-top: 20em;
+}
+@keyframes highlight {
+ from {
+ background-color: var(--search-tag-highlight-color);
+ }
+ 60% {
+ background-color: var(--search-tag-highlight-color);
+ }
+}
+details.page-search-details {
+ display: inline-block;
+}
+div#result-container {
+ font-size: 1em;
+}
+div#result-container a.search-result-link {
+ padding: 0;
+ margin: 4px 0;
+ width: 100%;
+}
+#result-container .result-highlight {
+ font-weight:bolder;
+}
+.page-search-info {
+ background-color: var(--subnav-background-color);
+ border-radius: 3px;
+ border: 0 solid var(--border-color);
+ padding: 0 8px;
+ overflow: hidden;
+ height: 0;
+ transition: all 0.2s ease;
+}
+div.table-tabs > button.table-tab {
+ background: var(--navbar-background-color);
+ color: var(--navbar-text-color);
+}
+.page-search-header {
+ padding: 5px 12px 7px 12px;
+ font-weight: bold;
+ margin-right: 3px;
+ background-color:var(--navbar-background-color);
+ color:var(--navbar-text-color);
+ display: inline-block;
+}
+button.page-search-header {
+ border: none;
+ cursor: pointer;
+}
+span#page-search-link {
+ text-decoration: underline;
+}
+.module-graph span, .sealed-graph span {
+ display:none;
+ position:absolute;
+}
+.module-graph:hover span, .sealed-graph:hover span {
+ display:block;
+ margin: -100px 0 0 100px;
+ z-index: 5;
+}
+.inherited-list {
+ margin: 10px 0;
+}
+.horizontal-scroll {
+ overflow: auto hidden;
+}
+section.class-description {
+ line-height: 1.4;
+}
+.summary section[class$="-summary"], .details section[class$="-details"],
+.class-uses .detail, .serialized-class-details {
+ padding: 0 20px 5px 10px;
+ border: 1px solid var(--border-color);
+ background-color: var(--section-background-color);
+}
+.inherited-list, section[class$="-details"] .detail {
+ padding:0 0 5px 8px;
+ background-color:var(--detail-background-color);
+ border:none;
+}
+.vertical-separator {
+ padding: 0 5px;
+}
+.help-section {
+ font-size: var(--block-font-size);
+ line-height: var(--block-line-height);
+}
+ul.help-section-list {
+ margin: 0;
+}
+ul.help-subtoc > li {
+ display: inline-block;
+ padding-right: 5px;
+ font-size: smaller;
+}
+ul.help-subtoc > li::before {
+ content: "\2022" ;
+ padding-right:2px;
+}
+.help-note {
+ font-style: italic;
+}
+/*
+ * Indicator icon for external links.
+ */
+main a[href*="://"]::after {
+ content:"";
+ display:inline-block;
+ background-image:url('data:image/svg+xml; utf8, \
+ \
+ \
+ ');
+ background-size:100% 100%;
+ width:7px;
+ height:7px;
+ margin-left:2px;
+ margin-bottom:4px;
+}
+main a[href*="://"]:hover::after,
+main a[href*="://"]:focus::after {
+ background-image:url('data:image/svg+xml; utf8, \
+ \
+ \
+ ');
+}
+/*
+ * Styles for header/section anchor links
+ */
+a.anchor-link {
+ opacity: 0;
+ transition: opacity 0.1s;
+}
+:hover > a.anchor-link {
+ opacity: 80%;
+}
+a.anchor-link:hover,
+a.anchor-link:focus-visible,
+a.anchor-link.visible {
+ opacity: 100%;
+}
+a.anchor-link > img {
+ width: 0.9em;
+ height: 0.9em;
+}
+/*
+ * Styles for copy-to-clipboard buttons
+ */
+button.copy {
+ opacity: 70%;
+ border: none;
+ border-radius: 3px;
+ position: relative;
+ background:none;
+ transition: opacity 0.3s;
+ cursor: pointer;
+}
+:hover > button.copy {
+ opacity: 80%;
+}
+button.copy:hover,
+button.copy:active,
+button.copy:focus-visible,
+button.copy.visible {
+ opacity: 100%;
+}
+button.copy img {
+ position: relative;
+ background: none;
+ filter: brightness(var(--copy-icon-brightness));
+}
+button.copy:active {
+ background-color: var(--copy-button-background-color-active);
+}
+button.copy span {
+ color: var(--body-text-color);
+ position: relative;
+ top: -0.1em;
+ transition: all 0.1s;
+ font-size: 0.76rem;
+ line-height: 1.2em;
+ opacity: 0;
+}
+button.copy:hover span,
+button.copy:focus-visible span,
+button.copy.visible span {
+ opacity: 100%;
+}
+/* search page copy button */
+button#page-search-copy {
+ margin-left: 0.4em;
+ padding:0.3em;
+ top:0.13em;
+}
+button#page-search-copy img {
+ width: 1.2em;
+ height: 1.2em;
+ padding: 0.01em 0;
+ top: 0.15em;
+}
+button#page-search-copy span {
+ color: var(--body-text-color);
+ line-height: 1.2em;
+ padding: 0.2em;
+ top: -0.18em;
+}
+div.page-search-info:hover button#page-search-copy span {
+ opacity: 100%;
+}
+/* snippet copy button */
+button.snippet-copy {
+ position: absolute;
+ top: 6px;
+ right: 6px;
+ height: 1.7em;
+ padding: 2px;
+}
+button.snippet-copy img {
+ width: 18px;
+ height: 18px;
+ padding: 0.05em 0;
+}
+button.snippet-copy span {
+ line-height: 1.2em;
+ padding: 0.2em;
+ position: relative;
+ top: -0.5em;
+}
+div.snippet-container:hover button.snippet-copy span {
+ opacity: 100%;
+}
+/*
+ * Styles for user-provided tables.
+ *
+ * borderless:
+ * No borders, vertical margins, styled caption.
+ * This style is provided for use with existing doc comments.
+ * In general, borderless tables should not be used for layout purposes.
+ *
+ * plain:
+ * Plain borders around table and cells, vertical margins, styled caption.
+ * Best for small tables or for complex tables for tables with cells that span
+ * rows and columns, when the "striped" style does not work well.
+ *
+ * striped:
+ * Borders around the table and vertical borders between cells, striped rows,
+ * vertical margins, styled caption.
+ * Best for tables that have a header row, and a body containing a series of simple rows.
+ */
+
+table.borderless,
+table.plain,
+table.striped {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+table.borderless > caption,
+table.plain > caption,
+table.striped > caption {
+ font-weight: bold;
+ font-size: smaller;
+}
+table.borderless th, table.borderless td,
+table.plain th, table.plain td,
+table.striped th, table.striped td {
+ padding: 2px 5px;
+}
+table.borderless,
+table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th,
+table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td {
+ border: none;
+}
+table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr {
+ background-color: transparent;
+}
+table.plain {
+ border-collapse: collapse;
+ border: 1px solid var(--table-border-color);
+}
+table.plain > thead > tr, table.plain > tbody tr, table.plain > tr {
+ background-color: transparent;
+}
+table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th,
+table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td {
+ border: 1px solid var(--table-border-color);
+}
+table.striped {
+ border-collapse: collapse;
+ border: 1px solid var(--table-border-color);
+}
+table.striped > thead {
+ background-color: var(--subnav-background-color);
+}
+table.striped > thead > tr > th, table.striped > thead > tr > td {
+ border: 1px solid var(--table-border-color);
+}
+table.striped > tbody > tr:nth-child(even) {
+ background-color: var(--odd-row-color)
+}
+table.striped > tbody > tr:nth-child(odd) {
+ background-color: var(--even-row-color)
+}
+table.striped > tbody > tr > th, table.striped > tbody > tr > td {
+ border-left: 1px solid var(--table-border-color);
+ border-right: 1px solid var(--table-border-color);
+}
+table.striped > tbody > tr > th {
+ font-weight: normal;
+}
+/**
+ * Tweak style for small screens.
+ */
+@media screen and (max-width: 1050px) {
+ .summary section[class$="-summary"], .details section[class$="-details"],
+ .class-uses .detail, .serialized-class-details {
+ padding: 0 10px 5px 8px;
+ }
+ input#search-input {
+ width: 22vw;
+ }
+}
+@media screen and (max-width: 920px) {
+ .main-grid nav.toc {
+ display: none;
+ }
+ .top-nav nav.toc {
+ display: none;
+ position: absolute;
+ top: var(--top-nav-height);
+ left: 40vw;
+ width: 60vw;
+ z-index: 7;
+ background-color: var(--section-background-color);
+ box-sizing: border-box;
+ }
+ .top-nav nav.toc div.toc-header {
+ padding: 6px 15px;
+ font-size: 0.94em;
+ background-color: var(--section-background-color);
+ top: calc(var(--top-nav-height) + 10px);
+ }
+ .top-nav nav.toc ol.toc-list li {
+ font-size: 1.04em;
+ }
+ nav.toc a:link, nav.toc a:visited {
+ text-decoration:none;
+ color:var(--link-color);
+ }
+ nav.toc a[href]:hover, nav.toc a[href]:focus {
+ text-decoration:none;
+ color:var(--link-color-active);
+ }
+ :root {
+ scroll-behavior: auto;
+ }
+ header {
+ max-height: 100vh;
+ overflow-y: visible;
+ overscroll-behavior: contain;
+ }
+ nav {
+ overflow: visible;
+ }
+ ul.nav-list {
+ display: none;
+ position: absolute;
+ top: var(--top-nav-height);
+ overflow: auto;
+ z-index: 7;
+ background-color: var(--navbar-background-color);
+ width: 40%;
+ padding: 0;
+ box-sizing: border-box;
+ }
+ ul.nav-list li {
+ float: none;
+ padding: 6px;
+ margin-left: 10px;
+ margin-top: 2px;
+ }
+ .top-nav a:link, .top-nav a:active, .top-nav a:visited {
+ display: block;
+ }
+ .top-nav div.nav-menu-button {
+ flex: 1 1 auto;
+ }
+ .sub-nav ol.sub-nav-list {
+ margin-left: 4px;
+ padding-left: 4px;
+ }
+ button#navbar-toggle-button {
+ width: 3.4em;
+ height: 2.8em;
+ background-color: transparent;
+ display: block;
+ border: 0;
+ margin: 0 10px;
+ cursor: pointer;
+ font-size: 10px;
+ }
+ button#navbar-toggle-button .nav-bar-toggle-icon {
+ display: block;
+ width: 24px;
+ height: 3px;
+ margin: 4px 0;
+ border-radius: 2px;
+ background-color: var(--navbar-text-color);
+ }
+ button#navbar-toggle-button.expanded span.nav-bar-toggle-icon:nth-child(1) {
+ transform: rotate(45deg);
+ transform-origin: 10% 10%;
+ width: 26px;
+ }
+ button#navbar-toggle-button.expanded span.nav-bar-toggle-icon:nth-child(2) {
+ opacity: 0;
+ }
+ button#navbar-toggle-button.expanded span.nav-bar-toggle-icon:nth-child(3) {
+ transform: rotate(-45deg);
+ transform-origin: 10% 90%;
+ width: 26px;
+ }
+}
+@media screen and (max-width: 800px) {
+ .about-language {
+ padding-right: 16px;
+ max-width: 90%;
+ }
+ ul.nav-list li {
+ margin-left: 5px;
+ }
+ main {
+ padding: 10px 12px;
+ }
+ body {
+ -webkit-text-size-adjust: none;
+ }
+}
+@media screen and (max-width: 600px) {
+ .nav-list-search > a {
+ display: none;
+ }
+ input#search-input {
+ width: 18vw;
+ }
+ .summary section[class$="-summary"], .details section[class$="-details"],
+ .class-uses .detail, .serialized-class-details {
+ padding: 0;
+ }
+}
+pre.snippet {
+ background-color: var(--snippet-background-color);
+ color: var(--snippet-text-color);
+ padding: 10px;
+ margin: 12px 0;
+ overflow: auto;
+ white-space: pre;
+}
+div.snippet-container {
+ position: relative;
+}
+@media screen and (max-width: 800px) {
+ pre.snippet {
+ padding-top: 26px;
+ }
+ button.snippet-copy {
+ top: 4px;
+ right: 4px;
+ }
+}
+pre.snippet .italic {
+ font-style: italic;
+}
+pre.snippet .bold {
+ font-weight: bold;
+}
+pre.snippet .highlighted {
+ background-color: var(--snippet-highlight-color);
+ border-radius: 10%;
+}
diff --git a/docjava/resource-files/x.png b/docjava/resource-files/x.png
new file mode 100644
index 0000000..30548a7
Binary files /dev/null and b/docjava/resource-files/x.png differ
diff --git a/docjava/script-files/jquery-3.7.1.min.js b/docjava/script-files/jquery-3.7.1.min.js
new file mode 100644
index 0000000..7f37b5d
--- /dev/null
+++ b/docjava/script-files/jquery-3.7.1.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML=" ",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML=" ",le.option=!!xe.lastChild;var ke={thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=x(e||this.defaultElement||this)[0],this.element=x(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=x(),this.hoverable=x(),this.focusable=x(),this.classesElementLookup={},e!==this&&(x.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=x(e.style?e.ownerDocument:e.document||e),this.window=x(this.document[0].defaultView||this.document[0].parentWindow)),this.options=x.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:x.noop,_create:x.noop,_init:x.noop,destroy:function(){var i=this;this._destroy(),x.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:x.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return x.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=x.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return x("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthC(E(s),E(n))?o.important="horizontal":o.important="vertical",c.using.call(this,t,o)}),l.offset(x.extend(u,{using:t}))})},x.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,l=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.lastMousePosition={x:null,y:null},this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault(),this._activateItem(t)},"click .ui-menu-item":function(t){var e=x(t.target),i=x(x.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&e.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),e.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&i.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":"_activateItem","mousemove .ui-menu-item":"_activateItem",mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this._menuItems().first();e||this.focus(t,i)},blur:function(t){this._delay(function(){x.contains(this.element[0],x.ui.safeActiveElement(this.document[0]))||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t,!0),this.mouseHandled=!1}})},_activateItem:function(t){var e,i;this.previousFilter||t.clientX===this.lastMousePosition.x&&t.clientY===this.lastMousePosition.y||(this.lastMousePosition={x:t.clientX,y:t.clientY},e=x(t.target).closest(".ui-menu-item"),i=x(t.currentTarget),e[0]===i[0]&&(i.is(".ui-state-active")||(this._removeClass(i.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(t,i))))},_destroy:function(){var t=this.element.find(".ui-menu-item").removeAttr("role aria-disabled").children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),t.children().each(function(){var t=x(this);t.data("ui-menu-submenu-caret")&&t.remove()})},_keydown:function(t){var e,i,s,n=!0;switch(t.keyCode){case x.ui.keyCode.PAGE_UP:this.previousPage(t);break;case x.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case x.ui.keyCode.HOME:this._move("first","first",t);break;case x.ui.keyCode.END:this._move("last","last",t);break;case x.ui.keyCode.UP:this.previous(t);break;case x.ui.keyCode.DOWN:this.next(t);break;case x.ui.keyCode.LEFT:this.collapse(t);break;case x.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case x.ui.keyCode.ENTER:case x.ui.keyCode.SPACE:this._activate(t);break;case x.ui.keyCode.ESCAPE:this.collapse(t);break;default:e=this.previousFilter||"",s=n=!1,i=96<=t.keyCode&&t.keyCode<=105?(t.keyCode-96).toString():String.fromCharCode(t.keyCode),clearTimeout(this.filterTimer),i===e?s=!0:i=e+i,e=this._filterMenuItems(i),(e=s&&-1!==e.index(this.active.next())?this.active.nextAll(".ui-menu-item"):e).length||(i=String.fromCharCode(t.keyCode),e=this._filterMenuItems(i)),e.length?(this.focus(t,e),this.previousFilter=i,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}n&&t.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var t,e,s=this,n=this.options.icons.submenu,i=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),e=i.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=x(this),e=t.prev(),i=x("").data("ui-menu-submenu-caret",!0);s._addClass(i,"ui-menu-icon","ui-icon "+n),e.attr("aria-haspopup","true").prepend(i),t.attr("aria-labelledby",e.attr("id"))}),this._addClass(e,"ui-menu","ui-widget ui-widget-content ui-front"),(t=i.add(this.element).find(this.options.items)).not(".ui-menu-item").each(function(){var t=x(this);s._isDivider(t)&&s._addClass(t,"ui-menu-divider","ui-widget-content")}),i=(e=t.not(".ui-menu-item, .ui-menu-divider")).children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(e,"ui-menu-item")._addClass(i,"ui-menu-item-wrapper"),t.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!x.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){var i;"icons"===t&&(i=this.element.find(".ui-menu-icon"),this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",String(t)),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),i=this.active.children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",i.attr("id")),i=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),(i=e.children(".ui-menu")).length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(t){var e,i,s;this._hasScroll()&&(i=parseFloat(x.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(x.css(this.activeMenu[0],"paddingTop"))||0,e=t.offset().top-this.activeMenu.offset().top-i-s,i=this.activeMenu.scrollTop(),s=this.activeMenu.height(),t=t.outerHeight(),e<0?this.activeMenu.scrollTop(i+e):s",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,liveRegionTimer:null,_create:function(){var i,s,n,t=this.element[0].nodeName.toLowerCase(),e="textarea"===t,t="input"===t;this.isMultiLine=e||!t&&this._isContentEditable(this.element),this.valueMethod=this.element[e||t?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(t){if(this.element.prop("readOnly"))s=n=i=!0;else{s=n=i=!1;var e=x.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:i=!0,this._move("previousPage",t);break;case e.PAGE_DOWN:i=!0,this._move("nextPage",t);break;case e.UP:i=!0,this._keyEvent("previous",t);break;case e.DOWN:i=!0,this._keyEvent("next",t);break;case e.ENTER:this.menu.active&&(i=!0,t.preventDefault(),this.menu.select(t));break;case e.TAB:this.menu.active&&this.menu.select(t);break;case e.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(t),t.preventDefault());break;default:s=!0,this._searchTimeout(t)}}},keypress:function(t){if(i)return i=!1,void(this.isMultiLine&&!this.menu.element.is(":visible")||t.preventDefault());if(!s){var e=x.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:this._move("previousPage",t);break;case e.PAGE_DOWN:this._move("nextPage",t);break;case e.UP:this._keyEvent("previous",t);break;case e.DOWN:this._keyEvent("next",t)}}},input:function(t){if(n)return n=!1,void t.preventDefault();this._searchTimeout(t)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){clearTimeout(this.searching),this.close(t),this._change(t)}}),this._initSource(),this.menu=x("").appendTo(this._appendTo()).menu({role:null}).hide().attr({unselectable:"on"}).menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault()},menufocus:function(t,e){var i,s;if(this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type)))return this.menu.blur(),void this.document.one("mousemove",function(){x(t.target).trigger(t.originalEvent)});s=e.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:s})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(s.value),(i=e.item.attr("aria-label")||s.value)&&String.prototype.trim.call(i).length&&(clearTimeout(this.liveRegionTimer),this.liveRegionTimer=this._delay(function(){this.liveRegion.html(x("").text(i))},100))},menuselect:function(t,e){var i=e.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==x.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",t,{item:i})&&this._value(i.value),this.term=this._value(),this.close(t),this.selectedItem=i}}),this.liveRegion=x("
",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(t){var e=this.menu.element[0];return t.target===this.element[0]||t.target===e||x.contains(e,t.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var t=this.options.appendTo;return t=!(t=!(t=t&&(t.jquery||t.nodeType?x(t):this.document.find(t).eq(0)))||!t[0]?this.element.closest(".ui-front, dialog"):t).length?this.document[0].body:t},_initSource:function(){var i,s,n=this;Array.isArray(this.options.source)?(i=this.options.source,this.source=function(t,e){e(x.ui.autocomplete.filter(i,t.term))}):"string"==typeof this.options.source?(s=this.options.source,this.source=function(t,e){n.xhr&&n.xhr.abort(),n.xhr=x.ajax({url:s,data:t,dataType:"json",success:function(t){e(t)},error:function(){e([])}})}):this.source=this.options.source},_searchTimeout:function(s){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),e=this.menu.element.is(":visible"),i=s.altKey||s.ctrlKey||s.metaKey||s.shiftKey;t&&(e||i)||(this.selectedItem=null,this.search(null,s))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length
").append(x("").text(e.label)).appendTo(t)},_move:function(t,e){if(this.menu.element.is(":visible"))return this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),void this.menu.blur()):void this.menu[t](e);this.search(null,e)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){this.isMultiLine&&!this.menu.element.is(":visible")||(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),x.extend(x.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,e){var i=new RegExp(x.ui.autocomplete.escapeRegex(e),"i");return x.grep(t,function(t){return i.test(t.label||t.value||t)})}}),x.widget("ui.autocomplete",x.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(1
").text(e))},100))}});x.ui.autocomplete});
\ No newline at end of file
diff --git a/docjava/script-files/script.js b/docjava/script-files/script.js
new file mode 100644
index 0000000..e849e9c
--- /dev/null
+++ b/docjava/script-files/script.js
@@ -0,0 +1,481 @@
+/*
+ * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
+ */
+
+var moduleSearchIndex;
+var packageSearchIndex;
+var typeSearchIndex;
+var memberSearchIndex;
+var tagSearchIndex;
+
+var oddRowColor = "odd-row-color";
+var evenRowColor = "even-row-color";
+var sortAsc = "sort-asc";
+var sortDesc = "sort-desc";
+var tableTab = "table-tab";
+var activeTableTab = "active-table-tab";
+
+const linkIcon = "Link icon";
+const linkToSection = "Link to this section";
+
+function loadScripts(doc, tag) {
+ createElem(doc, tag, 'script-files/search.js');
+
+ createElem(doc, tag, 'module-search-index.js');
+ createElem(doc, tag, 'package-search-index.js');
+ createElem(doc, tag, 'type-search-index.js');
+ createElem(doc, tag, 'member-search-index.js');
+ createElem(doc, tag, 'tag-search-index.js');
+}
+
+function createElem(doc, tag, path) {
+ var script = doc.createElement(tag);
+ var scriptElement = doc.getElementsByTagName(tag)[0];
+ script.src = pathtoroot + path;
+ scriptElement.parentNode.insertBefore(script, scriptElement);
+}
+
+// Helper for making content containing release names comparable lexicographically
+function makeComparable(s) {
+ return s.toLowerCase().replace(/(\d+)/g,
+ function(n, m) {
+ return ("000" + m).slice(-4);
+ });
+}
+
+// Switches between two styles depending on a condition
+function toggleStyle(classList, condition, trueStyle, falseStyle) {
+ if (condition) {
+ classList.remove(falseStyle);
+ classList.add(trueStyle);
+ } else {
+ classList.remove(trueStyle);
+ classList.add(falseStyle);
+ }
+}
+
+// Sorts the rows in a table lexicographically by the content of a specific column
+function sortTable(header, columnIndex, columns) {
+ var container = header.parentElement;
+ var descending = header.classList.contains(sortAsc);
+ container.querySelectorAll("div.table-header").forEach(
+ function(header) {
+ header.classList.remove(sortAsc);
+ header.classList.remove(sortDesc);
+ }
+ )
+ var cells = container.children;
+ var rows = [];
+ for (var i = columns; i < cells.length; i += columns) {
+ rows.push(Array.prototype.slice.call(cells, i, i + columns));
+ }
+ var comparator = function(a, b) {
+ var ka = makeComparable(a[columnIndex].textContent);
+ var kb = makeComparable(b[columnIndex].textContent);
+ if (ka < kb)
+ return descending ? 1 : -1;
+ if (ka > kb)
+ return descending ? -1 : 1;
+ return 0;
+ };
+ var sorted = rows.sort(comparator);
+ var visible = 0;
+ sorted.forEach(function(row) {
+ if (row[0].style.display !== 'none') {
+ var isEvenRow = visible++ % 2 === 0;
+ }
+ row.forEach(function(cell) {
+ toggleStyle(cell.classList, isEvenRow, evenRowColor, oddRowColor);
+ container.appendChild(cell);
+ })
+ });
+ toggleStyle(header.classList, descending, sortDesc, sortAsc);
+}
+
+// Toggles the visibility of a table category in all tables in a page
+function toggleGlobal(checkbox, selected, columns) {
+ const display = checkbox.checked ? '' : 'none';
+ const selectOther = selected === "other";
+ const selectAll = selected === "all";
+ if (selectAll) {
+ document.querySelectorAll('.checkboxes input[type="checkbox"]').forEach(c => {
+ c.checked = checkbox.checked;
+ });
+ }
+ document.querySelectorAll("div.table-tabs").forEach(t => {
+ const id = t.parentElement.getAttribute("id");
+ const selectedClass = id + "-tab" + (selectOther ? "" : selected);
+ var visible = 0;
+ t.parentElement.querySelectorAll('div.' + id)
+ .forEach(function(elem) {
+ if (selectAll
+ || (!selectOther && elem.classList.contains(selectedClass))
+ || (selectOther && elem.className.indexOf(selectedClass) < 0)) {
+ elem.style.display = display;
+ }
+ if (elem.style.display === '') {
+ var isEvenRow = visible++ % (columns * 2) < columns;
+ toggleStyle(elem.classList, isEvenRow, evenRowColor, oddRowColor);
+ }
+ });
+ var displaySection = visible === 0 ? 'none' : '';
+ t.parentElement.style.display = displaySection;
+ document.querySelector("li#contents-" + id).style.display = displaySection;
+ })
+}
+
+// Shows the elements of a table belonging to a specific category
+function show(tableId, selected, columns) {
+ if (tableId !== selected) {
+ document.querySelectorAll('div.' + tableId + ':not(.' + selected + ')')
+ .forEach(function(elem) {
+ elem.style.display = 'none';
+ });
+ }
+ document.querySelectorAll('div.' + selected)
+ .forEach(function(elem, index) {
+ elem.style.display = '';
+ var isEvenRow = index % (columns * 2) < columns;
+ toggleStyle(elem.classList, isEvenRow, evenRowColor, oddRowColor);
+ });
+ updateTabs(tableId, selected);
+}
+
+function updateTabs(tableId, selected) {
+ document.getElementById(tableId + '.tabpanel')
+ .setAttribute('aria-labelledby', selected);
+ document.querySelectorAll('button[id^="' + tableId + '"]')
+ .forEach(function(tab, index) {
+ if (selected === tab.id || (tableId === selected && index === 0)) {
+ tab.className = activeTableTab;
+ tab.setAttribute('aria-selected', true);
+ tab.setAttribute('tabindex',0);
+ } else {
+ tab.className = tableTab;
+ tab.setAttribute('aria-selected', false);
+ tab.setAttribute('tabindex',-1);
+ }
+ });
+}
+
+function switchTab(e) {
+ var selected = document.querySelector('[aria-selected=true]');
+ if (selected) {
+ if ((e.keyCode === 37 || e.keyCode === 38) && selected.previousSibling) {
+ // left or up arrow key pressed: move focus to previous tab
+ selected.previousSibling.click();
+ selected.previousSibling.focus();
+ e.preventDefault();
+ } else if ((e.keyCode === 39 || e.keyCode === 40) && selected.nextSibling) {
+ // right or down arrow key pressed: move focus to next tab
+ selected.nextSibling.click();
+ selected.nextSibling.focus();
+ e.preventDefault();
+ }
+ }
+}
+
+var updateSearchResults = function() {};
+
+function indexFilesLoaded() {
+ return moduleSearchIndex
+ && packageSearchIndex
+ && typeSearchIndex
+ && memberSearchIndex
+ && tagSearchIndex;
+}
+// Copy the contents of the local snippet to the clipboard
+function copySnippet(button) {
+ copyToClipboard(button.nextElementSibling.innerText);
+ switchCopyLabel(button, button.firstElementChild);
+}
+function copyToClipboard(content) {
+ var textarea = document.createElement("textarea");
+ textarea.style.height = 0;
+ document.body.appendChild(textarea);
+ textarea.value = content;
+ textarea.select();
+ document.execCommand("copy");
+ document.body.removeChild(textarea);
+}
+function switchCopyLabel(button, span) {
+ var copied = span.getAttribute("data-copied");
+ button.classList.add("visible");
+ var initialLabel = span.innerHTML;
+ span.innerHTML = copied;
+ setTimeout(function() {
+ button.classList.remove("visible");
+ setTimeout(function() {
+ if (initialLabel !== copied) {
+ span.innerHTML = initialLabel;
+ }
+ }, 100);
+ }, 1900);
+}
+function setTopMargin() {
+ // Dynamically set scroll margin to accomodate for draft header
+ var headerHeight = Math.ceil(document.querySelector("header").offsetHeight);
+ document.querySelector(":root")
+ .style.setProperty("--nav-height", headerHeight + "px");
+}
+document.addEventListener("readystatechange", (e) => {
+ if (document.readyState === "interactive") {
+ setTopMargin();
+ }
+ if (sessionStorage.getItem("sidebar") === "hidden") {
+ const sidebar = document.querySelector(".main-grid nav.toc");
+ if (sidebar) sidebar.classList.add("hide-sidebar");
+ }
+});
+document.addEventListener("DOMContentLoaded", function(e) {
+ setTopMargin();
+ // Reset animation for type parameter target highlight
+ document.querySelectorAll("a").forEach((link) => {
+ link.addEventListener("click", (e) => {
+ const href = e.currentTarget.getAttribute("href");
+ if (href && href.startsWith("#") && href.indexOf("type-param-") > -1) {
+ const target = document.getElementById(decodeURI(href.substring(1)));
+ if (target) {
+ target.style.animation = "none";
+ void target.offsetHeight;
+ target.style.removeProperty("animation");
+ }
+ }
+ })
+ });
+ // Make sure current element is visible in breadcrumb navigation on small displays
+ const subnav = document.querySelector("ol.sub-nav-list");
+ if (subnav && subnav.lastElementChild) {
+ subnav.lastElementChild.scrollIntoView({ behavior: "instant", inline: "start", block: "nearest" });
+ }
+ // Clone TOC sidebar to header for mobile navigation
+ const navbar = document.querySelector("div#navbar-top");
+ const sidebar = document.querySelector(".main-grid nav.toc");
+ const main = document.querySelector(".main-grid main");
+ const mainnav = navbar.querySelector("ul.nav-list");
+ const toggleButton = document.querySelector("button#navbar-toggle-button");
+ const toc = sidebar ? sidebar.cloneNode(true) : null;
+ if (toc) {
+ navbar.appendChild(toc);
+ }
+ document.querySelectorAll("input.filter-input").forEach(function(input) {
+ input.removeAttribute("disabled");
+ input.setAttribute("autocapitalize", "off");
+ input.value = "";
+ input.addEventListener("input", function(e) {
+ const pattern = input.value ? input.value.trim()
+ .replace(/[\[\]{}()*+?.\\^$|]/g, '\\$&')
+ .replace(/\s+/g, ".*") : "";
+ input.nextElementSibling.style.display = pattern ? "inline" : "none";
+ const filter = new RegExp(pattern, "i");
+ input.parentNode.parentNode.querySelectorAll("ol.toc-list li").forEach((li) => {
+ if (filter.test(li.innerText)) {
+ li.removeAttribute("style");
+ } else {
+ li.style.display = "none";
+ }
+ });
+ if (expanded) {
+ expand();
+ }
+ });
+ });
+ document.querySelectorAll("input.reset-filter").forEach((button) => {
+ button.removeAttribute("disabled");
+ button.addEventListener("click", (e) => {
+ const input = button.previousElementSibling;
+ input.value = "";
+ input.dispatchEvent(new InputEvent("input"));
+ input.focus();
+ if (expanded) {
+ expand();
+ } else {
+ prevHash = null;
+ handleScroll();
+ }
+ })
+ });
+ var expanded = false;
+ var windowWidth;
+ var bodyHeight;
+ function collapse(e) {
+ if (expanded) {
+ mainnav.removeAttribute("style");
+ if (toc) {
+ toc.removeAttribute("style");
+ }
+ toggleButton.classList.remove("expanded")
+ toggleButton.setAttribute("aria-expanded", "false");
+ expanded = false;
+ }
+ }
+ function expand() {
+ expanded = true;
+ mainnav.style.display = "block";
+ mainnav.style.removeProperty("height");
+ var maxHeight = window.innerHeight - subnav.offsetTop + 4;
+ var expandedHeight = Math.min(maxHeight, mainnav.scrollHeight + 10);
+ if (toc) {
+ toc.style.display = "flex";
+ expandedHeight = Math.min(maxHeight,
+ Math.max(expandedHeight, toc.querySelector("div.toc-header").offsetHeight
+ + toc.querySelector("ol.toc-list").scrollHeight + 10));
+ toc.style.height = expandedHeight + "px";
+ }
+ mainnav.style.height = expandedHeight + "px";
+ toggleButton.classList.add("expanded");
+ toggleButton.setAttribute("aria-expanded", "true");
+ windowWidth = window.innerWidth;
+ }
+ toggleButton.addEventListener("click", (e) => {
+ if (expanded) {
+ collapse();
+ } else {
+ expand();
+ }
+ });
+ if (toc) {
+ toc.querySelectorAll("a").forEach((link) => {
+ link.addEventListener("click", collapse);
+ });
+ }
+ document.addEventListener('keydown', (e) => {
+ if (e.key === "Escape") collapse();
+ });
+ document.querySelector("main").addEventListener("click", collapse);
+ const searchInput = document.getElementById("search-input");
+ if (searchInput) searchInput.addEventListener("focus", collapse);
+ document.querySelectorAll("h1, h2, h3, h4, h5, h6")
+ .forEach((hdr, idx) => {
+ // Create anchor links for headers with an associated id attribute
+ var id = hdr.parentElement.getAttribute("id") || hdr.getAttribute("id")
+ || (hdr.querySelector("a") && hdr.querySelector("a").getAttribute("id"));
+ if (id) {
+ var template = document.createElement('template');
+ template.innerHTML =" ";
+ hdr.append(...template.content.childNodes);
+ }
+ });
+ var sections;
+ var scrollTimeout;
+ var scrollTimeoutNeeded;
+ var prevHash;
+ function initSectionData() {
+ bodyHeight = document.body.offsetHeight;
+ sections = [{ id: "", top: 0 }].concat(Array.from(main.querySelectorAll("section[id], h2[id], h2 a[id], div[id]"))
+ .filter((e) => {
+ return sidebar.querySelector("a[href=\"#" + encodeURI(e.getAttribute("id")) + "\"]") !== null
+ }).map((e) => {
+ return {
+ id: e.getAttribute("id"),
+ top: e.offsetTop
+ };
+ }));
+ }
+ function setScrollTimeout() {
+ clearTimeout(scrollTimeout);
+ scrollTimeoutNeeded = false;
+ scrollTimeout = setTimeout(() => {
+ scrollTimeout = null;
+ handleScroll();
+ }, 100);
+ }
+ function handleScroll() {
+ if (!sidebar || !sidebar.offsetParent || sidebar.classList.contains("hide-sidebar")) {
+ return;
+ }
+ if (scrollTimeout || scrollTimeoutNeeded) {
+ setScrollTimeout();
+ return;
+ }
+ var scrollTop = document.documentElement.scrollTop;
+ var scrollHeight = document.documentElement.scrollHeight;
+ var currHash = null;
+ if (scrollHeight - scrollTop < window.innerHeight + 10) {
+ // Select last item if at bottom of the page
+ currHash = "#" + encodeURI(sections.at(-1).id);
+ } else {
+ for (var i = 0; i < sections.length; i++) {
+ var top = sections[i].top;
+ var bottom = sections[i + 1] ? sections[i + 1].top : scrollHeight;
+ if (top + ((bottom - top) / 2) > scrollTop || bottom > scrollTop + (window.innerHeight / 3)) {
+ currHash = "#" + encodeURI(sections[i].id);
+ break;
+ }
+ }
+ }
+ if (currHash !== prevHash) {
+ setSelected(currHash);
+ }
+ }
+ function setSelected(hash) {
+ var prev = sidebar.querySelector("a.current-selection");
+ if (prev)
+ prev.classList.remove("current-selection");
+ prevHash = hash;
+ if (hash) {
+ var curr = sidebar.querySelector("ol.toc-list a[href=\"" + hash + "\"]");
+ if (curr) {
+ curr.classList.add("current-selection");
+ curr.scrollIntoView({ behavior: "instant", block: "nearest" });
+ }
+ }
+ }
+ if (sidebar) {
+ initSectionData();
+ document.querySelectorAll("a[href^='#']").forEach((link) => {
+ link.addEventListener("click", (e) => {
+ scrollTimeoutNeeded = true;
+ setSelected(link.getAttribute("href"));
+ })
+ });
+ sidebar.querySelector("button.hide-sidebar").addEventListener("click", () => {
+ sidebar.classList.add("hide-sidebar");
+ sessionStorage.setItem("sidebar", "hidden");
+ });
+ sidebar.querySelector("button.show-sidebar").addEventListener("click", () => {
+ sidebar.classList.remove("hide-sidebar");
+ sessionStorage.removeItem("sidebar");
+ initSectionData();
+ handleScroll();
+ });
+ window.addEventListener("hashchange", (e) => {
+ scrollTimeoutNeeded = true;
+ });
+ if (document.location.hash) {
+ scrollTimeoutNeeded = true;
+ setSelected(document.location.hash);
+ } else {
+ handleScroll();
+ }
+ window.addEventListener("scroll", handleScroll);
+ window.addEventListener("scrollend", () => {
+ if (scrollTimeout) {
+ clearTimeout(scrollTimeout);
+ scrollTimeout = null;
+ handleScroll();
+ }
+ })
+ }
+ // Resize handler
+ new ResizeObserver((entries) => {
+ if (expanded) {
+ if (windowWidth !== window.innerWidth) {
+ collapse();
+ } else {
+ expand();
+ }
+ }
+ if (sections && document.body.offsetHeight !== bodyHeight) {
+ initSectionData();
+ prevHash = null;
+ handleScroll();
+ }
+ setTopMargin();
+ }).observe(document.body);
+});
diff --git a/docjava/script-files/search-page.js b/docjava/script-files/search-page.js
new file mode 100644
index 0000000..bcbd9b5
--- /dev/null
+++ b/docjava/script-files/search-page.js
@@ -0,0 +1,267 @@
+/*
+ * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
+ */
+
+"use strict";
+$(function() {
+ var copy = $("#page-search-copy");
+ var expand = $("#page-search-expand");
+ var searchLink = $("span#page-search-link");
+ var redirect = $("input#search-redirect");
+ function setSearchUrlTemplate() {
+ var href = document.location.href.split(/[#?]/)[0];
+ href += "?q=" + "%s";
+ if (redirect.is(":checked")) {
+ href += "&r=1";
+ }
+ searchLink.html(href);
+ copy[0].onmouseenter();
+ }
+ function copyLink(e) {
+ copyToClipboard(this.previousSibling.innerText);
+ switchCopyLabel(this, this.lastElementChild);
+ }
+ copy.click(copyLink);
+ copy[0].onmouseenter = function() {};
+ redirect.click(setSearchUrlTemplate);
+ setSearchUrlTemplate();
+ copy.prop("disabled", false);
+ redirect.prop("disabled", false);
+ expand.click(function (e) {
+ var searchInfo = $("div.page-search-info");
+ if(this.parentElement.hasAttribute("open")) {
+ searchInfo.attr("style", "border-width: 0;");
+ } else {
+ searchInfo.attr("style", "border-width: 1px;").height(searchInfo.prop("scrollHeight"));
+ }
+ });
+});
+$(window).on("load", function() {
+ var input = $("#page-search-input");
+ var reset = $("#page-search-reset");
+ var notify = $("#page-search-notify");
+ var resultSection = $("div#result-section");
+ var resultContainer = $("div#result-container");
+ var searchTerm = "";
+ var activeTab = "";
+ var fixedTab = false;
+ var visibleTabs = [];
+ var feelingLucky = false;
+ function renderResults(result) {
+ if (!result.length) {
+ notify.html(messages.noResult);
+ } else if (result.length === 1) {
+ notify.html(messages.oneResult);
+ } else {
+ notify.html(messages.manyResults.replace("{0}", result.length));
+ }
+ resultContainer.empty();
+ var r = {
+ "types": [],
+ "members": [],
+ "packages": [],
+ "modules": [],
+ "searchTags": []
+ };
+ for (var i in result) {
+ var item = result[i];
+ var arr = r[item.category];
+ arr.push(item);
+ }
+ if (!activeTab || r[activeTab].length === 0 || !fixedTab) {
+ Object.keys(r).reduce(function(prev, curr) {
+ if (r[curr].length > 0 && r[curr][0].score > prev) {
+ activeTab = curr;
+ return r[curr][0].score;
+ }
+ return prev;
+ }, 0);
+ }
+ if (feelingLucky && activeTab) {
+ notify.html(messages.redirecting)
+ var firstItem = r[activeTab][0];
+ window.location = getURL(firstItem.indexItem, firstItem.category);
+ return;
+ }
+ if (result.length > 20) {
+ if (searchTerm[searchTerm.length - 1] === ".") {
+ if (activeTab === "types" && r["members"].length > r["types"].length) {
+ activeTab = "members";
+ } else if (activeTab === "packages" && r["types"].length > r["packages"].length) {
+ activeTab = "types";
+ }
+ }
+ }
+ var categoryCount = Object.keys(r).reduce(function(prev, curr) {
+ return prev + (r[curr].length > 0 ? 1 : 0);
+ }, 0);
+ visibleTabs = [];
+ var tabContainer = $("
").appendTo(resultContainer);
+ for (var key in r) {
+ var id = "#result-tab-" + key.replace("searchTags", "search_tags");
+ if (r[key].length) {
+ var count = r[key].length >= 1000 ? "999+" : r[key].length;
+ if (result.length > 20 && categoryCount > 1) {
+ var button = $("").appendTo(tabContainer);
+ button.click(key, function(e) {
+ fixedTab = true;
+ renderResult(e.data, $(this));
+ });
+ visibleTabs.push(key);
+ } else {
+ $("").appendTo(tabContainer);
+ renderTable(key, r[key]).appendTo(resultContainer);
+ tabContainer = $("
").appendTo(resultContainer);
+
+ }
+ }
+ }
+ if (activeTab && result.length > 20 && categoryCount > 1) {
+ $("button#result-tab-" + activeTab).addClass("active-table-tab");
+ renderTable(activeTab, r[activeTab]).appendTo(resultContainer);
+ }
+ resultSection.show();
+ function renderResult(category, button) {
+ activeTab = category;
+ setSearchUrl();
+ resultContainer.find("div.summary-table").remove();
+ renderTable(activeTab, r[activeTab]).appendTo(resultContainer);
+ button.siblings().removeClass("active-table-tab");
+ button.addClass("active-table-tab");
+ }
+ }
+ function selectTab(category) {
+ $("button#result-tab-" + category).click();
+ }
+ function renderTable(category, items) {
+ var table = $("")
+ .addClass(category === "modules"
+ ? "one-column-search-results"
+ : "two-column-search-results");
+ var col1, col2;
+ if (category === "modules") {
+ col1 = "Module";
+ } else if (category === "packages") {
+ col1 = "Module";
+ col2 = "Package";
+ } else if (category === "types") {
+ col1 = "Package";
+ col2 = "Class"
+ } else if (category === "members") {
+ col1 = "Class";
+ col2 = "Member";
+ } else if (category === "searchTags") {
+ col1 = "Location";
+ col2 = "Name";
+ }
+ $("").appendTo(table);
+ if (category !== "modules") {
+ $("").appendTo(table);
+ }
+ $.each(items, function(index, item) {
+ var rowColor = index % 2 ? "odd-row-color" : "even-row-color";
+ renderItem(item, table, rowColor);
+ });
+ return table;
+ }
+ function renderItem(item, table, rowColor) {
+ var label = getHighlightedText(item.input, item.boundaries, item.prefix.length, item.input.length);
+ var link = $("
")
+ .attr("href", getURL(item.indexItem, item.category))
+ .attr("tabindex", "0")
+ .addClass("search-result-link")
+ .html(label);
+ var container = getHighlightedText(item.input, item.boundaries, 0, item.prefix.length - 1);
+ if (item.category === "searchTags") {
+ container = item.indexItem.h || "";
+ }
+ if (item.category !== "modules") {
+ $("
").html(container).addClass("col-plain").addClass(rowColor).appendTo(table);
+ }
+ $("
").html(link).addClass("col-last").addClass(rowColor).appendTo(table);
+ }
+ var timeout;
+ function schedulePageSearch() {
+ if (timeout) {
+ clearTimeout(timeout);
+ }
+ timeout = setTimeout(function () {
+ doPageSearch()
+ }, 100);
+ }
+ function doPageSearch() {
+ setSearchUrl();
+ var term = searchTerm = input.val().trim();
+ if (term === "") {
+ notify.html(messages.enterTerm);
+ activeTab = "";
+ fixedTab = false;
+ resultContainer.empty();
+ resultSection.hide();
+ } else {
+ notify.html(messages.searching);
+ doSearch({ term: term, maxResults: 1200 }, renderResults);
+ }
+ }
+ function setSearchUrl() {
+ var query = input.val().trim();
+ var url = document.location.pathname;
+ if (query) {
+ url += "?q=" + encodeURI(query);
+ if (activeTab && fixedTab) {
+ url += "&c=" + activeTab;
+ }
+ }
+ history.replaceState({query: query}, "", url);
+ }
+ input.on("input", function(e) {
+ feelingLucky = false;
+ schedulePageSearch();
+ });
+ $(document).keydown(function(e) {
+ if ((e.ctrlKey || e.metaKey) && (e.key === "ArrowLeft" || e.key === "ArrowRight")) {
+ if (activeTab && visibleTabs.length > 1) {
+ var idx = visibleTabs.indexOf(activeTab);
+ idx += e.key === "ArrowLeft" ? visibleTabs.length - 1 : 1;
+ selectTab(visibleTabs[idx % visibleTabs.length]);
+ return false;
+ }
+ }
+ });
+ reset.click(function() {
+ notify.html(messages.enterTerm);
+ resultSection.hide();
+ activeTab = "";
+ fixedTab = false;
+ resultContainer.empty();
+ input.val('').focus();
+ setSearchUrl();
+ });
+ input.prop("disabled", false);
+ input.attr("autocapitalize", "off");
+ reset.prop("disabled", false);
+
+ var urlParams = new URLSearchParams(window.location.search);
+ if (urlParams.has("q")) {
+ input.val(urlParams.get("q"))
+ }
+ if (urlParams.has("c")) {
+ activeTab = urlParams.get("c");
+ fixedTab = true;
+ }
+ if (urlParams.get("r")) {
+ feelingLucky = true;
+ }
+ if (input.val()) {
+ doPageSearch();
+ } else {
+ notify.html(messages.enterTerm);
+ }
+ input.select().focus();
+});
diff --git a/docjava/script-files/search.js b/docjava/script-files/search.js
new file mode 100644
index 0000000..0486cc6
--- /dev/null
+++ b/docjava/script-files/search.js
@@ -0,0 +1,436 @@
+/*
+ * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
+ */
+"use strict";
+const messages = {
+ enterTerm: "Enter a search term",
+ noResult: "No results found",
+ oneResult: "Found one result",
+ manyResults: "Found {0} results",
+ loading: "Loading search index...",
+ searching: "Searching...",
+ redirecting: "Redirecting to first result...",
+}
+const categories = {
+ modules: "Modules",
+ packages: "Packages",
+ types: "Classes and Interfaces",
+ members: "Members",
+ searchTags: "Search Tags"
+};
+const highlight = "
$& ";
+const NO_MATCH = {};
+const MAX_RESULTS = 300;
+const UNICODE_LETTER = 0;
+const UNICODE_DIGIT = 1;
+const UNICODE_OTHER = 2;
+function checkUnnamed(name, separator) {
+ return name === "
" || !name ? "" : name + separator;
+}
+function escapeHtml(str) {
+ return str.replace(//g, ">");
+}
+function getHighlightedText(str, boundaries, from, to) {
+ var start = from;
+ var text = "";
+ for (var i = 0; i < boundaries.length; i += 2) {
+ var b0 = boundaries[i];
+ var b1 = boundaries[i + 1];
+ if (b0 >= to || b1 <= from) {
+ continue;
+ }
+ text += escapeHtml(str.slice(start, Math.max(start, b0)));
+ text += "";
+ text += escapeHtml(str.slice(Math.max(start, b0), Math.min(to, b1)));
+ text += " ";
+ start = Math.min(to, b1);
+ }
+ text += escapeHtml(str.slice(start, to));
+ return text;
+}
+function getURLPrefix(item, category) {
+ var urlPrefix = "";
+ var slash = "/";
+ if (category === "modules") {
+ return item.l + slash;
+ } else if (category === "packages" && item.m) {
+ return item.m + slash;
+ } else if (category === "types" || category === "members") {
+ if (item.m) {
+ urlPrefix = item.m + slash;
+ } else {
+ $.each(packageSearchIndex, function(index, it) {
+ if (it.m && item.p === it.l) {
+ urlPrefix = it.m + slash;
+ }
+ });
+ }
+ }
+ return urlPrefix;
+}
+function getURL(item, category) {
+ if (item.url) {
+ return item.url;
+ }
+ var url = getURLPrefix(item, category);
+ if (category === "modules") {
+ url += "module-summary.html";
+ } else if (category === "packages") {
+ if (item.u) {
+ url = item.u;
+ } else {
+ url += item.l.replace(/\./g, '/') + "/package-summary.html";
+ }
+ } else if (category === "types") {
+ if (item.u) {
+ url = item.u;
+ } else {
+ url += checkUnnamed(item.p, "/").replace(/\./g, '/') + item.l + ".html";
+ }
+ } else if (category === "members") {
+ url += checkUnnamed(item.p, "/").replace(/\./g, '/') + item.c + ".html" + "#";
+ if (item.u) {
+ url += item.u;
+ } else {
+ url += item.l;
+ }
+ } else if (category === "searchTags") {
+ url += item.u;
+ }
+ item.url = url;
+ return url;
+}
+function createMatcher(term, camelCase) {
+ if (camelCase && !isUpperCase(term)) {
+ return null; // no need for camel-case matcher for lower case query
+ }
+ var pattern = "";
+ var upperCase = [];
+ term.trim().split(/\s+/).forEach(function(w, index, array) {
+ var tokens = w.split(/(?=[\p{Lu},.()<>?[\/])/u);
+ for (var i = 0; i < tokens.length; i++) {
+ var s = tokens[i];
+ // ',' and '?' are the only delimiters commonly followed by space in java signatures
+ pattern += "(" + escapeUnicodeRegex(s).replace(/[,?]/g, "$&\\s*?") + ")";
+ upperCase.push(false);
+ var isWordToken = /[\p{L}\p{Nd}_]$/u.test(s);
+ if (isWordToken) {
+ if (i === tokens.length - 1 && index < array.length - 1) {
+ // space in query string matches all delimiters
+ pattern += "(.*?)";
+ upperCase.push(isUpperCase(s[0]));
+ } else {
+ if (!camelCase && isUpperCase(s) && s.length === 1) {
+ pattern += "()";
+ } else {
+ pattern += "([\\p{L}\\p{Nd}\\p{Sc}<>?[\\]]*?)";
+ }
+ upperCase.push(isUpperCase(s[0]));
+ }
+ } else {
+ pattern += "()";
+ upperCase.push(false);
+ }
+ }
+ });
+ var re = new RegExp(pattern, "gui");
+ re.upperCase = upperCase;
+ return re;
+}
+// Unicode regular expressions do not allow certain characters to be escaped
+function escapeUnicodeRegex(pattern) {
+ return pattern.replace(/[\[\]{}()*+?.\\^$|\s]/g, '\\$&');
+}
+function findMatch(matcher, input, startOfName, endOfName) {
+ var from = startOfName;
+ matcher.lastIndex = from;
+ var match = matcher.exec(input);
+ // Expand search area until we get a valid result or reach the beginning of the string
+ while (!match || match.index + match[0].length < startOfName || endOfName < match.index) {
+ if (from === 0) {
+ return NO_MATCH;
+ }
+ from = input.lastIndexOf(".", from - 2) + 1;
+ matcher.lastIndex = from;
+ match = matcher.exec(input);
+ }
+ var boundaries = [];
+ var matchEnd = match.index + match[0].length;
+ var score = 5;
+ var start = match.index;
+ var prevEnd = -1;
+ for (var i = 1; i < match.length; i += 2) {
+ var charType = getCharType(input[start]);
+ var isMatcherUpper = matcher.upperCase[i];
+ // capturing groups come in pairs, match and non-match
+ boundaries.push(start, start + match[i].length);
+ // make sure groups are anchored on a left word boundary
+ var prevChar = input[start - 1] || "";
+ var nextChar = input[start + 1] || "";
+ if (start !== 0) {
+ if (charType === UNICODE_DIGIT && getCharType(prevChar) === UNICODE_DIGIT) {
+ return NO_MATCH;
+ } else if (charType === UNICODE_LETTER && getCharType(prevChar) === UNICODE_LETTER) {
+ var isUpper = isUpperCase(input[start]);
+ if (isUpper && (isLowerCase(prevChar) || isLowerCase(nextChar))) {
+ score -= 0.1;
+ } else if (isMatcherUpper && start === prevEnd) {
+ score -= isUpper ? 0.1 : 1.0;
+ } else {
+ return NO_MATCH;
+ }
+ }
+ }
+ prevEnd = start + match[i].length;
+ start += match[i].length + match[i + 1].length;
+
+ // lower score for parts of the name that are missing
+ if (match[i + 1] && prevEnd < endOfName) {
+ score -= rateNoise(match[i + 1]);
+ }
+ }
+ // lower score if a type name contains unmatched camel-case parts
+ if (input[matchEnd - 1] !== "." && endOfName > matchEnd)
+ score -= rateNoise(input.slice(matchEnd, endOfName));
+ score -= rateNoise(input.slice(0, Math.max(startOfName, match.index)));
+
+ if (score <= 0) {
+ return NO_MATCH;
+ }
+ return {
+ input: input,
+ score: score,
+ boundaries: boundaries
+ };
+}
+function isLetter(s) {
+ return /\p{L}/u.test(s);
+}
+function isUpperCase(s) {
+ return /\p{Lu}/u.test(s);
+}
+function isLowerCase(s) {
+ return /\p{Ll}/u.test(s);
+}
+function isDigit(s) {
+ return /\p{Nd}/u.test(s);
+}
+function getCharType(s) {
+ if (isLetter(s)) {
+ return UNICODE_LETTER;
+ } else if (isDigit(s)) {
+ return UNICODE_DIGIT;
+ } else {
+ return UNICODE_OTHER;
+ }
+}
+function rateNoise(str) {
+ return (str.match(/([.(])/g) || []).length / 5
+ + (str.match(/(\p{Lu}+)/gu) || []).length / 10
+ + str.length / 20;
+}
+function doSearch(request, response) {
+ var term = request.term.trim();
+ var maxResults = request.maxResults || MAX_RESULTS;
+ var matcher = {
+ plainMatcher: createMatcher(term, false),
+ camelCaseMatcher: createMatcher(term, true)
+ }
+ var indexLoaded = indexFilesLoaded();
+
+ function getPrefix(item, category) {
+ switch (category) {
+ case "packages":
+ return checkUnnamed(item.m, "/");
+ case "types":
+ return checkUnnamed(item.p, ".");
+ case "members":
+ return checkUnnamed(item.p, ".") + item.c + ".";
+ default:
+ return "";
+ }
+ }
+ function useQualifiedName(category) {
+ switch (category) {
+ case "packages":
+ return /[\s/]/.test(term);
+ case "types":
+ case "members":
+ return /[\s.]/.test(term);
+ default:
+ return false;
+ }
+ }
+ function searchIndex(indexArray, category) {
+ var matches = [];
+ if (!indexArray) {
+ if (!indexLoaded) {
+ matches.push({ l: messages.loading, category: category });
+ }
+ return matches;
+ }
+ $.each(indexArray, function (i, item) {
+ var prefix = getPrefix(item, category);
+ var simpleName = item.l;
+ var qualifiedName = prefix + simpleName;
+ var useQualified = useQualifiedName(category);
+ var input = useQualified ? qualifiedName : simpleName;
+ var startOfName = useQualified ? prefix.length : 0;
+ var endOfName = category === "members" && input.indexOf("(", startOfName) > -1
+ ? input.indexOf("(", startOfName) : input.length;
+ var m = findMatch(matcher.plainMatcher, input, startOfName, endOfName);
+ if (m === NO_MATCH && matcher.camelCaseMatcher) {
+ m = findMatch(matcher.camelCaseMatcher, input, startOfName, endOfName);
+ }
+ if (m !== NO_MATCH) {
+ m.indexItem = item;
+ m.prefix = prefix;
+ m.category = category;
+ if (!useQualified) {
+ m.input = qualifiedName;
+ m.boundaries = m.boundaries.map(function(b) {
+ return b + prefix.length;
+ });
+ }
+ matches.push(m);
+ }
+ return true;
+ });
+ return matches.sort(function(e1, e2) {
+ return e2.score - e1.score;
+ }).slice(0, maxResults);
+ }
+
+ var result = searchIndex(moduleSearchIndex, "modules")
+ .concat(searchIndex(packageSearchIndex, "packages"))
+ .concat(searchIndex(typeSearchIndex, "types"))
+ .concat(searchIndex(memberSearchIndex, "members"))
+ .concat(searchIndex(tagSearchIndex, "searchTags"));
+
+ if (!indexLoaded) {
+ updateSearchResults = function() {
+ doSearch(request, response);
+ }
+ } else {
+ updateSearchResults = function() {};
+ }
+ response(result);
+}
+// JQuery search menu implementation
+$.widget("custom.catcomplete", $.ui.autocomplete, {
+ _create: function() {
+ this._super();
+ this.widget().menu("option", "items", "> .result-item");
+ // workaround for search result scrolling
+ this.menu._scrollIntoView = function _scrollIntoView( item ) {
+ var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
+ if ( this._hasScroll() ) {
+ borderTop = parseFloat( $.css( this.activeMenu[ 0 ], "borderTopWidth" ) ) || 0;
+ paddingTop = parseFloat( $.css( this.activeMenu[ 0 ], "paddingTop" ) ) || 0;
+ offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
+ scroll = this.activeMenu.scrollTop();
+ elementHeight = this.activeMenu.height() - 26;
+ itemHeight = item.outerHeight();
+
+ if ( offset < 0 ) {
+ this.activeMenu.scrollTop( scroll + offset );
+ } else if ( offset + itemHeight > elementHeight ) {
+ this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
+ }
+ }
+ };
+ },
+ _renderMenu: function(ul, items) {
+ var currentCategory = "";
+ var widget = this;
+ widget.menu.bindings = $();
+ $.each(items, function(index, item) {
+ if (item.category && item.category !== currentCategory) {
+ ul.append("" + categories[item.category] + " ");
+ currentCategory = item.category;
+ }
+ var li = widget._renderItemData(ul, item);
+ if (item.category) {
+ li.attr("aria-label", categories[item.category] + " : " + item.l);
+ } else {
+ li.attr("aria-label", item.l);
+ }
+ li.attr("class", "result-item");
+ });
+ ul.append("Go to search page ");
+ },
+ _renderItem: function(ul, item) {
+ var li = $(" ").appendTo(ul);
+ var div = $("
").appendTo(li);
+ var label = item.l
+ ? item.l
+ : getHighlightedText(item.input, item.boundaries, 0, item.input.length);
+ var idx = item.indexItem;
+ if (item.category === "searchTags" && idx && idx.h) {
+ if (idx.d) {
+ div.html(label + " (" + idx.h + ") "
+ + idx.d + " ");
+ } else {
+ div.html(label + " (" + idx.h + ") ");
+ }
+ } else {
+ div.html(label);
+ }
+ return li;
+ }
+});
+$(function() {
+ var search = $("#search-input");
+ var reset = $("#reset-search");
+ search.catcomplete({
+ minLength: 1,
+ delay: 200,
+ source: function(request, response) {
+ reset.css("display", "inline");
+ if (request.term.trim() === "") {
+ return this.close();
+ }
+ return doSearch(request, response);
+ },
+ response: function(event, ui) {
+ if (!ui.content.length) {
+ ui.content.push({ l: messages.noResult });
+ } else {
+ $("#search-input").empty();
+ }
+ },
+ close: function(event, ui) {
+ reset.css("display", search.val() ? "inline" : "none");
+ },
+ change: function(event, ui) {
+ reset.css("display", search.val() ? "inline" : "none");
+ },
+ autoFocus: true,
+ focus: function(event, ui) {
+ return false;
+ },
+ position: {
+ collision: "flip"
+ },
+ select: function(event, ui) {
+ if (ui.item.indexItem) {
+ var url = getURL(ui.item.indexItem, ui.item.category);
+ window.location.href = pathtoroot + url;
+ $("#search-input").focus();
+ }
+ }
+ });
+ search.val('');
+ search.prop("disabled", false);
+ search.attr("autocapitalize", "off");
+ reset.prop("disabled", false);
+ reset.click(function() {
+ search.val('').focus();
+ reset.css("display", "none");
+ });
+ search.focus();
+});
diff --git a/docjava/search.html b/docjava/search.html
new file mode 100644
index 0000000..1f59942
--- /dev/null
+++ b/docjava/search.html
@@ -0,0 +1,74 @@
+
+
+
+
+Search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+Search
+
+
+
+
+Additional resources
+
+
+
+
The help page provides an introduction to the scope and syntax of JavaDoc search.
+
You can use the <ctrl> or <cmd> keys in combination with the left and right arrow keys to switch between result tabs in this page.
+
The URL template below may be used to configure this page as a search engine in browsers that support this feature. It has been tested to work in Google Chrome and Mozilla Firefox. Note that other browsers may not support this feature or require a different URL format.
+
link Copy
+
+
+Redirect to first result
+
+Loading search index...
+
+
+
+
+
diff --git a/docjava/serialized-form.html b/docjava/serialized-form.html
new file mode 100644
index 0000000..cb4d1ab
--- /dev/null
+++ b/docjava/serialized-form.html
@@ -0,0 +1,238 @@
+
+
+
+
+Serialized Form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JavaScript is disabled on your browser.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Serialized Fields
+
+
+freqBleu
+JTextArea freqBleu
+Zone d'affichage pour les fréquences du bleu.
+
+
+freqRouge
+JTextArea freqRouge
+Zone d'affichage pour les fréquences du rouge.
+
+
+freqVert
+JTextArea freqVert
+Zone d'affichage pour les fréquences du vert.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Serialized Fields
+
+
+image
+BufferedImage image
+
+
+lastX
+int lastX
+
+
+lastY
+int lastY
+
+
+offsetX
+int offsetX
+
+
+offsetY
+int offsetY
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docjava/tag-search-index.js b/docjava/tag-search-index.js
new file mode 100644
index 0000000..f38b3cb
--- /dev/null
+++ b/docjava/tag-search-index.js
@@ -0,0 +1 @@
+tagSearchIndex = [{"l":"Serialized Form","h":"","u":"serialized-form.html"}];updateSearchResults();
\ No newline at end of file
diff --git a/docjava/type-search-index.js b/docjava/type-search-index.js
new file mode 100644
index 0000000..3c0ba3a
--- /dev/null
+++ b/docjava/type-search-index.js
@@ -0,0 +1 @@
+typeSearchIndex = [{"l":"All Classes and Interfaces","u":"allclasses-index.html"},{"p":"fr.iutfbleau.sae.mpif","l":"BitInputStream"},{"p":"fr.iutfbleau.sae.mpif","l":"BitOutputStream"},{"p":"fr.iutfbleau.sae.mhuffman","l":"CanonicalCode"},{"p":"fr.iutfbleau.sae","l":"CodeTablePanel"},{"p":"fr.iutfbleau.sae.mhuffman","l":"ComparateurCanonique"},{"p":"fr.iutfbleau.sae.mpif","l":"ComparateurEntreeCanonique"},{"p":"fr.iutfbleau.sae.mhuffman","l":"ComparateurHuffmanNode"},{"p":"fr.iutfbleau.sae","l":"ConverterController"},{"p":"fr.iutfbleau.sae","l":"ConverterWindow"},{"p":"fr.iutfbleau.sae","l":"Convertisseur"},{"p":"fr.iutfbleau.sae.mpif","l":"DecodeNode"},{"p":"fr.iutfbleau.sae","l":"ExportButtonListener"},{"p":"fr.iutfbleau.sae.mhuffman","l":"FrequencyTable"},{"p":"fr.iutfbleau.sae","l":"FrequencyTablePanel"},{"p":"fr.iutfbleau.sae","l":"GestionErreur"},{"p":"fr.iutfbleau.sae.mhuffman","l":"HuffmanNode"},{"p":"fr.iutfbleau.sae.mhuffman","l":"HuffmanTree"},{"p":"fr.iutfbleau.sae","l":"ImagePreviewPanel"},{"p":"fr.iutfbleau.sae.mpif","l":"PIFReader"},{"p":"fr.iutfbleau.sae.mpif","l":"PIFWriter"},{"p":"fr.iutfbleau.sae.mpif","l":"Pixel"},{"p":"fr.iutfbleau.sae.mpif","l":"RGBImage"},{"p":"fr.iutfbleau.sae","l":"ThreadSauvegardePIF"},{"p":"fr.iutfbleau.sae","l":"Viewer"},{"p":"fr.iutfbleau.sae","l":"ViewerControleur"},{"p":"fr.iutfbleau.sae","l":"ViewerImagePanel"},{"p":"fr.iutfbleau.sae","l":"ViewerWindow"}];updateSearchResults();
\ No newline at end of file
diff --git a/hommePommeJPG.pif b/hommePommeJPG.pif
deleted file mode 100644
index 9ceb231..0000000
Binary files a/hommePommeJPG.pif and /dev/null differ
diff --git a/makefile b/makefile
index 30dc1a5..3ace49e 100644
--- a/makefile
+++ b/makefile
@@ -51,29 +51,33 @@ $(DOC):
mkdir -p $(DOC)
-# Compilation des classes util
-$(BIN)/$(PKG_PATH)/util/DecodeNode.class: $(BIN) \
- $(SRC)/$(PKG_PATH)/util/DecodeNode.java
- $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/util/DecodeNode.java
+$(BIN)/$(PKG_PATH)/mpif/DecodeNode.class: $(BIN) \
+ $(SRC)/$(PKG_PATH)/mpif/DecodeNode.java
+ $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/mpif/DecodeNode.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)/mpif/BitInputStream.class: $(BIN) \
+ $(SRC)/$(PKG_PATH)/mpif/BitInputStream.java
+ $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/mpif/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
+$(BIN)/$(PKG_PATH)/mpif/BitOutputStream.class: $(BIN) \
+ $(SRC)/$(PKG_PATH)/mpif/BitOutputStream.java
+ $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/mpif/BitOutputStream.java
-$(BIN)/$(PKG_PATH)/util/GestionErreur.class: $(BIN) \
- $(SRC)/$(PKG_PATH)/util/GestionErreur.java
- $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/util/GestionErreur.java
+$(BIN)/$(PKG_PATH)/GestionErreur.class: $(BIN) \
+ $(SRC)/$(PKG_PATH)/GestionErreur.java
+ $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/GestionErreur.java
-$(BIN)/$(PKG_PATH)/util/HuffmanNode.class: $(BIN) \
- $(SRC)/$(PKG_PATH)/util/HuffmanNode.java
- $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/util/HuffmanNode.java
+$(BIN)/$(PKG_PATH)/mhuffman/HuffmanNode.class: $(BIN) \
+ $(SRC)/$(PKG_PATH)/mhuffman/HuffmanNode.java
+ $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/mhuffman/HuffmanNode.java
+
# Compilation des classes mhuffman
+$(BIN)/$(PKG_PATH)/mhuffman/ComparateurHuffmanNode.class: $(BIN) \
+ $(SRC)/$(PKG_PATH)/mhuffman/ComparateurHuffmanNode.java
+ $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/mhuffman/ComparateurHuffmanNode.java
+
$(BIN)/$(PKG_PATH)/mhuffman/ComparateurCanonique.class: $(BIN) \
$(SRC)/$(PKG_PATH)/mhuffman/ComparateurCanonique.java
$(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/mhuffman/ComparateurCanonique.java
@@ -89,33 +93,13 @@ $(BIN)/$(PKG_PATH)/mhuffman/FrequencyTable.class: $(BIN) \
$(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/mhuffman/FrequencyTable.java
$(BIN)/$(PKG_PATH)/mhuffman/HuffmanTree.class: $(BIN) \
- $(BIN)/$(PKG_PATH)/util/HuffmanNode.class \
+ $(BIN)/$(PKG_PATH)/mhuffman/HuffmanNode.class \
+ $(BIN)/$(PKG_PATH)/mhuffman/ComparateurHuffmanNode.class \
$(SRC)/$(PKG_PATH)/mhuffman/HuffmanTree.java
$(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/mhuffman/HuffmanTree.java
-
-
-# Interface graphique
-$(BIN)/$(PKG_PATH)/ImagePreviewPanel.class: $(BIN) \
- $(SRC)/$(PKG_PATH)/ImagePreviewPanel.java
- $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/ImagePreviewPanel.java
-
-$(BIN)/$(PKG_PATH)/FrequencyTablePanel.class: $(BIN) \
- $(SRC)/$(PKG_PATH)/FrequencyTablePanel.java
- $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/FrequencyTablePanel.java
-
-$(BIN)/$(PKG_PATH)/CodeTablePanel.class: $(BIN) \
- $(SRC)/$(PKG_PATH)/CodeTablePanel.java
- $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/CodeTablePanel.java
-
-$(BIN)/$(PKG_PATH)/ViewerWindow.class: $(BIN) \
- $(SRC)/$(PKG_PATH)/ViewerWindow.java
- $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/ViewerWindow.java
-
-
-
# Compilation des classe mpif
$(BIN)/$(PKG_PATH)/mpif/ComparateurEntreeCanonique.class: $(BIN) \
$(SRC)/$(PKG_PATH)/mpif/ComparateurEntreeCanonique.java
@@ -132,14 +116,14 @@ $(BIN)/$(PKG_PATH)/mpif/RGBImage.class: $(BIN) \
$(BIN)/$(PKG_PATH)/mpif/PIFWriter.class: $(BIN) \
$(BIN)/$(PKG_PATH)/mpif/RGBImage.class \
- $(BIN)/$(PKG_PATH)/util/BitOutputStream.class \
+ $(BIN)/$(PKG_PATH)/mpif/BitOutputStream.class \
$(SRC)/$(PKG_PATH)/mpif/PIFWriter.java
$(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/mpif/PIFWriter.java
$(BIN)/$(PKG_PATH)/mpif/PIFReader.class: $(BIN) \
$(BIN)/$(PKG_PATH)/mpif/RGBImage.class \
- $(BIN)/$(PKG_PATH)/util/BitInputStream.class \
- $(BIN)/$(PKG_PATH)/util/DecodeNode.class \
+ $(BIN)/$(PKG_PATH)/mpif/BitInputStream.class \
+ $(BIN)/$(PKG_PATH)/mpif/DecodeNode.class \
$(BIN)/$(PKG_PATH)/mpif/ComparateurEntreeCanonique.class \
$(SRC)/$(PKG_PATH)/mpif/PIFReader.java
$(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/mpif/PIFReader.java
@@ -147,14 +131,42 @@ $(BIN)/$(PKG_PATH)/mpif/PIFReader.class: $(BIN) \
-# GROSSE compilation du listener + ConvertController + ConvertWindow + PIFSaverTask car il y a une dependance cirulaire
+
+
+# Interface graphique
+$(BIN)/$(PKG_PATH)/ImagePreviewPanel.class: $(BIN) \
+ $(SRC)/$(PKG_PATH)/ImagePreviewPanel.java
+ $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/ImagePreviewPanel.java
+
+$(BIN)/$(PKG_PATH)/FrequencyTablePanel.class: $(BIN) \
+ $(SRC)/$(PKG_PATH)/FrequencyTablePanel.java
+ $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/FrequencyTablePanel.java
+
+$(BIN)/$(PKG_PATH)/CodeTablePanel.class: $(BIN) \
+ $(SRC)/$(PKG_PATH)/CodeTablePanel.java
+ $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/CodeTablePanel.java
+
+$(BIN)/$(PKG_PATH)/ViewerWindow.class: $(BIN) \
+ $(BIN)/$(PKG_PATH)/ViewerImagePanel.class \
+ $(SRC)/$(PKG_PATH)/ViewerWindow.java
+ $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/ViewerWindow.java
+
+$(BIN)/$(PKG_PATH)/ViewerImagePanel.class: $(BIN) \
+ $(SRC)/$(PKG_PATH)/ViewerImagePanel.java
+ $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/ViewerImagePanel.java
+
+
+
+
+
+# GROSSE compilation du listener + ConvertController + ConvertWindow car il y a une dependance cirulaire
$(BIN)/$(PKG_PATH)/ConverterController.class \
$(BIN)/$(PKG_PATH)/ExportButtonListener.class \
-$(BIN)/$(PKG_PATH)/PIFSaveTask.class \
+$(BIN)/$(PKG_PATH)/ThreadSauvegardePIF.class:
$(BIN)/$(PKG_PATH)/ConverterWindow.class: \
$(SRC)/$(PKG_PATH)/ConverterController.java \
$(SRC)/$(PKG_PATH)/ExportButtonListener.java \
-$(SRC)/$(PKG_PATH)/PIFSaveTask.java \
+$(SRC)/$(PKG_PATH)/ThreadSauvegardePIF.java \
$(SRC)/$(PKG_PATH)/ConverterWindow.java \
$(BIN)/$(PKG_PATH)/mpif/Pixel.class \
$(BIN)/$(PKG_PATH)/mpif/RGBImage.class \
@@ -164,35 +176,56 @@ $(BIN)/$(PKG_PATH)/mhuffman/CanonicalCode.class \
$(BIN)/$(PKG_PATH)/ImagePreviewPanel.class \
$(BIN)/$(PKG_PATH)/FrequencyTablePanel.class \
$(BIN)/$(PKG_PATH)/CodeTablePanel.class \
-$(BIN)/$(PKG_PATH)/util/GestionErreur.class \
+$(BIN)/$(PKG_PATH)/ThreadSauvegardePIF.class \
+$(BIN)/$(PKG_PATH)/GestionErreur.class \
$(BIN)/$(PKG_PATH)/mpif/PIFWriter.class | $(BIN)
@$(JAVAC) -cp $(BIN) -d $(BIN) \
$(SRC)/$(PKG_PATH)/ConverterController.java \
$(SRC)/$(PKG_PATH)/ExportButtonListener.java \
- $(SRC)/$(PKG_PATH)/PIFSaveTask.java \
+ $(SRC)/$(PKG_PATH)/ThreadSauvegardePIF.java \
$(SRC)/$(PKG_PATH)/ConverterWindow.java
#Controleur de viewer
$(BIN)/$(PKG_PATH)/ViewerControleur.class: $(BIN) \
$(BIN)/$(PKG_PATH)/mpif/RGBImage.class \
- $(BIN)/$(PKG_PATH)/util/GestionErreur.class \
+ $(BIN)/$(PKG_PATH)/GestionErreur.class \
$(BIN)/$(PKG_PATH)/mpif/PIFReader.class \
$(SRC)/$(PKG_PATH)/ViewerControleur.java
$(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/ViewerControleur.java
-# Exécution
-run-conv: $(BIN)/$(PKG_PATH)/Convertisseur.class
+
+# Exécution sans JAR
+runnotjar-conv: $(BIN)/$(PKG_PATH)/Convertisseur.class
$(JAVA) -cp $(BIN) $(MAIN_CONVERTER) $(ARGS)
-run-view: $(BIN)/$(PKG_PATH)/Viewer.class
+runnotjar-view: $(BIN)/$(PKG_PATH)/Viewer.class
$(JAVA) -cp $(BIN) $(MAIN_VIEWER) $(ARGS)
+# Création des JAR
+jar-conv: $(BIN)/$(PKG_PATH)/Convertisseur.class
+ jar cfe convertisseur.jar $(MAIN_CONVERTER) -C $(BIN) .
+
+jar-view: $(BIN)/$(PKG_PATH)/Viewer.class
+ jar cfe viewer.jar $(MAIN_VIEWER) -C $(BIN) .
+
+jar: jar-conv jar-view
+
+# Exécution des JAR
+run-conv: jar-conv
+ $(JAVA) -jar convertisseur.jar $(ARGS)
+
+run-view: jar-view
+ $(JAVA) -jar viewer.jar $(ARGS)
+
# Documentation
doc: $(DOC)
- $(JAVADOC) -d $(DOC) $(SRC)/fr/iutfbleau/sae/**/*.java
+ @echo "Generation de la documentation en cours..."
+ @$(JAVADOC) -Xdoclint:none -encoding UTF-8 -d $(DOC) -sourcepath $(SRC) -subpackages fr.iutfbleau.sae > /dev/null 2>&1
+ @echo "Termine ! Documentation disponible : $(DOC)/index.html"
+
# Nettoyage
clean:
- rm -rf $(BIN) $(DOC)
+ rm -rf $(BIN) $(DOC) *.jar
diff --git a/src/fr/iutfbleau/sae/CodeTablePanel.java b/src/fr/iutfbleau/sae/CodeTablePanel.java
index 1adcf21..1b17111 100644
--- a/src/fr/iutfbleau/sae/CodeTablePanel.java
+++ b/src/fr/iutfbleau/sae/CodeTablePanel.java
@@ -7,7 +7,6 @@ import javax.swing.*;
/**
* 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 {
diff --git a/src/fr/iutfbleau/sae/ConverterController.java b/src/fr/iutfbleau/sae/ConverterController.java
index b0b0aa2..46b9aa8 100644
--- a/src/fr/iutfbleau/sae/ConverterController.java
+++ b/src/fr/iutfbleau/sae/ConverterController.java
@@ -3,7 +3,7 @@ import fr.iutfbleau.sae.mhuffman.*;
import fr.iutfbleau.sae.mpif.PIFWriter;
import fr.iutfbleau.sae.mpif.Pixel;
import fr.iutfbleau.sae.mpif.RGBImage;
-import fr.iutfbleau.sae.util.GestionErreur;
+
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
@@ -12,77 +12,105 @@ import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
/**
- * Contrôleur pour la conversion d'images.
- *
- * Cette classe gère le chargement des fichiers image et les opérations
- * de conversion associées. tel que
- *
- *
+ * Controleur pour la conversion d'images au format PIF.
+ * Gere le chargement des images, le calcul des frequences,
+ * la generation des codes de Huffman et la sauvegarde au format PIF.
*/
public class ConverterController {
- // Image convertie en RGBImage
+
+ /** Image convertie en RGBImage */
private RGBImage image;
- // Table de fréquences pour chaque composante
+ /** Table de frequences pour chaque composante */
private FrequencyTable frequencyTable;
- // Arbres de Huffman pour chaque composante
+ /** Codes de Huffman pour la composante rouge */
private Map abrHuffmanR;
+
+ /** Codes de Huffman pour la composante verte */
private Map abrHuffmanG;
+
+ /** Codes de Huffman pour la composante bleue */
private Map abrHuffmanB;
- // Codes canoniques pour chaque composante
+ /** Codes canoniques pour la composante rouge */
private Map canonRED;
+
+ /** Codes canoniques pour la composante verte */
private Map canonGREEN;
+
+ /** Codes canoniques pour la composante bleue */
private Map canonBLUE;
- // La fenêtre du convertisseur
+ /** La fenetre du convertisseur */
private ConverterWindow fen;
+ /** Chemin du fichier de sortie */
String outputPath;
+
+ /** Chemin du fichier d'entree */
String inputPath;
+ /**
+ * Construit un nouveau controleur de conversion.
+ *
+ * @param fen la fenetre de l'interface graphique
+ * @param in le chemin du fichier d'entree (peut etre null)
+ * @param out le chemin du fichier de sortie (peut etre null)
+ */
public ConverterController(ConverterWindow fen, String in, String out) {
this.fen = fen;
this.outputPath = out;
this.inputPath = in;
}
-
- // charger une image depuis un fichier avec bufferedImage et la convertir en RGBImage
+ /**
+ * Charge une image depuis un fichier et la convertit en RGBImage.
+ * Extrait les composantes RGB de chaque pixel et met a jour l'interface.
+ *
+ * @param file le fichier image a charger
+ */
public void loadImage(File file) {
- try{
+ try {
// Lire l'image avec BufferedImage
- BufferedImage buffimage = ImageIO.read(file);
+ BufferedImage buffimage = ImageIO.read(file);
if (buffimage == null) {
- throw new IllegalArgumentException("Le fichier spécifié n'est pas une image valide.");
+ throw new IllegalArgumentException("Le fichier specifie n'est pas une image valide.");
}
int w = buffimage.getWidth();
int h = buffimage.getHeight();
- // Créer une RGBImage de la même taille
+ // Creer une RGBImage de la meme taille
this.image = new RGBImage(w, h);
- // remplir la RGBImage avec les pixels de BufferedImage
+
+ // Remplir la RGBImage avec les pixels de BufferedImage
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
- int rgb = buffimage.getRGB(x, y); // obtenir la valeur RGB du pixel
+ int rgb = buffimage.getRGB(x, y);
+
// Extraire les composantes R, G, B
int r = (rgb >> 16) & 0xFF;
int g = (rgb >> 8) & 0xFF;
int b = rgb & 0xFF;
- // Créer un pixel et l'ajouter à la RGBImage
+
+ // Creer un pixel et l'ajouter a la RGBImage
this.image.setPixel(x, y, new Pixel(r, g, b));
}
}
- // Mettre à jour le GUI
+
+ // Mettre a jour le GUI
this.fen.setImagePreview(buffimage);
+
} catch (IOException e) {
GestionErreur.afficherErreur("Erreur lors du chargement : " + e.getMessage());
}
}
-
+ /**
+ * Calcule les frequences d'apparition de chaque valeur RGB dans l'image.
+ * Met a jour l'interface avec les tables de frequences calculees.
+ */
public void computeFrequencies() {
this.frequencyTable = new FrequencyTable();
if (this.image == null) {
@@ -90,42 +118,59 @@ public class ConverterController {
}
this.frequencyTable.computeFromImage(this.image);
- // Mettre à jour le GUI avec les fréquences
+ // Mettre a jour le GUI avec les frequences
int[] freqR = this.frequencyTable.getRed();
int[] freqG = this.frequencyTable.getGreen();
int[] freqB = this.frequencyTable.getBlue();
this.fen.setFrequencyTable(freqR, freqG, freqB);
}
-
+ /**
+ * Genere les arbres de Huffman pour chaque composante RGB.
+ * Cree les codes binaires optimaux bases sur les frequences calculees.
+ * Met a jour l'interface avec les codes de Huffman generes.
+ */
public void computeHuffman() {
- // Génération des arbres de Huffman pour chaque composante et stockage des codes
+ // Generation des arbres de Huffman pour chaque composante
HuffmanTree arbreR = new HuffmanTree(this.frequencyTable.getRed());
this.abrHuffmanR = arbreR.generateCodes();
+
HuffmanTree arbreG = new HuffmanTree(this.frequencyTable.getGreen());
this.abrHuffmanG = arbreG.generateCodes();
+
HuffmanTree arbreB = new HuffmanTree(this.frequencyTable.getBlue());
this.abrHuffmanB = arbreB.generateCodes();
- // Mettre à jour le GUI avec les codes de Huffman
+ // Mettre a jour le GUI avec les codes de Huffman
this.fen.setHuffmanTable(this.abrHuffmanR, this.abrHuffmanG, this.abrHuffmanB);
}
- public void computeCanonical(){
+ /**
+ * Genere les codes canoniques a partir des codes de Huffman.
+ * Les codes canoniques sont une forme normalisee des codes de Huffman
+ * qui facilite le stockage et le decodage.
+ * Met a jour l'interface avec les codes canoniques generes.
+ */
+ public void computeCanonical() {
CanonicalCode codeCanoniques = new CanonicalCode();
this.canonRED = codeCanoniques.generateCodes(this.abrHuffmanR);
this.canonGREEN = codeCanoniques.generateCodes(this.abrHuffmanG);
this.canonBLUE = codeCanoniques.generateCodes(this.abrHuffmanB);
- // Mettre à jour le GUI avec les codes canoniques
+ // Mettre a jour le GUI avec les codes canoniques
this.fen.setCanonicalTable(this.canonRED, this.canonGREEN, this.canonBLUE);
-
}
-
+ /**
+ * Sauvegarde l'image au format PIF.
+ * Verifie que l'image et les codes canoniques sont disponibles avant
+ * d'effectuer la sauvegarde.
+ *
+ * @param pathfile le chemin du fichier de sortie
+ */
public void saveAsPIF(String pathfile) {
- // je vérifie que l'image et les codes canoniques sont disponibles
- if(this.image == null || this.canonRED == null){
+ // Verifier que l'image et les codes canoniques sont disponibles
+ if (this.image == null || this.canonRED == null) {
GestionErreur.afficherErreur("Impossible de sauvegarder : image ou codes canoniques manquants.");
return;
}
@@ -134,42 +179,47 @@ public class ConverterController {
PIFWriter ecriveur = new PIFWriter();
ecriveur.writeTOFile(pathfile, this.image, this.canonRED, this.canonGREEN, this.canonBLUE);
} catch (Exception e) {
- GestionErreur.afficherErreur("Erreur lors de l’écriture du fichier .pif : ");
+ GestionErreur.afficherErreur("Erreur lors de l'ecriture du fichier .pif : ");
}
}
+ /**
+ * Gere la sauvegarde via le bouton de l'interface.
+ * Si un chemin de sortie est defini, sauvegarde directement.
+ * Sinon, ouvre un selecteur de fichier pour que l'utilisateur choisisse
+ * l'emplacement de sauvegarde.
+ * La sauvegarde est effectuee dans un thread separe pour ne pas bloquer
+ * l'interface graphique.
+ */
public void saveViaBtn() {
- try {
- if (outputPath != null) {
- saveAsPIF(outputPath);
- GestionErreur.afficherInfo("Fichier sauvegardé avec succès. Chemin : " + outputPath);
- return;
- }
+ if (outputPath != null) {
+ saveAsPIF(outputPath);
+ GestionErreur.afficherInfo("Fichier sauvegarde avec succes. Chemin : " + outputPath);
+ return;
+ }
- // Sinon JFileChooser
- JFileChooser chooser = new JFileChooser();
- chooser.setDialogTitle("Enregistrer le fichier .pif");
+ // Sinon JFileChooser
+ JFileChooser chooser = new JFileChooser();
+ chooser.setDialogTitle("Enregistrer le fichier .pif");
- if (chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
- //saveAsPIF(chooser.getSelectedFile().getAbsolutePath());
- // On lance la sauvegarde lourde dans un thread séparé
- new Thread(() -> {
- try {
- saveAsPIF(chooser.getSelectedFile().getAbsolutePath());
- GestionErreur.afficherInfo("Fichier sauvegardé avec succès : " + chooser.getSelectedFile().getName());
- } catch (Exception e) {
- GestionErreur.afficherErreur("Erreur lors de la sauvegarde : " + e.getMessage());
- }
- }).start();
- }
-
- } catch (Exception e) {
- GestionErreur.afficherErreur("Erreur lors de la sauvegarde : ");
+ if (chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
+ File fichierSelectionne = chooser.getSelectedFile();
+ ThreadSauvegardePIF thread = new ThreadSauvegardePIF(this, fichierSelectionne);
+ thread.start();
}
}
- public void convessionProcess(){
- // chragement
+ /**
+ * Lance le processus complet de conversion d'une image au format PIF.
+ * Etapes :
+ * 1. Chargement de l'image (depuis un fichier ou via selecteur)
+ * 2. Calcul des frequences
+ * 3. Generation des codes de Huffman
+ * 4. Generation des codes canoniques
+ * 5. Sauvegarde (automatique ou via bouton selon les parametres)
+ */
+ public void conversionProcess() {
+ // Chargement
if (this.inputPath != null) {
// Chargement direct depuis les arguments
File file = new File(inputPath);
@@ -179,38 +229,40 @@ public class ConverterController {
return;
}
this.loadImage(file);
- }else{
+ } else {
// Sinon JFileChooser pour choisir l'image
- JFileChooser choosser =new JFileChooser();
- choosser.setDialogTitle("Choisissez une image");
- if (choosser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
- this.loadImage(choosser.getSelectedFile());
- }else {
- GestionErreur.afficherErreur("Aucune image choisie. Arrêt du programme.");
+ JFileChooser chooser = new JFileChooser();
+ chooser.setDialogTitle("Choisissez une image");
+ if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
+ this.loadImage(chooser.getSelectedFile());
+ } else {
+ GestionErreur.afficherErreur("Aucune image choisie. Arret du programme.");
System.exit(1);
return;
}
}
- // je place la logique de conversion dans lordre
+ // Placer la logique de conversion dans l'ordre
computeFrequencies();
computeHuffman();
computeCanonical();
- // Sauvegarder: un second argument est donné sauvegarde automatique
+ // Sauvegarder : si un second argument est donne, sauvegarde automatique
if (this.outputPath != null) {
this.saveAsPIF(this.outputPath);
- GestionErreur.afficherInfo("Fichier sauvegardé automatiquement : " + this.outputPath);
- }else{
- // pas de deuxième argument j'ajoute un boutton pour choisir avec un jfilechoser
+ GestionErreur.afficherInfo("Fichier sauvegarde automatiquement : " + this.outputPath);
+ } else {
+ // Pas de deuxieme argument : ajouter un bouton pour choisir avec un JFileChooser
fen.addSaveButton(this);
}
}
-
-
-
- public RGBImage getImage(){
+ /**
+ * Retourne l'image actuellement chargee.
+ *
+ * @return l'image RGB chargee, ou null si aucune image n'est chargee
+ */
+ public RGBImage getImage() {
return this.image;
}
-}
+}
\ No newline at end of file
diff --git a/src/fr/iutfbleau/sae/ConverterWindow.java b/src/fr/iutfbleau/sae/ConverterWindow.java
index f41aa1a..96e535c 100644
--- a/src/fr/iutfbleau/sae/ConverterWindow.java
+++ b/src/fr/iutfbleau/sae/ConverterWindow.java
@@ -1,4 +1,5 @@
package fr.iutfbleau.sae;
+
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Map;
@@ -6,17 +7,9 @@ import javax.swing.*;
/**
* Fenêtre principale du convertisseur.
- *
- *
- * 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
- *
+ * Cette classe affiche l'image chargée, les tables de fréquences,
+ * les codes Huffman et les codes canoniques.
+ * C'est la partie "Vue" de l'application.
*/
public class ConverterWindow extends JFrame {
@@ -24,136 +17,105 @@ public class ConverterWindow extends JFrame {
private FrequencyTablePanel frequencyTablePanel;
private CodeTablePanel codeTablePanel;
-
-
/**
- * Crée la fenêtre principale du convertisseur.
- *
- *
- * Le constructeur initialise la fenêtre et met en place
- * les différents panneaux graphiques utilisés pour l’affichage.
- *
+ * Constructeur de la fenêtre du convertisseur.
+ * Initialise la fenêtre et installe tous les panneaux graphiques.
*/
-
public ConverterWindow() {
- // Configuration de la fenetre
- this.setTitle("Convertisseur PIF - Visualisation des données");
- this.setSize(900, 600);
- this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- this.setLocationRelativeTo(null); // Centre la fenêtre
- this.setResizable(true); // on autorise le
- this.setLayout(new BorderLayout());
-
+ setTitle("Convertisseur PIF - Visualisation des données");
+ setSize(900, 600);
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ setLocationRelativeTo(null);
+ setResizable(true);
+ setLayout(new BorderLayout());
- // Initialisation des panels
- this.imagePreviewPanel = new ImagePreviewPanel();
- this.frequencyTablePanel = new FrequencyTablePanel();
- this.codeTablePanel = new CodeTablePanel();
+ // Création des panneaux d'affichage
+ imagePreviewPanel = new ImagePreviewPanel();
+ frequencyTablePanel = new FrequencyTablePanel();
+ 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
+ // Panneau principal avec un scroll
+ JPanel contentPanel = new JPanel(new BorderLayout());
contentPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
- // 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);
+ header.setHorizontalAlignment(SwingConstants.CENTER);
- contentPanel.add(Box.createRigidArea(new Dimension(0, 5))); // espace
+ contentPanel.add(header, BorderLayout.NORTH);
+ contentPanel.add(imagePreviewPanel, BorderLayout.CENTER);
+
+ // Les tables en bas
+ JPanel tablesPanel = new JPanel();
+ tablesPanel.setLayout(new BoxLayout(tablesPanel, BoxLayout.Y_AXIS));
+ tablesPanel.add(frequencyTablePanel);
+ tablesPanel.add(Box.createRigidArea(new Dimension(0, 5)));
+ tablesPanel.add(codeTablePanel);
+
+ contentPanel.add(tablesPanel, BorderLayout.SOUTH);
- // Ajout du panel d'aperçu
- contentPanel.add(imagePreviewPanel);
- contentPanel.add(Box.createRigidArea(new Dimension(0, 5)));
- // Ajout du panel des fréquences
- contentPanel.add(frequencyTablePanel);
- contentPanel.add(Box.createRigidArea(new Dimension(0, 5)));
- // Ajout panel des codes
- contentPanel.add(codeTablePanel);
- contentPanel.add(Box.createRigidArea(new Dimension(0, 5)));
- // 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
+ scrollPane.getVerticalScrollBar().setUnitIncrement(16);
- this.add(scrollPane, BorderLayout.CENTER);
+ add(scrollPane, BorderLayout.CENTER);
+
+ // Fenêtre visible immédiatement
+ setVisible(true);
}
-
-
/**
- * 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
+ * Affiche l'image chargée dans le panneau d'aperçu.
+ * @param img l'image à afficher
*/
public void setImagePreview(BufferedImage img) {
imagePreviewPanel.setImage(img);
}
/**
- * Met à jour l’affichage des tables de fréquences.
+ * Met à jour l'affichage des fréquences des trois composantes.
*/
- public void setFrequencyTable(int[] freqR,int[] freqG,int[] freqB) {
- frequencyTablePanel.updateFrequencies(freqR,freqG,freqB);
+ public void setFrequencyTable(int[] freqR, int[] freqG, int[] freqB) {
+ frequencyTablePanel.updateFrequencies(freqR, freqG, freqB);
}
/**
- * Met à jour l’affichage des codes Huffman.
- *
- *
- * Elle permet uniquement d’afficher les codes
- * qui ont été produits par la partie traitement.
- *
+ * Met à jour l'affichage des codes Huffman.
*/
- public void setHuffmanTable(Map codesRouge,
- Map codesVert,
- Map codesBleu) {
- codeTablePanel.updateCodes(codesRouge, codesVert, codesBleu);
+ public void setHuffmanTable(Map r,
+ Map g,
+ Map b) {
+ codeTablePanel.updateCodes(r, g, b);
}
/**
- * Met à jour l’affichage des codes canoniques.
- *
- *
- * Les codes canoniques sont transmis au panneau
- * chargé de leur affichage.
- *
+ * Met à jour l'affichage des codes canoniques.
*/
- public void setCanonicalTable(Map codesRouge,
- Map codesVert,
- Map codesBleu) {
- codeTablePanel.updateCanonicalCodes(codesRouge, codesVert, codesBleu);
-
- this.setVisible(true); // je limage visible apre avoir tout ajouter
+ public void setCanonicalTable(Map r,
+ Map g,
+ Map b) {
+ codeTablePanel.updateCanonicalCodes(r, g, b);
}
+ /**
+ * Ajoute un bouton permettant d'exporter l'image en .pif.
+ * Le contrôleur est envoyé au listener responsable de la sauvegarde.
+ */
public void addSaveButton(ConverterController controller) {
- JButton saveBtn = new JButton("Exporter en .pif");
- ExportButtonListener ecouteur =new ExportButtonListener(controller);
- saveBtn.addActionListener(ecouteur);
- // panneau du bas
- JPanel bottomPanel = new JPanel();
- bottomPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
- bottomPanel.add(saveBtn);
-
- // ajoute au bas de la fenêtre
- this.add(bottomPanel, BorderLayout.SOUTH);
-
- // rafraîchir l'affichage
- this.revalidate();
- this.repaint();
-}
+ JButton saveBtn = new JButton("Exporter en .pif");
+ ExportButtonListener listener = new ExportButtonListener(controller);
+ saveBtn.addActionListener(listener);
+ JPanel bottomPanel = new JPanel();
+ bottomPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
+ bottomPanel.add(saveBtn);
+ add(bottomPanel, BorderLayout.SOUTH);
+
+ revalidate();
+ repaint();
+ }
}
diff --git a/src/fr/iutfbleau/sae/Convertisseur.java b/src/fr/iutfbleau/sae/Convertisseur.java
index 9d2afbf..8152b1b 100644
--- a/src/fr/iutfbleau/sae/Convertisseur.java
+++ b/src/fr/iutfbleau/sae/Convertisseur.java
@@ -1,24 +1,43 @@
package fr.iutfbleau.sae;
+/**
+ * Point d'entree principal du programme de conversion d'images au format PIF.
+ * Lance l'interface graphique et initialise le processus de conversion.
+ */
public class Convertisseur {
+
+ /**
+ * Methode principale qui demarre l'application de conversion.
+ *
+ * Arguments acceptes :
+ * - args[0] : chemin du fichier image d'entree (optionnel)
+ * - args[1] : chemin du fichier PIF de sortie (optionnel)
+ *
+ * Si aucun argument n'est fourni, l'utilisateur pourra choisir
+ * les fichiers via l'interface graphique.
+ *
+ * @param args les arguments de la ligne de commande
+ */
public static void main(String[] args) {
- // chemins de l'image
- String inpuPath = null;
- String outputPath = null;
+ // Chemins de l'image
+ String inputPath = null;
+ String outputPath = null;
+
if (args.length >= 1) {
- inpuPath = args[0];
+ inputPath = args[0];
}
if (args.length >= 2) {
outputPath = args[1];
}
- // Créer et stocker la référence à la fenêtre
+ // Creer et stocker la reference a la fenetre
ConverterWindow window = new ConverterWindow();
- // je la passe au controleur
- ConverterController controller = new ConverterController(window, inpuPath, outputPath);
+
+ // Passer la fenetre au controleur
+ ConverterController controller = new ConverterController(window, inputPath, outputPath);
- // je demare le programe de conversion
- controller.convessionProcess();
+ // Demarrer le programme de conversion
+ controller.conversionProcess(); // ✅ Correction : conversionProcess (pas convessionProcess)
}
}
\ No newline at end of file
diff --git a/src/fr/iutfbleau/sae/ExportButtonListener.java b/src/fr/iutfbleau/sae/ExportButtonListener.java
index ebb3223..c04144a 100644
--- a/src/fr/iutfbleau/sae/ExportButtonListener.java
+++ b/src/fr/iutfbleau/sae/ExportButtonListener.java
@@ -1,17 +1,16 @@
package fr.iutfbleau.sae;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
-import javax.swing.SwingUtilities;
public class ExportButtonListener implements ActionListener {
- private PIFSaveTask saveTask;
+ private ConverterController controller;
public ExportButtonListener(ConverterController controller){
- this.saveTask = new PIFSaveTask(controller);
+ this.controller = controller;
}
@Override
public void actionPerformed(ActionEvent e){
- SwingUtilities.invokeLater(saveTask);
+ this.controller.saveViaBtn();
}
}
diff --git a/src/fr/iutfbleau/sae/FrequencyTablePanel.java b/src/fr/iutfbleau/sae/FrequencyTablePanel.java
index 031ae79..4e8f29f 100644
--- a/src/fr/iutfbleau/sae/FrequencyTablePanel.java
+++ b/src/fr/iutfbleau/sae/FrequencyTablePanel.java
@@ -3,68 +3,89 @@ package fr.iutfbleau.sae;
import java.awt.*;
import javax.swing.*;
-
+/**
+ *
+ * Panneau qui affiche les fréquences des composantes rouge, verte et bleue.
+ * Chaque composante est affichée dans une zone de texte non modifiable.
+ */
public class FrequencyTablePanel extends JPanel {
- // 3 Zone de texte pour la fréquence du rouge , du vert et du bleu
- private JTextArea freqRouge , freqVert , freqBleu;
+ /** Zone d'affichage pour les fréquences du rouge. */
+ private JTextArea freqRouge;
+
+ /** Zone d'affichage pour les fréquences du vert. */
+ private JTextArea freqVert;
+
+ /** Zone d'affichage pour les fréquences du bleu. */
+ private JTextArea freqBleu;
+
+ /**
+ * Constructeur du panneau.
+ * Initialise l'affichage avec trois zones de texte (R, G, B).
+ */
public FrequencyTablePanel() {
- setLayout(new BoxLayout(this , BoxLayout.Y_AXIS));
+
+ setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
- // Premiere étiquette pour les fréquences en géneral
- JLabel etiquette1 = new JLabel("Frequence");
+ JLabel etiquette1 = new JLabel("Fréquences");
etiquette1.setFont(new Font("SansSerif", Font.BOLD, 16));
- super.add(etiquette1);
- super.add(Box.createVerticalStrut(10));
-
-
- // Puis création de zone de texte pour le rouge , le vert et le bleu
- this.freqRouge = creationZoneText("Rouge");
- this.freqVert = creationZoneText("Vert");
- this.freqBleu = creationZoneText("Bleu");
-
-
-
+ add(etiquette1);
+ add(Box.createVerticalStrut(10));
+ freqRouge = creationZoneText("Rouge");
+ freqVert = creationZoneText("Vert");
+ freqBleu = creationZoneText("Bleu");
}
- private JTextArea creationZoneText(String t) {
- super.add(new JLabel(t + ":"));
- GridLayout gestionnaire_mise_en_page = new GridLayout(5,5,10,10);
+ /**
+ * Crée une zone de texte avec un label et un scroll.
+ * Cette méthode est utilisée trois fois : rouge, vert et bleu.
+ */
+ private JTextArea creationZoneText(String titre) {
+ add(new JLabel(titre + " :"));
+
JTextArea zone = new JTextArea(8, 30);
- zone.setLayout(gestionnaire_mise_en_page);
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;
}
-
- public void updateFrequencies(int[] freqR,int[] freqG,int[] freqB) {
- mettreAJour(freqRouge,freqR);
- mettreAJour(freqVert,freqG);
- mettreAJour(freqBleu,freqB);
-
+ /**
+ * Met à jour les trois zones d'affichage avec les nouvelles valeurs.
+ *
+ * @param freqR tableau des fréquences du rouge
+ * @param freqG tableau des fréquences du vert
+ * @param freqB tableau des fréquences du bleu
+ */
+ public void updateFrequencies(int[] freqR, int[] freqG, int[] freqB) {
+ mettreAJour(freqRouge, freqR);
+ mettreAJour(freqVert, freqG);
+ mettreAJour(freqBleu, freqB);
}
+ /**
+ * Remplit une zone de texte avec le contenu d'un tableau de fréquences.
+ */
+ private void mettreAJour(JTextArea zone, int[] frequence) {
- public void mettreAJour(JTextArea zone,int[] frequence){
- StringBuilder string = new StringBuilder();
+ StringBuilder sb = new StringBuilder();
- for(int i = 0 ; i < frequence.length ; i++){
- string.append(String.format("%3d : %s%n", i, frequence[i]));
+ for (int i = 0; i < frequence.length; i++) {
+ sb.append(String.format("%3d : %d%n", i, frequence[i]));
- if(i%10 == 0 && i!=0){
- string.append("\n");
+ if ((i + 1) % 10 == 0) { // retour à la ligne toutes les 10 valeurs
+ sb.append("\n");
+ }
}
- }
-
-
- zone.setText(string.toString());
+ zone.setText(sb.toString());
}
}
diff --git a/src/fr/iutfbleau/sae/util/GestionErreur.java b/src/fr/iutfbleau/sae/GestionErreur.java
similarity index 92%
rename from src/fr/iutfbleau/sae/util/GestionErreur.java
rename to src/fr/iutfbleau/sae/GestionErreur.java
index 391a6cc..6937e66 100644
--- a/src/fr/iutfbleau/sae/util/GestionErreur.java
+++ b/src/fr/iutfbleau/sae/GestionErreur.java
@@ -1,4 +1,4 @@
-package fr.iutfbleau.sae.util;
+package fr.iutfbleau.sae;
import javax.swing.*;
public class GestionErreur {
diff --git a/src/fr/iutfbleau/sae/ImagePreviewPanel.java b/src/fr/iutfbleau/sae/ImagePreviewPanel.java
index 11c4ae4..c6add1c 100644
--- a/src/fr/iutfbleau/sae/ImagePreviewPanel.java
+++ b/src/fr/iutfbleau/sae/ImagePreviewPanel.java
@@ -1,76 +1,109 @@
package fr.iutfbleau.sae;
-
+
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
- /**
- * Le panneau d’aperçu de l’image.
+
+/**
+ * Panneau d'aperçu de l'image.
*
- *
- * Ce panneau affiche un aperçu de l’image en cours de conversion.
- *
+ * Ce panneau est utilisé pour afficher l'image chargée dans le convertisseur.
+ * Si l'image est trop grande, elle est automatiquement réduite.
+ * Si elle est plus petite que l'espace disponible, elle est centrée.
*/
-
-
public class ImagePreviewPanel extends JPanel {
+ /** Image affichée dans le panneau */
private BufferedImage image;
- // je donne une taille préférée au panel
+ /** Taille maximale pour l'affichage */
+ private static final int MAX_WIDTH = 800;
+ private static final int MAX_HEIGHT = 600;
+
+ /**
+ * Constructeur du panneau d'aperçu.
+ */
public ImagePreviewPanel() {
- this.setPreferredSize(new Dimension(600, 800));
- this.setMinimumSize(new Dimension(600, 800));
+ setPreferredSize(new Dimension(MAX_WIDTH, MAX_HEIGHT));
}
-
+ /**
+ * Met à jour l'image à afficher et demande le rafraîchissement du panneau.
+ *
+ * @param img l'image à afficher
+ */
public void setImage(BufferedImage img) {
this.image = img;
- repaint();
+ // Recalculer la taille préférée selon l'image
+ if (image != null) {
+ int imgWidth = image.getWidth();
+ int imgHeight = image.getHeight();
+
+ // Calculer la taille d'affichage
+ double scale = Math.min(
+ (double) MAX_WIDTH / imgWidth,
+ (double) MAX_HEIGHT / imgHeight
+ );
+
+ if (scale > 1.0) {
+ scale = 1.0;
+ }
+
+ int prefWidth = Math.max((int) (imgWidth * scale), MAX_WIDTH);
+ int prefHeight = Math.max((int) (imgHeight * scale), MAX_HEIGHT);
+
+ setPreferredSize(new Dimension(prefWidth, prefHeight));
+ }
+
+ revalidate();
+ repaint();
}
+ /**
+ * Affiche l'image dans le panneau.
+ * L'image est centrée et éventuellement réduite si elle dépasse la taille du panneau.
+ */
@Override
protected void paintComponent(Graphics pinceau) {
- // Appel de la méthode parente pour effacer l'arrière-plan
super.paintComponent(pinceau);
if (image == null) {
return;
}
- // Recuperer les dimensions du panel pour centrer l'image
- int panelWidth = this.getWidth();
- int panelHeight = this.getHeight();
+ int panelWidth = getWidth();
+ int panelHeight = getHeight();
- // Recuperer les dimensions de l'image
int imgWidth = image.getWidth();
int imgHeight = image.getHeight();
- // Je calcule le facteur du reduction (si l'image est trop grande) en gros le dezoom
double scale = Math.min(
(double) panelWidth / imgWidth,
(double) panelHeight / imgHeight
);
- // Si l'image est plus petite que le panel, on ne la redimensionne pas donc scale = 1
if (scale > 1.0) {
scale = 1.0;
}
- // je recalcule les dimensions de l'image à dessiner
int drawWidth = (int) (imgWidth * scale);
int drawHeight = (int) (imgHeight * scale);
-
- // Centrage de l'image dans le panel
+
int x = (panelWidth - drawWidth) / 2;
int y = (panelHeight - drawHeight) / 2;
+ // Amélioration de la qualité du redimensionnement
Graphics2D pinceau2D = (Graphics2D) pinceau;
pinceau2D.setRenderingHint(
RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR
);
+ pinceau2D.setRenderingHint(
+ RenderingHints.KEY_RENDERING,
+ RenderingHints.VALUE_RENDER_QUALITY // Je privilege la qualite au lieu de la vitesse
+ );
pinceau2D.drawImage(image, x, y, drawWidth, drawHeight, this);
}
-}
\ No newline at end of file
+}
diff --git a/src/fr/iutfbleau/sae/PIFSaveTask.java b/src/fr/iutfbleau/sae/PIFSaveTask.java
deleted file mode 100644
index ad8cd2b..0000000
--- a/src/fr/iutfbleau/sae/PIFSaveTask.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package fr.iutfbleau.sae;
-public class PIFSaveTask implements Runnable{
- private ConverterController controller;
-
- public PIFSaveTask(ConverterController c) {
- this.controller = c;
- }
-
- @Override
- public void run() {
- controller.saveViaBtn();
- }
-}
diff --git a/src/fr/iutfbleau/sae/ThreadSauvegardePIF.java b/src/fr/iutfbleau/sae/ThreadSauvegardePIF.java
new file mode 100644
index 0000000..c852009
--- /dev/null
+++ b/src/fr/iutfbleau/sae/ThreadSauvegardePIF.java
@@ -0,0 +1,37 @@
+package fr.iutfbleau.sae;
+
+import java.io.File;
+
+/**
+ * Thread pour sauvegarder un fichier PIF en arriere-plan.
+ * Permet d'eviter de bloquer l'interface graphique pendant la sauvegarde.
+ */
+public class ThreadSauvegardePIF extends Thread {
+
+ private final ConverterController controleur;
+ private final File fichier;
+
+ /**
+ * Construit un nouveau thread de sauvegarde.
+ *
+ * @param controleur le controleur qui gere la sauvegarde
+ * @param fichier le fichier dans lequel sauvegarder
+ */
+ public ThreadSauvegardePIF(ConverterController controleur, File fichier) {
+ this.controleur = controleur;
+ this.fichier = fichier;
+ }
+
+ /**
+ * Execute la sauvegarde du fichier PIF.
+ */
+ @Override
+ public void run() {
+ try {
+ controleur.saveAsPIF(fichier.getAbsolutePath());
+ GestionErreur.afficherInfo("Fichier sauvegarde avec succes : " + fichier.getName());
+ } catch (Exception e) {
+ GestionErreur.afficherErreur("Erreur lors de la sauvegarde : " + e.getMessage());
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/fr/iutfbleau/sae/Viewer.java b/src/fr/iutfbleau/sae/Viewer.java
index 6b102e0..1367a75 100644
--- a/src/fr/iutfbleau/sae/Viewer.java
+++ b/src/fr/iutfbleau/sae/Viewer.java
@@ -1,7 +1,18 @@
-
package fr.iutfbleau.sae;
+/**
+ * Classe principale qui lance l'application de visualisation d'images PIF.
+ * Elle recupere le chemin de l'image en argument et demarre l'interface.
+ */
public class Viewer {
+
+ /**
+ * Point d'entree de l'application.
+ * Recupere le chemin du fichier image passe en argument si present,
+ * cree la fenetre et le controleur, puis charge l'image PIF.
+ *
+ * @param args tableau d'arguments, le premier element est le chemin de l'image (optionnel)
+ */
public static void main(String[] args) {
// chemins de l'image
String inpuPath = null;
@@ -12,9 +23,7 @@ public class Viewer {
ViewerWindow fen = new ViewerWindow();
ViewerControleur controleur = new ViewerControleur(fen,inpuPath);
-
controleur.loadPIF();
}
}
-
diff --git a/src/fr/iutfbleau/sae/ViewerControleur.java b/src/fr/iutfbleau/sae/ViewerControleur.java
index 7dd786c..984f3c6 100644
--- a/src/fr/iutfbleau/sae/ViewerControleur.java
+++ b/src/fr/iutfbleau/sae/ViewerControleur.java
@@ -3,17 +3,27 @@ package fr.iutfbleau.sae;
import fr.iutfbleau.sae.mpif.PIFReader;
import fr.iutfbleau.sae.mpif.Pixel;
import fr.iutfbleau.sae.mpif.RGBImage;
-import fr.iutfbleau.sae.util.GestionErreur;
+
import java.awt.image.BufferedImage;
import java.io.File;
import javax.swing.JFileChooser;
+/**
+ * Controleur du visualiseur d'images PIF.
+ * Gere le chargement du fichier PIF et la conversion en image affichable.
+ */
public class ViewerControleur {
- private RGBImage image; // L'image à décoder
- private ViewerWindow window; // La fenêtre du visualiseur
+ private RGBImage image; // L'image a decoder
+ private ViewerWindow window; // La fenetre du visualiseur
private File file;
-
+
+ /**
+ * Constructeur du controleur.
+ *
+ * @param window la fenetre du visualiseur
+ * @param path le chemin du fichier PIF ou null si aucun
+ */
public ViewerControleur(ViewerWindow window, String path) {
this.window = window;
if (path != null) {
@@ -22,18 +32,23 @@ public class ViewerControleur {
this.file = null;
}
}
-
+
+ /**
+ * Charge et affiche un fichier PIF.
+ * Si aucun fichier n'est fourni, ouvre un selecteur de fichier.
+ * Verifie que le fichier est au format PIF puis le decode et l'affiche.
+ */
public void loadPIF() {
File fichierPIF;
- // Déterminer si on le charge avec jFilechoose ou pas
+ // Determiner si on le charge avec jFilechoose ou pas
if (this.file != null) {
// Fichier fourni en argument
fichierPIF = this.file;
} else {
- // Demander à l'utilisateur via JFileChooser
+ // Demander a l'utilisateur via JFileChooser
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("Choisissez un fichier PIF");
-
+
if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
fichierPIF = chooser.getSelectedFile();
} else {
@@ -42,57 +57,55 @@ public class ViewerControleur {
return;
}
}
-
-
- // je Vérifi la conformiter du fichier avec isPIFFile
+
+ // je Verifie la conformite du fichier avec isPIFFile
if (!PIFReader.isPIFFile(fichierPIF)) {
GestionErreur.afficherErreur("Le fichier fourni n'est pas au format PIF (.pif)");
return;
}
-
- // je Charge et décoder le fichier PIF
+
+ // je Charge et decode le fichier PIF
try {
PIFReader lecteur = new PIFReader();
this.image = lecteur.decodePifFile(fichierPIF);
-
- System.out.println("Image décodée : " + this.image.getWidth() + "x" + this.image.getHeight());
-
+
// je convertit RGBImage en BufferedImage
BufferedImage buffImg = convertToBufferedImage(this.image);
-
+
// j'affiche l'image
this.window.displayImage(buffImg);
-
+
} catch (Exception e) {
GestionErreur.afficherErreur("Erreur lors du chargement du fichier PIF : ");
}
}
-
+
/**
* Convertit une RGBImage en BufferedImage.
- *
- * @param rgbImage l'image à convertir
- * @return l'image convertie
+ * Parcourt tous les pixels et compose la couleur RGB sur 32 bits.
+ *
+ * @param rgbImage l'image a convertir
+ * @return l'image convertie en BufferedImage
*/
private BufferedImage convertToBufferedImage(RGBImage rgbImage) {
int width = rgbImage.getWidth();
int height = rgbImage.getHeight();
-
+
BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
-
+
// Copier tous les pixels
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
Pixel pixel = rgbImage.getPixel(x, y);
-
+
// Composer la couleur RGB la couleur est coder sur 32 bit argb chacun a 8 bit
int rgb = (pixel.getR() << 16) | (pixel.getG() << 8) | pixel.getB();
-
- // Définir le pixel dans le BufferedImage
+
+ // Definir le pixel dans le BufferedImage
buffImg.setRGB(x, y, rgb);
}
}
-
+
return buffImg;
}
-}
\ No newline at end of file
+}
diff --git a/src/fr/iutfbleau/sae/ViewerImagePanel.java b/src/fr/iutfbleau/sae/ViewerImagePanel.java
new file mode 100644
index 0000000..2fb6ffc
--- /dev/null
+++ b/src/fr/iutfbleau/sae/ViewerImagePanel.java
@@ -0,0 +1,130 @@
+package fr.iutfbleau.sae;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.image.BufferedImage;
+import javax.swing.*;
+
+/**
+ * Panneau personnalise pour afficher l'image.
+ * Utilise le double buffering pour un affichage fluide.
+ * Gere le deplacement de l'image avec la souris.
+ */
+public class ViewerImagePanel extends JPanel implements MouseListener, MouseMotionListener {
+
+ // l'image que j'affiche dans le panneau
+ private BufferedImage image;
+
+ // je stocke le decalage horizontal de l'image pour le deplacement
+ private int offsetX = 0;
+ // je stocke le decalage vertical de l'image pour le deplacement
+ private int offsetY = 0;
+
+ // je garde la derniere position X de la souris pour calculer le deplacement
+ private int lastX;
+ // je garde la derniere position Y de la souris pour calculer le deplacement
+ private int lastY;
+
+ /**
+ * Constructeur du panneau.
+ * Active le double buffering et ajoute les ecouteurs de souris.
+ */
+ public ViewerImagePanel() {
+ // j'active le double buffering pour eviter le clignotement
+ this.setDoubleBuffered(true);
+ // je mets un fond noir pour que ca soit plus joli
+ this.setBackground(Color.BLACK);
+ // j'ajoute les ecouteurs pour detecter les clics et les mouvements de souris
+ this.addMouseListener(this);
+ this.addMouseMotionListener(this);
+ }
+
+ /**
+ * Definit l'image a afficher et reinitialise le decalage.
+ *
+ * @param img l'image a afficher
+ */
+ public void setImage(BufferedImage img) {
+ this.image = img;
+ // je reinitialise le decalage quand je charge une nouvelle image
+ this.offsetX = 0;
+ this.offsetY = 0;
+ // je demande un reaffichage
+ repaint();
+ }
+
+ /**
+ * Methode de dessin du panneau.
+ * Dessine l'image avec le decalage actuel ou la centre si elle est plus petite.
+ *
+ * @param g le contexte graphique
+ */
+ @Override
+ protected void paintComponent(Graphics g) {
+ // j'appelle le paintComponent parent pour nettoyer le panneau
+ super.paintComponent(g);
+
+ // si j'ai pas d'image je fais rien
+ if (image == null) return;
+
+ // je recupere la taille actuelle du panneau
+ int panelW = getWidth();
+ int panelH = getHeight();
+
+ // je recupere la taille de l'image
+ int imgW = image.getWidth();
+ int imgH = image.getHeight();
+
+ // je pars du decalage actuel pour le dessin
+ int drawX = offsetX;
+ int drawY = offsetY;
+
+ // si l'image est plus petite que le panneau je la centre automatiquement
+ if (imgW < panelW) drawX = (panelW - imgW) / 2;
+ if (imgH < panelH) drawY = (panelH - imgH) / 2;
+
+ // je dessine l'image a la position calculee
+ g.drawImage(image, drawX, drawY, null);
+ }
+
+ /**
+ * Detecte quand l'utilisateur appuie sur le bouton de la souris.
+ * Je sauvegarde la position pour calculer le deplacement ensuite.
+ *
+ * @param e l'evenement souris
+ */
+ @Override
+ public void mousePressed(MouseEvent e) {
+ // je memorise la position de depart du clic
+ lastX = e.getX();
+ lastY = e.getY();
+ }
+
+ /**
+ * Detecte quand l'utilisateur fait glisser la souris.
+ * Je calcule le deplacement et je mets a jour l'affichage.
+ *
+ * @param e l'evenement souris
+ */
+ @Override
+ public void mouseDragged(MouseEvent e) {
+ // je calcule la difference entre la position actuelle et la derniere
+ // et j'ajoute ca au decalage de l'image
+ offsetX += e.getX() - lastX;
+ offsetY += e.getY() - lastY;
+
+ // je mets a jour la derniere position connue
+ lastX = e.getX();
+ lastY = e.getY();
+
+ // je redemande un affichage pour voir le deplacement
+ repaint();
+ }
+
+ // les methodes suivantes sont obligatoires mais j'en ai pas besoin
+ @Override public void mouseReleased(MouseEvent e) {}
+ @Override public void mouseClicked(MouseEvent e) {}
+ @Override public void mouseEntered(MouseEvent e) {}
+ @Override public void mouseExited(MouseEvent e) {}
+ @Override public void mouseMoved(MouseEvent e) {}
+}
diff --git a/src/fr/iutfbleau/sae/ViewerWindow.java b/src/fr/iutfbleau/sae/ViewerWindow.java
index 18709d0..8cf74b5 100644
--- a/src/fr/iutfbleau/sae/ViewerWindow.java
+++ b/src/fr/iutfbleau/sae/ViewerWindow.java
@@ -1,91 +1,57 @@
package fr.iutfbleau.sae;
import java.awt.*;
-import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
-public class ViewerWindow extends JFrame implements MouseListener, MouseMotionListener {
+/**
+ * Fenetre principale du visualiseur d'images PIF.
+ * Permet d'afficher une image et de la deplacer avec la souris.
+ */
+public class ViewerWindow extends JFrame {
- private BufferedImage image;
-
- private int offsetX = 0;
- private int offsetY = 0;
-
- private int lastX;
- private int lastY;
+ // le panneau qui affiche l'image avec double buffering
+ private final ViewerImagePanel imagePanel;
+ /**
+ * Constructeur de la fenetre.
+ * Initialise le titre, le comportement de fermeture et le panneau d'affichage.
+ */
public ViewerWindow() {
super("PIF Viewer");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(true);
- this.addMouseListener(this);
- this.addMouseMotionListener(this);
+
+ // je cree le panneau qui va afficher l'image
+ this.imagePanel = new ViewerImagePanel();
+ this.add(imagePanel);
}
-
+ /**
+ * Affiche une image dans la fenetre.
+ * Adapte la taille de la fenetre a l'image sans depasser 90% de l'ecran.
+ *
+ * @param img l'image a afficher
+ */
public void displayImage(BufferedImage img) {
- this.image = img;
+ // je passe l'image au panneau
+ this.imagePanel.setImage(img);
- // je prend la taille de l'ecran
+ // je recupere la taille de l'ecran pour adapter la fenetre
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
- // je prend una taille de 90% pour etre raisonable
+ // je limite a 90% de l'ecran pour rester raisonnable
int maxW = (int)(screen.width * 0.9);
int maxH = (int)(screen.height * 0.9);
+ // je prends le minimum entre la taille de l'image et la taille max
int w = Math.min(img.getWidth(), maxW);
int h = Math.min(img.getHeight(), maxH);
+ // j'applique la taille calculee a la fenetre
this.setSize(w, h);
+ // je centre la fenetre sur l'ecran
this.setLocationRelativeTo(null);
this.setVisible(true);
}
-
- @Override
- public void paint(Graphics g) {
-
- super.paint(g);
-
- if (image == null) return;
-
- int panelW = getWidth();
- int panelH = getHeight();
-
- int imgW = image.getWidth();
- int imgH = image.getHeight();
-
- int drawX = offsetX;
- int drawY = offsetY;
-
- // centrage automatique si image plus petite
- if (imgW < panelW) drawX = (panelW - imgW) / 2;
- if (imgH < panelH) drawY = (panelH - imgH) / 2;
-
- g.drawImage(image, drawX, drawY, null);
- }
-
-
- @Override
- public void mousePressed(MouseEvent e) {
- lastX = e.getX();
- lastY = e.getY();
- }
-
- @Override
- public void mouseDragged(MouseEvent e) {
- offsetX += e.getX() - lastX;
- offsetY += e.getY() - lastY;
-
- lastX = e.getX();
- lastY = e.getY();
-
- repaint();
- }
-
- @Override public void mouseReleased(MouseEvent e) {}
- @Override public void mouseClicked(MouseEvent e) {}
- @Override public void mouseEntered(MouseEvent e) {}
- @Override public void mouseExited(MouseEvent e) {}
- @Override public void mouseMoved(MouseEvent e) {}
}
diff --git a/src/fr/iutfbleau/sae/mhuffman/CanonicalCode.java b/src/fr/iutfbleau/sae/mhuffman/CanonicalCode.java
index 2bd235d..ad62fdb 100644
--- a/src/fr/iutfbleau/sae/mhuffman/CanonicalCode.java
+++ b/src/fr/iutfbleau/sae/mhuffman/CanonicalCode.java
@@ -1,55 +1,70 @@
package fr.iutfbleau.sae.mhuffman;
import java.util.*;
-public class CanonicalCode{
- //private Map codeLengths = new HashMap<>();
- //private Map canonicalCodes = new HashMap<>();
+/**
+ *
+ * Classe pour generer des codes canoniques de Huffman.
+ * Les codes canoniques sont des codes de Huffman reorganises
+ * pour faciliter la compression et le decodage.
+ */
+public class CanonicalCode {
+ /**
+ * Genere des codes canoniques a partir de codes de Huffman.
+ *
+ * @param codesHuffman les codes de Huffman initiaux
+ * @return les codes canoniques generes
+ */
+ public Map generateCodes(Map codesHuffman) {
+ // On recupere les entrees des codes Huffman pour pouvoir les trier
+ List> liste = new ArrayList<>(codesHuffman.entrySet());
-
- public Map generateCodes(Map codesHuffman){
- // 1 ere chose à faire : on regarde uniquement la longueur des codes initiaux(Huffman)
- // 2eme chose à faire : remettre dans l'ordre des longueurs : si meme taille ==> regarder valeur
- // 3eme chose à faire : ecriture des codes canoniques
-
- // on recupere les entrées des codes Huffman pour pouvoir les triés
- List> liste = new ArrayList<>(codesHuffman.entrySet());
-
- // ici on comparer par longueur de la valeur ou sinon par la clé
+ // On trie par longueur de la valeur ou sinon par la cle
Collections.sort(liste, new ComparateurCanonique());
- Map canonicalCodes = new HashMap<>();
- int code = 0; // code canonique à attribuer
- int temp = 0; //garde la longueur du code précedent , pour gérer le décalage
+
+ Map canonicalCodes = new HashMap<>();
+ int code = 0; // Code canonique a attribuer
+ int temp = 0; // Garde la longueur du code precedent, pour gerer le decalage
- for (Map.Entry entree : liste ) {
- int valeur = entree.getKey(); // symbole actuel
- int longueur = entree.getValue().length(); // longueur du code actuel
+ for (Map.Entry entree : liste) {
+ int valeur = entree.getKey(); // Symbole actuel
+ int longueur = entree.getValue().length(); // Longueur du code actuel
- code <<= (longueur - temp); // permet de décaler le code actuel si la longueur augmente
+ code <<= (longueur - temp); // Permet de decaler le code actuel si la longueur augmente
String codeBinaire = Integer.toBinaryString(code);
- // permet d'ajouter des zeros si nécessaire !!!
- while (codeBinaire.length() < longueur) {
- codeBinaire = "0" + codeBinaire;
- }
+ // Permet d'ajouter des zeros si necessaire
+ while (codeBinaire.length() < longueur) {
+ codeBinaire = "0" + codeBinaire;
+ }
- canonicalCodes.put(valeur,codeBinaire); // ajout dans le dictionnaire
- code++; // incrémentation pour la valeur qui suit
- temp = longueur; // mise à jour de la longueur précedente
+ canonicalCodes.put(valeur, codeBinaire); // Ajout dans le dictionnaire
+ code++; // Incrementation pour la valeur qui suit
+ temp = longueur; // Mise a jour de la longueur precedente
}
- return canonicalCodes;
- }
-
-
- public String getCode(Map canonicalCodes,int value){
- return canonicalCodes.get(value);
- }
-
- public int getLength(Map codesH,int value){
- return codesH.get(value).length();
- }
-
-}
+ return canonicalCodes;
+ }
+ /**
+ * Recupere le code canonique d'une valeur.
+ *
+ * @param canonicalCodes la table des codes canoniques
+ * @param value la valeur dont on veut le code
+ * @return le code canonique correspondant
+ */
+ public String getCode(Map canonicalCodes, int value) {
+ return canonicalCodes.get(value);
+ }
+ /**
+ * Recupere la longueur d'un code pour une valeur donnee.
+ *
+ * @param codesH la table des codes
+ * @param value la valeur dont on veut la longueur
+ * @return la longueur du code en bits
+ */
+ public int getLength(Map codesH, int value) {
+ return codesH.get(value).length();
+ }
+}
\ No newline at end of file
diff --git a/src/fr/iutfbleau/sae/mhuffman/ComparateurCanonique.java b/src/fr/iutfbleau/sae/mhuffman/ComparateurCanonique.java
index a493726..21ce9f8 100644
--- a/src/fr/iutfbleau/sae/mhuffman/ComparateurCanonique.java
+++ b/src/fr/iutfbleau/sae/mhuffman/ComparateurCanonique.java
@@ -1,19 +1,40 @@
package fr.iutfbleau.sae.mhuffman;
+
import java.util.Comparator;
import java.util.Map;
+/**
+ *
+ * Comparateur utilisé lors de la génération des codes canoniques.
+ * Il permet de trier des couples (symbole, code Huffman sous forme de chaîne).
+ *
+ * Le tri se fait dans cet ordre :
+ * 1. Par longueur du code (du plus court au plus long)
+ * 2. En cas d'égalité, par ordre croissant des symboles
+ */
public class ComparateurCanonique implements Comparator> {
+ /**
+ * Compare deux entrées contenant un symbole et son code Huffman.
+ *
+ * @param entree1 première entrée à comparer
+ * @param entree2 deuxième entrée à comparer
+ * @return un entier négatif si entree1 doit venir avant entree2,
+ * positif si elle doit venir après,
+ * et zéro si elles sont équivalentes selon le tri.
+ */
@Override
- public int compare(Map.Entry entree1,Map.Entry entree2) {
+ public int compare(Map.Entry entree1, Map.Entry entree2) {
int longueur1 = entree1.getValue().length();
int longueur2 = entree2.getValue().length();
+ // On compare d'abord la longueur des codes
if (longueur1 != longueur2) {
return longueur1 - longueur2;
}
+ // Si les longueurs sont identiques, on trie par symbole
return entree1.getKey() - entree2.getKey();
}
-}
\ No newline at end of file
+}
diff --git a/src/fr/iutfbleau/sae/mhuffman/ComparateurHuffmanNode.java b/src/fr/iutfbleau/sae/mhuffman/ComparateurHuffmanNode.java
new file mode 100644
index 0000000..795e1cb
--- /dev/null
+++ b/src/fr/iutfbleau/sae/mhuffman/ComparateurHuffmanNode.java
@@ -0,0 +1,27 @@
+package fr.iutfbleau.sae.mhuffman;
+
+import java.util.Comparator;
+
+/**
+ *
+ * Comparateur utilisé pour trier les nœuds de l'arbre de Huffman.
+ * Le tri se fait uniquement en fonction de la fréquence du nœud.
+ * Les nœuds ayant une plus petite fréquence doivent être placés avant.
+ *
+ * Cette classe permet d'éviter les classes anonymes ou les
+ * expressions avancées, et reste simple à comprendre.
+ */
+public class ComparateurHuffmanNode implements Comparator {
+
+ /**
+ * Compare deux nœuds en fonction de leur fréquence.
+ *
+ * @param a premier nœud à comparer
+ * @param b second nœud à comparer
+ * @return un entier négatif si a < b, positif si a > b, 0 si égalité
+ */
+ @Override
+ public int compare(HuffmanNode a, HuffmanNode b) {
+ return a.getFrequence() - b.getFrequence();
+ }
+}
\ No newline at end of file
diff --git a/src/fr/iutfbleau/sae/mhuffman/FrequencyTable.java b/src/fr/iutfbleau/sae/mhuffman/FrequencyTable.java
index a34b8b9..00cba4f 100644
--- a/src/fr/iutfbleau/sae/mhuffman/FrequencyTable.java
+++ b/src/fr/iutfbleau/sae/mhuffman/FrequencyTable.java
@@ -1,52 +1,28 @@
package fr.iutfbleau.sae.mhuffman;
+
import fr.iutfbleau.sae.mpif.Pixel;
import fr.iutfbleau.sae.mpif.RGBImage;
/**
- * Représente une table de fréquences pour une image RGB.
- *
- * Cette classe est utilisée dans le cadre de la compression de Huffman.
- * Elle compte le nombre d'occurrences de chaque valeur possible (0 Ã 255)
- * pour chacune des composantes de couleur : rouge, vert et bleu.
- *
- *
- *
- * Chaque composante est stockée dans un tableau de taille 256 :
- *
- * {@code freqR} pour le rouge
- * {@code freqG} pour le vert
- * {@code freqB} pour le bleu
- *
- * L'indice du tableau correspond à la valeur de la composante,
- * et la valeur stockée correspond à sa fréquence d'apparition.
- *
- *
- *
- * Cette table de fréquences sert ensuite à construire les arbres de Huffman
- * nécessaires à la compression des données de l'image.
- *
- *
- * @author Algassimou Pellel Diallo
- * @version 1.1
- * @since 2025-12-13
+ *
+ * Classe qui calcule les fréquences des valeurs de couleur dans une image RGB.
+ * Elle compte combien de fois chaque valeur de rouge, vert et bleu apparaît,
+ * ce qui servira ensuite pour construire les arbres de Huffman.
*/
public class FrequencyTable {
- /** Tableau des fréquences pour la composante rouge (valeurs de 0 à 255). */
+ /** Fréquences des valeurs de rouge entre 0 et 255. */
private final int[] freqR;
- /** Tableau des fréquences pour la composante verte (valeurs de 0 à 255). */
+ /** Fréquences des valeurs de vert entre 0 et 255. */
private final int[] freqG;
- /** Tableau des fréquences pour la composante bleue (valeurs de 0 à 255). */
- private final int[] freqB;
+ /** Fréquences des valeurs de bleu entre 0 et 255. */
+ private final int[] freqB;
/**
- * Construit une table de fréquences vide.
- *
- * Les trois tableaux de fréquences sont initialisés
- * avec 256 cases mises à zéro.
- *
+ * Constructeur qui initialise les trois tableaux de fréquences
+ * à zéro pour toutes les valeurs possibles.
*/
public FrequencyTable() {
this.freqR = new int[256];
@@ -55,33 +31,23 @@ public class FrequencyTable {
}
/**
- * Calcule les fréquences des composantes RGB à partir d'une image.
- *
- * Pour chaque pixel de l'image, la méthode récupère les valeurs
- * rouge, verte et bleue, puis incrémente la case correspondante
- * dans le tableau de fréquences associé.
- *
+ * Analyse une image et remplit les tableaux de fréquences.
+ * Pour chaque pixel, on récupère la valeur de rouge, de vert et de bleu,
+ * puis on incrémente la fréquence associée.
*
- * @param img l'image RGB Ã analyser
- * @throws IllegalArgumentException si l'image est null
+ * @param img l'image à analyser
+ * @throws IllegalArgumentException si l'image est nulle
*/
public void computeFromImage(RGBImage img) {
if (img == null) {
throw new IllegalArgumentException("L'image ne peut pas être null");
}
-
- /* Pour chaque composante de couleur de chaque pixel, on incrémente la fréquence correspondante,
- * c'est-à -dire on compte le nombre de fois que la composante apparaît dans l'image.
- * Ex: si un pixel P a une composante rouge de 150, on incrémente freqR[150] de 1.
- * Puis on fait de même pour les composantes verte et bleue.
- * On répète ce processus pour tous les pixels de l'image.
- */
+
for (int x = 0; x < img.getWidth(); x++) {
for (int y = 0; y < img.getHeight(); y++) {
- // On récupère le pixel une seule fois pour optimiser
+
Pixel pixel = img.getPixel(x, y);
-
- // Puis on incrémente les trois fréquences
+
this.freqR[pixel.getR()]++;
this.freqG[pixel.getG()]++;
this.freqB[pixel.getB()]++;
@@ -90,28 +56,29 @@ public class FrequencyTable {
}
/**
- * Retourne le tableau des fréquences de la composante rouge.
+ * Renvoie les fréquences des valeurs rouges.
*
- * @return un tableau de 256 entiers représentant les fréquences du rouge
+ * @return tableau de fréquence pour le rouge
*/
public int[] getRed() {
return this.freqR;
}
/**
- * Retourne le tableau des fréquences de la composante verte.
- * @return un tableau de 256 entiers représentant les fréquences du vert
+ * Renvoie les fréquences des valeurs vertes.
+ *
+ * @return tableau de fréquence pour le vert
*/
public int[] getGreen() {
return this.freqG;
}
/**
- * Retourne le tableau des fréquences de la composante bleue.
+ * Renvoie les fréquences des valeurs bleues.
*
- * @return un tableau de 256 entiers représentant les fréquences du bleu
+ * @return tableau de fréquence pour le bleu
*/
public int[] getBlue() {
return this.freqB;
}
-}
\ No newline at end of file
+}
diff --git a/src/fr/iutfbleau/sae/mhuffman/HuffmanNode.java b/src/fr/iutfbleau/sae/mhuffman/HuffmanNode.java
new file mode 100644
index 0000000..23088f3
--- /dev/null
+++ b/src/fr/iutfbleau/sae/mhuffman/HuffmanNode.java
@@ -0,0 +1,123 @@
+package fr.iutfbleau.sae.mhuffman;
+
+/**
+ *
+ * Représente un nœud de l'arbre de Huffman.
+ *
+ * Un nœud peut être :
+ * - une feuille : il contient une valeur (symbole de 0 à 255) et sa fréquence
+ * - un nœud interne : il n'a pas de valeur mais possède deux enfants et une fréquence
+ * correspondant à la somme des fréquences de ces enfants
+ *
+ * Cette classe sert uniquement de structure pour construire l'arbre de Huffman,
+ * utilisé ensuite pour générer les codes dans la compression.
+ */
+public class HuffmanNode {
+
+ /** Valeur du symbole pour une feuille. Vaut -1 pour un nœud interne. */
+ private int value;
+
+ /** Fréquence associée au symbole ou somme des fréquences pour les nœuds internes. */
+ private int frequence;
+
+ /** Fils gauche du nœud. Null si le nœud est une feuille. */
+ private HuffmanNode left;
+
+ /** Fils droit du nœud. Null si le nœud est une feuille. */
+ private HuffmanNode right;
+
+ /**
+ * Constructeur d'un nœud feuille.
+ *
+ * @param value symbole représenté (entre 0 et 255)
+ * @param frequence fréquence d'apparition du symbole
+ */
+ public HuffmanNode(int value, int frequence) {
+ if (value < 0 || value > 255) {
+ throw new IllegalArgumentException("Le symbole doit être entre 0 et 255.");
+ }
+ if (frequence < 0) {
+ throw new IllegalArgumentException("La fréquence ne peut pas être négative.");
+ }
+ this.value = value;
+ this.frequence = frequence;
+ this.left = null;
+ this.right = null;
+ }
+
+ /**
+ * Constructeur d'un nœud interne (créé lors de la fusion de deux sous-arbres).
+ *
+ * @param left fils gauche
+ * @param right fils droit
+ */
+ public HuffmanNode(HuffmanNode left, HuffmanNode right) {
+ if (left == null || right == null) {
+ throw new IllegalArgumentException("Les deux enfants doivent être non nuls.");
+ }
+ this.value = -1; // Valeur spéciale indiquant que c'est un nœud interne
+ this.left = left;
+ this.right = right;
+ this.frequence = left.frequence + right.frequence;
+ }
+
+ /**
+ * Indique si le nœud est une feuille.
+ *
+ * @return true si le nœud est une feuille, false sinon
+ */
+ public boolean isLeaf() {
+ return this.left == null && this.right == null;
+ }
+
+ /**
+ * Renvoie la fréquence associée à ce nœud.
+ *
+ * @return fréquence du symbole ou somme des fréquences
+ */
+ public int getFrequence() {
+ return this.frequence;
+ }
+
+ /**
+ * Renvoie le fils gauche.
+ *
+ * @return fils gauche ou null si feuille
+ */
+ public HuffmanNode getLeft() {
+ return this.left;
+ }
+
+ /**
+ * Renvoie le fils droit.
+ *
+ * @return fils droit ou null si feuille
+ */
+ public HuffmanNode getRight() {
+ return this.right;
+ }
+
+ /**
+ * Renvoie la valeur du symbole représenté.
+ *
+ * @return valeur du symbole (0 Ã 255)
+ * @throws IllegalStateException si le nœud n'est pas une feuille
+ */
+ public int getValue() {
+ if (!this.isLeaf()) {
+ throw new IllegalStateException("Seules les feuilles ont une valeur de symbole.");
+ }
+ return this.value;
+ }
+
+ /**
+ * Représentation textuelle du nœud. Utile en phase de débogage.
+ */
+ @Override
+ public String toString() {
+ if (this.isLeaf()) {
+ return "Feuille(valeur=" + this.value + ", freq=" + this.frequence + ")";
+ }
+ return "Noeud(freq=" + this.frequence + ")";
+ }
+}
diff --git a/src/fr/iutfbleau/sae/mhuffman/HuffmanTree.java b/src/fr/iutfbleau/sae/mhuffman/HuffmanTree.java
index 2dad2ca..ef3a1f5 100644
--- a/src/fr/iutfbleau/sae/mhuffman/HuffmanTree.java
+++ b/src/fr/iutfbleau/sae/mhuffman/HuffmanTree.java
@@ -1,181 +1,114 @@
package fr.iutfbleau.sae.mhuffman;
-import java.util.ArrayList;
-import java.util.Comparator;
+
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
-import fr.iutfbleau.sae.util.HuffmanNode;
+import java.util.PriorityQueue;
/**
- * Implémente un arbre de Huffman utilisé pour la compression de données.
- *
- * La classe {@code HuffmanTree} est chargée de représenter la structure
- * de l'arbre de Huffman et de générer les codes binaires associés aux symboles.
- * Elle s'appuie sur la classe {@link HuffmanNode} pour représenter les nœuds
- * de l'arbre.
- *
+ *
+ * Cette classe construit un arbre de Huffman à partir d'un tableau
+ * de fréquences. Une fois l'arbre construit, elle permet aussi de
+ * générer les codes Huffman associés à chaque symbole.
*
- *
- * L'arbre est construit à partir des fréquences des symboles calculées
- * en amont (par exemple à l'aide d'une {@code FrequencyTable}).
- * Chaque symbole est d'abord représenté par une feuille, puis les nœuds
- * sont combinés progressivement selon l'algorithme de Huffman afin
- * d'obtenir un arbre binaire optimal.
- *
+ * Le principe est le suivant :
+ * - chaque symbole non nul devient une feuille avec sa fréquence
+ * - on fusionne toujours les deux plus petites fréquences
+ * - on obtient une racine unique
+ * - un parcours de l'arbre permet ensuite de fabriquer les codes
*
- *
- * Une fois l'arbre construit, celui-ci est parcouru afin de générer une
- * table de correspondance associant à chaque symbole un code binaire unique.
- * Les symboles les plus fréquents se retrouvent plus proches de la racine
- * et possèdent donc des codes plus courts, ce qui permet de réduire
- * la taille des données compressées.
- *
- *
- *
- * Cette classe ne s'occupe pas de la lecture ou de l'écriture des bits.
- * Elle fournit uniquement la structure et les informations nécessaires
- * à la compression, qui sont ensuite exploitées par des flux binaires
- * dédiés.
- *
- *
- * @author Algassimou Pellel Diallo,Ayoub Anhdire
- * @version 1.0
- * @since 2025-12-13
+ * Les codes sont construits en descendant l'arbre :
+ * aller à gauche ajoute "0", aller à droite ajoute "1".
*/
public class HuffmanTree {
- /**
- * Racine de l'arbre de Huffman.
- *
- * Ce nœud est le résultat final de la construction de l'arbre et constitue
- * le point de départ pour la génération des codes binaires ainsi que
- * pour le décodage des données compressées.
- *
- */
private HuffmanNode root;
+ private Map codes;
/**
- * Dictionnaire pour enregistrer les codes Huffman
- */
- // j'ai retirer le static car chaque arbre a ses propres codes et j'utilise string plutot que int pour stocker les codes car on construit une chaine de 0 et de 1
- private Map codes;
-
-
- /**
- * Construit un arbre de Huffman.
- *
- * Le constructeur est responsable de l'initialisation de la structure
- * de l'arbre. En pratique, il combine les nœuds feuilles représentant
- * les symboles par ordre croissant de fréquence jusqu'à obtenir un
- * unique nœud racine.
- *
+ * Construit l'arbre de Huffman à partir d'un tableau de fréquences.
*
- *
- * Les détails de la construction (structure de données utilisée,
- * ordre des fusions, etc.) sont volontairement séparés de la logique
- * de génération des codes.
- *
+ * @param freq tableau contenant la fréquence de chaque symbole (0 à 255)
*/
public HuffmanTree(int[] freq) {
- // J'initialise la racine à null.
- this.root = null;
- // je cree une collection de feuilles
- List feuilles = new ArrayList<>();
+ this.root = null;
- // pour chaque valeur(symbole) dans la table de frequence
- for (int i = 0; i < freq.length; i++) {
- // si la frequence est superieure a 0 , on cree une feuille
- if (freq[i] > 0) {
- // pour la valeur (symbole) i avec frequence freq[i], on cree une feuille
- HuffmanNode feuille = new HuffmanNode(i, freq[i]);
- // on ajoute la feuille à la collection
- feuilles.add(feuille);
- }
- }
+ // Création de la file de priorité avec le comparateur
+ ComparateurHuffmanNode cmp = new ComparateurHuffmanNode();
+ PriorityQueue feuilles = new PriorityQueue<>(cmp);
- // On tri les feuilles par frequence croissante j'utilise un comparator qui compare la valeur retournee par getFrequence de chaque feuille
- // Referencement de methode avec ::
- feuilles.sort(Comparator.comparingInt(HuffmanNode::getFrequence));
- // flemme de faire un algo de tri alors que java le fait tres bien a voir a la fin si je vais coder une liste chainee avec un tri par insertion personnalise
+ // Ajout des feuilles
+ for (int i = 0; i < freq.length; i++) {
+ if (freq[i] > 0) {
+ feuilles.add(new HuffmanNode(i, freq[i]));
+ }
+ }
+
+ // Fusion des nœuds (feuille) jusqu'à obtenir la racine
+ while (feuilles.size() > 1) {
+ HuffmanNode left = feuilles.poll();
+ HuffmanNode right = feuilles.poll();
+ HuffmanNode parent = new HuffmanNode(left, right);
+ feuilles.add(parent);
+ }
- // Fusion des nœuds jusqu'à obtenir la racine
- // Tant qu'il y a plus d'une feuille dans la collection
- while (feuilles.size() > 1) {
- // je prends les deux feuilles de plus faible fréquence
- HuffmanNode left = feuilles.remove(0);
- HuffmanNode right = feuilles.remove(0);
-
- // je crée un nœud interne en les combinant
- HuffmanNode parent = new HuffmanNode(left, right);
-
- // j'insère le nœud parent dans la collection à la bonne position pour maintenir l'ordre (plus performant qu'un tri complet à chaque itération)
- int index = 0;
- // tant que l'index est dans les limites et que la frequence du noeud à l'index est inférieure à celle du parent
- while (index < feuilles.size() && feuilles.get(index).getFrequence() < parent.getFrequence()) {
- index++;
- }
- feuilles.add(index, parent);
- }
-
- // a la fin il ne reste qu'un seul noeud : la racine de l'arbre
- this.root = feuilles.get(0);
- }
-
- // Méthode pour générer les codes Huffman à partir de l'arbre
- // pourquoi string et pas int ? car on va construire une chaine de 0 et de 1
- /**
- * @return Map on stockera les codes Huffman sous forme de dictionnaire
- */
- public Map generateCodes() {
- /**
- * Le but de cette méthode est de pouvoir generer les codes Huffman à partir de l'arbre :
- * Les branches prendront comme valeur 1 ou 0 selon differents cas :
- * 1 - si on saute vers un fils droit
- * 0 - si on saute vers un fils gauche.
- * On construit les codes qui partent de la racine jusqu'Ã notre objectif
- */
- this.codes = new HashMap<>();
- // je lance la methode recursive avec une chaine vide qui va se remplir au fur et à mesure
- generateCodesRec(this.root, "");
- return codes;
- }
-
-
-
- private void generateCodesRec(HuffmanNode node, String prefiixe) {
- // Cas de base: si le noeud est une feuille, on ajoute le code au dictionnaire
- if (node.isLeaf()) {
- if (prefiixe.length() > 0){
- this.codes.put(node.getValue(), prefiixe);
- }else{
- this.codes.put(node.getValue(), "0");
- }
- return;
- }
-
- //Case general : sinon on continue a parcourir l'arbre
- // On va a gauche en ajoutant "0" au code
- generateCodesRec(node.getLeft(), prefiixe + "0");
- // On va a droite en ajoutant "1" au code
- generateCodesRec(node.getRight(), prefiixe + "1");
- }
-
- /**
- * @return Dictionnaire des codes Huffman
- */
- public Map getCodes(){
- return codes;
- }
-
- /**
- * @return le nœud racine de l'arbre de Huffman
- */
- public HuffmanNode getRoot() {
- return root;
+ this.root = feuilles.poll();
}
+ /**
+ * Lance la génération des codes Huffman en parcourant l'arbre.
+ *
+ * @return une map associant chaque symbole à son code Huffman
+ */
+ public Map generateCodes() {
+ this.codes = new HashMap<>();
+ generateCodesRec(this.root, "");
+ return this.codes;
+ }
+ /**
+ * Méthode récursive qui construit les codes Huffman.
+ *
+ * @param node nœud courant
+ * @param prefixe code accumulé (suite de 0 et de 1)
+ */
+ private void generateCodesRec(HuffmanNode node, String prefixe) {
+ // Cas feuille : on ajoute le code
+ if (node.isLeaf()) {
+
+ if (prefixe.length() > 0) {
+ this.codes.put(node.getValue(), prefixe);
+ } else {
+ // Cas spécial : un seul symbole dans l'arbre
+ this.codes.put(node.getValue(), "0");
+ }
+ return;
+ }
+
+ // Descendre à gauche s
+ generateCodesRec(node.getLeft(), prefixe + "0");
+
+ // Descendre à droite
+ generateCodesRec(node.getRight(), prefixe + "1");
+ }
+
+ /**
+ * Permet de récupérer la racine de l'arbre.
+ *
+ * @return la racine de l'arbre de Huffman
+ */
+ public HuffmanNode getRoot() {
+ return this.root;
+ }
+
+ /**
+ * Retourne les codes Huffman générés.
+ *
+ * @return une map symbole code
+ */
+ public Map getCodes() {
+ return this.codes;
+ }
}
diff --git a/src/fr/iutfbleau/sae/util/BitInputStream.java b/src/fr/iutfbleau/sae/mpif/BitInputStream.java
similarity index 95%
rename from src/fr/iutfbleau/sae/util/BitInputStream.java
rename to src/fr/iutfbleau/sae/mpif/BitInputStream.java
index 0054036..a249056 100644
--- a/src/fr/iutfbleau/sae/util/BitInputStream.java
+++ b/src/fr/iutfbleau/sae/mpif/BitInputStream.java
@@ -1,115 +1,115 @@
-package fr.iutfbleau.sae.util;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Décorateur de flux permettant la lecture binaire à granularité du bit.
- *
- * Cette classe encapsule un {@link InputStream} existant et fournit
- * des opérations de lecture bit par bit ou par groupes de bits.
- * Elle ne gère ni l'ouverture ni la sélection du fichier source.
- *
- *
- *
- * Utilisée notamment pour le décodage des fichiers compressés
- * (ex : format PIF utilisant des codes de Huffman).
- *
- *
- *
- *
- * @author Algassimou Pellel Diallo
- * @version 1.0
- * @since 2025-12-13
- */
-public class BitInputStream {
-
- /** Flux d'entrée sous-jacent */
- private final InputStream fluxEntree;
-
- /** Octet actuellement chargé depuis le flux */
- private int octetCourant;
-
- /** Position du bit courant dans l'octet (du bit 7 au bit 0) */
- private int positionBit;
-
- /** Indique si la fin du flux a été atteinte */
- private boolean finDeFlux;
-
- /**
- * Construit un lecteur binaire à partir d'un flux existant.
- *
- * @param fluxEntree flux d'entrée à décorer
- * @throws IllegalArgumentException si le flux est nul
- */
- public BitInputStream(InputStream fluxEntree) {
- if (fluxEntree == null) {
- throw new IllegalArgumentException("Le flux d'entrée ne peut pas être nul");
- }
- this.fluxEntree = fluxEntree;
- this.octetCourant = 0;
- this.positionBit = -1; // force la lecture d'un nouvel octet
- this.finDeFlux = false;
- }
-
- /**
- * Lit un bit depuis le flux binaire.
- *
- * @return 0 ou 1 si un bit est lu, -1 si la fin du flux est atteinte
- * @throws IOException si une erreur de lecture survient
- */
- public int readBit() throws IOException {
- if (finDeFlux) {
- return -1;
- }
-
- if (this.positionBit < 0) {
- int octetLu = this.fluxEntree.read();
- if (octetLu == -1) {
- this.finDeFlux = true;
- } else {
- this.octetCourant = octetLu;
- this.positionBit = 7;
- }
- }
-
- if (finDeFlux) {
- return -1;
- }
-
- int bit = (this.octetCourant >> this.positionBit) & 1;
- this.positionBit--;
- return bit;
- }
-
- /**
- * Lit une séquence de bits consécutifs et les assemble dans un entier.
- *
- * @param nombreBits nombre de bits à lire (strictement positif)
- * @return valeur entière correspondant aux bits lus,
- * ou -1 si la fin du flux est atteinte prématurément
- * @throws IOException si une erreur de lecture survient
- */
- public int readBits(int nombreBits) throws IOException {
- int res=0;
- for (int i = 0; i < nombreBits; i++) {
- int bit = readBit();
- if (bit == -1) {
- return -1;
- }
- res = (res << 1) | bit;
- }
- return res;
- }
-
- /**
- * Ferme le flux d'entrée sous-jacent.
- *
- * @throws IOException si une erreur survient lors de la fermeture
- */
- public void closeFlux() throws IOException {
- this.fluxEntree.close();
- }
-
-
-
-}
+package fr.iutfbleau.sae.mpif;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Décorateur de flux permettant la lecture binaire à granularité du bit.
+ *
+ * Cette classe encapsule un {@link InputStream} existant et fournit
+ * des opérations de lecture bit par bit ou par groupes de bits.
+ * Elle ne gère ni l'ouverture ni la sélection du fichier source.
+ *
+ *
+ *
+ * Utilisée notamment pour le décodage des fichiers compressés
+ * (ex : format PIF utilisant des codes de Huffman).
+ *
+ *
+ *
+ *
+ * @author Algassimou Pellel Diallo
+ * @version 1.0
+ * @since 2025-12-13
+ */
+public class BitInputStream {
+
+ /** Flux d'entrée sous-jacent */
+ private final InputStream fluxEntree;
+
+ /** Octet actuellement chargé depuis le flux */
+ private int octetCourant;
+
+ /** Position du bit courant dans l'octet (du bit 7 au bit 0) */
+ private int positionBit;
+
+ /** Indique si la fin du flux a été atteinte */
+ private boolean finDeFlux;
+
+ /**
+ * Construit un lecteur binaire à partir d'un flux existant.
+ *
+ * @param fluxEntree flux d'entrée à décorer
+ * @throws IllegalArgumentException si le flux est nul
+ */
+ public BitInputStream(InputStream fluxEntree) {
+ if (fluxEntree == null) {
+ throw new IllegalArgumentException("Le flux d'entrée ne peut pas être nul");
+ }
+ this.fluxEntree = fluxEntree;
+ this.octetCourant = 0;
+ this.positionBit = -1; // force la lecture d'un nouvel octet
+ this.finDeFlux = false;
+ }
+
+ /**
+ * Lit un bit depuis le flux binaire.
+ *
+ * @return 0 ou 1 si un bit est lu, -1 si la fin du flux est atteinte
+ * @throws IOException si une erreur de lecture survient
+ */
+ public int readBit() throws IOException {
+ if (finDeFlux) {
+ return -1;
+ }
+
+ if (this.positionBit < 0) {
+ int octetLu = this.fluxEntree.read();
+ if (octetLu == -1) {
+ this.finDeFlux = true;
+ } else {
+ this.octetCourant = octetLu;
+ this.positionBit = 7;
+ }
+ }
+
+ if (finDeFlux) {
+ return -1;
+ }
+
+ int bit = (this.octetCourant >> this.positionBit) & 1;
+ this.positionBit--;
+ return bit;
+ }
+
+ /**
+ * Lit une séquence de bits consécutifs et les assemble dans un entier.
+ *
+ * @param nombreBits nombre de bits à lire (strictement positif)
+ * @return valeur entière correspondant aux bits lus,
+ * ou -1 si la fin du flux est atteinte prématurément
+ * @throws IOException si une erreur de lecture survient
+ */
+ public int readBits(int nombreBits) throws IOException {
+ int res=0;
+ for (int i = 0; i < nombreBits; i++) {
+ int bit = readBit();
+ if (bit == -1) {
+ return -1;
+ }
+ res = (res << 1) | bit;
+ }
+ return res;
+ }
+
+ /**
+ * Ferme le flux d'entrée sous-jacent.
+ *
+ * @throws IOException si une erreur survient lors de la fermeture
+ */
+ public void closeFlux() throws IOException {
+ this.fluxEntree.close();
+ }
+
+
+
+}
diff --git a/src/fr/iutfbleau/sae/util/BitOutputStream.java b/src/fr/iutfbleau/sae/mpif/BitOutputStream.java
similarity index 99%
rename from src/fr/iutfbleau/sae/util/BitOutputStream.java
rename to src/fr/iutfbleau/sae/mpif/BitOutputStream.java
index 075b454..fa37ae2 100644
--- a/src/fr/iutfbleau/sae/util/BitOutputStream.java
+++ b/src/fr/iutfbleau/sae/mpif/BitOutputStream.java
@@ -1,4 +1,4 @@
-package fr.iutfbleau.sae.util;
+package fr.iutfbleau.sae.mpif;
import java.io.IOException;
import java.io.OutputStream;
diff --git a/src/fr/iutfbleau/sae/mpif/ComparateurEntreeCanonique.java b/src/fr/iutfbleau/sae/mpif/ComparateurEntreeCanonique.java
index eb013d2..e8a74bc 100644
--- a/src/fr/iutfbleau/sae/mpif/ComparateurEntreeCanonique.java
+++ b/src/fr/iutfbleau/sae/mpif/ComparateurEntreeCanonique.java
@@ -1,35 +1,41 @@
package fr.iutfbleau.sae.mpif;
-import java.util.Comparator;
+import java.util.Comparator;
import java.util.Map;
-
/**
- * Comparateur pour trier les entrées (symbole, longueur) lors de la reconstruction
- * des codes canoniques.
- * Le tri s'effectue d'abord par longueur croissante, puis par symbole croissant
- * en cas d'égalité de longueur.
- *
+ *
+ * Comparateur utilisé pendant la reconstruction des codes canoniques.
+ * Il permet de trier les paires (symbole, longueur) dans le bon ordre
+ * avant de générer les codes binaires.
+ *
+ * Le tri se fait en deux étapes :
+ * - d'abord par la longueur du code (ordre croissant)
+ * - si deux longueurs sont identiques, on trie par le symbole lui-même
+ *
+ * Ce comparateur est utilisé dans la méthode rebuildCanonical du PIFReader.
*/
public class ComparateurEntreeCanonique implements Comparator> {
/**
- * Compare deux entrées (symbole, longueur).
- *
- * @param entree1 première entrée
- * @param entree2 deuxième entrée
- * @return un entier négatif, zéro, ou positif selon que la première entrée
- * est inférieure, égale ou supérieure à la seconde
+ * Compare deux entrées contenant chacune un symbole et sa longueur de code.
+ * Le but est de les classer dans l'ordre nécessaire pour produire
+ * les codes canoniques dans l'ordre standard.
+ *
+ * @param entree1 première paire (symbole, longueur)
+ * @param entree2 deuxième paire (symbole, longueur)
+ * @return un entier indiquant si la première entrée doit être placée
+ * avant, au même niveau ou après la seconde
*/
@Override
public int compare(Map.Entry entree1, Map.Entry entree2) {
- // Comparer d'abord par longueur (valeur)
int comparaisonLongueur = entree1.getValue().compareTo(entree2.getValue());
+ // Si les longueurs sont différentes, c’est le critère principal
if (comparaisonLongueur != 0) {
return comparaisonLongueur;
}
- // Si les longueurs sont égales, comparer par symbole (clé)
+ // Sinon, on départage avec le symbole (la clé)
return entree1.getKey().compareTo(entree2.getKey());
}
-}
\ No newline at end of file
+}
diff --git a/src/fr/iutfbleau/sae/mpif/DecodeNode.java b/src/fr/iutfbleau/sae/mpif/DecodeNode.java
new file mode 100644
index 0000000..6e81f6d
--- /dev/null
+++ b/src/fr/iutfbleau/sae/mpif/DecodeNode.java
@@ -0,0 +1,61 @@
+package fr.iutfbleau.sae.mpif;
+
+/**
+ *
+ * Représente un nœud utilisé pour décoder les données dans un arbre binaire.
+ *
+ * Un nœud peut être :
+ * - un nœud interne : il possède un fils gauche et/ou un fils droit. Il ne contient pas de valeur utile.
+ * - une feuille : les deux fils sont null et le nœud contient une valeur (symbole entre 0 et 255).
+ *
+ * Cette structure est utilisée par PIFReader pour reconstruire l'arbre de décodage
+ * des codes canoniques et retrouver les valeurs des pixels.
+ */
+public class DecodeNode {
+
+ /** Fils gauche du nœud. Null si le nœud est une feuille. */
+ public DecodeNode left;
+
+ /** Fils droit du nœud. Null si le nœud est une feuille. */
+ public DecodeNode right;
+
+ /**
+ * Valeur associée à la feuille.
+ * Vaut -1 pour les nœuds internes qui ne représentent aucun symbole.
+ */
+ public Integer value;
+
+ /**
+ * Constructeur d'un nœud interne vide.
+ *
+ * Le nœud ne contient pas de valeur et possède des pointeurs
+ * initialement à null pour ses enfants.
+ */
+ public DecodeNode() {
+ this.left = null;
+ this.right = null;
+ this.value = -1;
+ }
+
+ /**
+ * Constructeur d'un nœud complet, utilisé pour créer une feuille ou un nœud interne.
+ *
+ * @param left fils gauche
+ * @param right fils droit
+ * @param value valeur associée si c'est une feuille, ou -1 pour un nœud interne
+ */
+ public DecodeNode(DecodeNode left, DecodeNode right, Integer value) {
+ this.left = left;
+ this.right = right;
+ this.value = value;
+ }
+
+ /**
+ * Indique si le nœud est une feuille (aucun enfant).
+ *
+ * @return true si le nœud est une feuille, false sinon
+ */
+ public boolean isLeaf() {
+ return this.left == null && this.right == null;
+ }
+}
diff --git a/src/fr/iutfbleau/sae/mpif/PIFReader.java b/src/fr/iutfbleau/sae/mpif/PIFReader.java
index 9d04041..6c2e3f7 100644
--- a/src/fr/iutfbleau/sae/mpif/PIFReader.java
+++ b/src/fr/iutfbleau/sae/mpif/PIFReader.java
@@ -1,7 +1,5 @@
package fr.iutfbleau.sae.mpif;
-import fr.iutfbleau.sae.util.BitInputStream;
-import fr.iutfbleau.sae.util.DecodeNode;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
@@ -60,7 +58,6 @@ public class PIFReader {
RGBImage img = decodePixels(lecteur, trieR, trieG, trieB);
lecteur.closeFlux();
- System.out.println("Fichier PIF lu avec succès : " + width + "x" + height);
return img;
}
@@ -75,7 +72,6 @@ public class PIFReader {
public void readHeader(BitInputStream in) throws IOException {
this.width = in.readBits(16);
this.height = in.readBits(16);
- System.out.println("Dimensions lues : " + this.width + "x" + this.height);
}
@@ -105,8 +101,6 @@ public class PIFReader {
for (int i = 0; i < 256; i++){
this.lenB[i] = in.readBits(8);
}
-
- System.out.println("Tables de longueurs lues");
}
diff --git a/src/fr/iutfbleau/sae/mpif/PIFWriter.java b/src/fr/iutfbleau/sae/mpif/PIFWriter.java
index 72b4eda..556e346 100644
--- a/src/fr/iutfbleau/sae/mpif/PIFWriter.java
+++ b/src/fr/iutfbleau/sae/mpif/PIFWriter.java
@@ -1,13 +1,34 @@
package fr.iutfbleau.sae.mpif;
-import fr.iutfbleau.sae.util.BitOutputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Map;
+/**
+ * Cette classe permet d'écrire une image au format PIF.
+ * Le fichier PIF contient une en-tête avec la taille de l'image,
+ * les longueurs des codes canoniques, puis l'encodage des pixels
+ * en utilisant ces codes.
+ *
+ * Les méthodes de cette classe suivent l'ordre d'écriture du fichier :
+ * 1) écrire l'en-tête
+ * 2) écrire les tables de longueurs
+ * 3) encoder les pixels un par un
+ */
public class PIFWriter {
+ /**
+ * Sauvegarde une image au format PIF dans un fichier.
+ * Le fichier est créé ou écrasé si il existe déjà .
+ *
+ * @param filepath chemin du fichier à écrire
+ * @param image l'image RGB Ã encoder
+ * @param canonR codes canoniques de la composante rouge
+ * @param canonG codes canoniques de la composante verte
+ * @param canonB codes canoniques de la composante bleue
+ * @throws Exception si une erreur survient dans l'écriture
+ */
public void writeTOFile(String filepath, RGBImage image,
Map canonR,
Map canonG,
@@ -31,7 +52,15 @@ public class PIFWriter {
ecriveur.fermerFlux();
}
- // Ecriture de l'en-tête du fichier PIF (largeur et hauteur)
+ /**
+ * Écrit l'en-tête du fichier PIF.
+ * L'en-tête contient uniquement la largeur et la hauteur,
+ * chacune codée sur 16 bits.
+ *
+ * @param out flux de sortie binaire
+ * @param width largeur de l'image
+ * @param height hauteur de l'image
+ */
public void writeHeader(BitOutputStream out, int width, int height) {
try {
out.writeBits(width, 16);
@@ -41,6 +70,16 @@ public class PIFWriter {
}
}
+ /**
+ * Écrit dans le fichier les longueurs des codes canoniques.
+ * Pour chaque composante (R, G, B), on parcourt les 256 valeurs possibles.
+ * Si un symbole n'existe pas dans les codes, on écrit une longueur 0.
+ *
+ * @param out flux binaire vers le fichier
+ * @param canonR longueurs pour la composante rouge
+ * @param canonG longueurs pour la composante verte
+ * @param canonB longueurs pour la composante bleue
+ */
public void writeTables(BitOutputStream out, Map canonR,
Map canonG, Map canonB) {
@@ -80,7 +119,17 @@ public class PIFWriter {
}
}
- // Méthode pour encoder les pixels de l'image en utilisant les codes canoniques
+ /**
+ * Encode chaque pixel de l'image en utilisant les codes canoniques.
+ * Pour chaque pixel, les composants R, G et B sont écrits
+ * dans cet ordre en utilisant writeBitString().
+ *
+ * @param out flux d'écriture binaire
+ * @param image l'image source
+ * @param canonRED codes canoniques pour le rouge
+ * @param canonGREEN codes canoniques pour le vert
+ * @param canonBLUE codes canoniques pour le bleu
+ */
public void encodePixels(BitOutputStream out, RGBImage image,
Map canonRED,
Map canonGREEN,
diff --git a/src/fr/iutfbleau/sae/mpif/Pixel.java b/src/fr/iutfbleau/sae/mpif/Pixel.java
index aa7c348..54d07ed 100644
--- a/src/fr/iutfbleau/sae/mpif/Pixel.java
+++ b/src/fr/iutfbleau/sae/mpif/Pixel.java
@@ -1,38 +1,67 @@
package fr.iutfbleau.sae.mpif;
+/**
+ * Cette classe représente un pixel composé de trois valeurs :
+ * rouge, vert et bleu. Chaque valeur est comprise entre 0 et 255.
+ * La classe sert surtout pour manipuler les pixels dans une image RGB.
+ */
public class Pixel{
private int r;
private int g;
private int b;
- //Ã completer
+ /**
+ * Crée un pixel avec ses trois composantes.
+ *
+ * @param red valeur de la composante rouge
+ * @param green valeur de la composante verte
+ * @param blue valeur de la composante bleue
+ */
public Pixel(int red, int green, int blue){
- this.r=red;
- this.g=green;
- this.b=blue;
+ this.r = red;
+ this.g = green;
+ this.b = blue;
}
+ /**
+ * Retourne la composante bleue du pixel.
+ */
public int getB() {
return b;
}
+ /**
+ * Retourne la composante verte du pixel.
+ */
public int getG() {
return g;
}
+ /**
+ * Retourne la composante rouge du pixel.
+ */
public int getR() {
return r;
}
+ /**
+ * Modifie la composante rouge du pixel.
+ */
public void setR(int r) {
this.r = r;
}
+ /**
+ * Modifie la composante bleue du pixel.
+ */
public void setB(int b) {
this.b = b;
}
+ /**
+ * Modifie la composante verte du pixel.
+ */
public void setG(int g) {
this.g = g;
}
-}
\ No newline at end of file
+}
diff --git a/src/fr/iutfbleau/sae/mpif/RGBImage.java b/src/fr/iutfbleau/sae/mpif/RGBImage.java
index 8c3bb71..d9c5687 100644
--- a/src/fr/iutfbleau/sae/mpif/RGBImage.java
+++ b/src/fr/iutfbleau/sae/mpif/RGBImage.java
@@ -1,31 +1,62 @@
package fr.iutfbleau.sae.mpif;
+/**
+ * Cette classe représente une image composée de pixels RGB.
+ * L'image est stockée sous forme d'un tableau 2D contenant des objets Pixel.
+ * Chaque pixel possède trois valeurs : rouge, vert et bleu.
+ */
public class RGBImage {
private int width;
private int height;
private Pixel [][] pixels;
+ /**
+ * Crée une image vide avec une largeur et une hauteur données.
+ * Tous les pixels doivent être ajoutés ensuite avec setPixel().
+ *
+ * @param lar largeur de l'image
+ * @param haut hauteur de l'image
+ */
public RGBImage (int lar, int haut){
- this.width=lar;
- this.height=haut;
+ this.width = lar;
+ this.height = haut;
this.pixels = new Pixel[this.width][this.height];
}
+ /**
+ * Retourne la largeur de l'image.
+ */
public int getWidth() {
return width;
}
+ /**
+ * Retourne la hauteur de l'image.
+ */
public int getHeight() {
return height;
}
+ /**
+ * Place un pixel aux coordonnées indiquées.
+ *
+ * @param x position horizontale
+ * @param y position verticale
+ * @param p pixel à insérer
+ */
public void setPixel(int x, int y, Pixel p) {
this.pixels[x][y] = p;
}
+ /**
+ * Retourne le pixel situé aux coordonnées indiquées.
+ *
+ * @param x position horizontale
+ * @param y position verticale
+ * @return le pixel présent à cette position
+ */
public Pixel getPixel(int x, int y) {
return this.pixels[x][y];
}
-
-}
\ No newline at end of file
+}
diff --git a/src/fr/iutfbleau/sae/util/DecodeNode.java b/src/fr/iutfbleau/sae/util/DecodeNode.java
deleted file mode 100644
index 96a8e3c..0000000
--- a/src/fr/iutfbleau/sae/util/DecodeNode.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package fr.iutfbleau.sae.util;
-
-public class DecodeNode {
- public DecodeNode left;
- public DecodeNode right;
- public Integer value; // null si pas une feuille
-
- public DecodeNode() {
- this.left = null;
- this.right = null;
- this.value = -1; // valeur non initialisée
- }
-
- public DecodeNode(DecodeNode left, DecodeNode right, Integer value) {
- this.left = left;
- this.right = right;
- this.value = value;
- }
-
- public boolean isLeaf() {
- return this.left == null && this.right == null;
- }
-}
diff --git a/src/fr/iutfbleau/sae/util/HuffmanNode.java b/src/fr/iutfbleau/sae/util/HuffmanNode.java
deleted file mode 100644
index 05a713c..0000000
--- a/src/fr/iutfbleau/sae/util/HuffmanNode.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package fr.iutfbleau.sae.util;
-
-/**
- * Représente un nœud de l'arbre de Huffman.
- *
- * Un {@code HuffmanNode} peut être :
- *
- * une feuille, contenant une valeur (symbole) et une fréquence
- * un nœud interne, contenant uniquement une fréquence et deux enfants
- *
- *
- *
- *
- * Cette classe est une structure de données utilisée par {@code HuffmanTree}
- * pour construire l'arbre de Huffman.
- *
- *
- * @author Algassimou Pellel Diallo
- * @version 1.1
- * @since 2025-12-17
- */
-public class HuffmanNode {
-
- /**
- * Valeur de la composante (symbole) représentée par ce nœud (uniquement pour les feuilles).
- * Représente la part de la composante (rouge, verte ou bleue) dans la couleur d'un pixel.
- * Pour les nœuds internes, cette valeur vaut -1.
- */
- private int value;
-
- /** Fréquence du symbole (somme des fréquences des enfants pour les nœuds internes). */
- private int frequence;
-
- /** Fils gauche du nœud (null si feuille). */
- private HuffmanNode left;
-
- /** Fils droit du nœud (null si feuille). */
- private HuffmanNode right;
-
- /**
- * Construit un nœud feuille de Huffman.
- *
- * Ce constructeur est utilisé pour représenter une valeur
- * issue de la table de fréquences.
- *
- *
- * @param value la valeur (symbole) représentée par ce nœud (entre 0 et 255)
- * @param frequence la fréquence d'apparition de la valeur
- * @throws IllegalArgumentException si la valeur n'est pas entre 0 et 255
- * ou si la fréquence est négative
- */
- public HuffmanNode(int value, int frequence) {
- if (value < 0 || value > 255) {
- throw new IllegalArgumentException("La valeur doit être entre 0 et 255");
- }
- if (frequence < 0) {
- throw new IllegalArgumentException("La fréquence ne peut pas être négative");
- }
- this.value = value;
- this.frequence = frequence;
- this.left = null;
- this.right = null;
- }
-
- /**
- * Construit un nœud interne de Huffman.
- *
- * Ce constructeur est utilisé lors de la fusion de deux nœuds
- * de plus faible fréquence lors de la construction de l'arbre.
- *
- *
- * @param left le fils gauche
- * @param right le fils droit
- * @throws IllegalArgumentException si l'un des fils est null
- */
- public HuffmanNode(HuffmanNode left, HuffmanNode right) {
- if (left == null || right == null) {
- throw new IllegalArgumentException("Les fils ne peuvent pas être null");
- }
- this.value = -1; // Valeur sentinelle pour les nœuds internes
- this.left = left;
- this.right = right;
- this.frequence = left.frequence + right.frequence;
- }
-
- /**
- * Indique si ce nœud est une feuille.
- *
- * @return {@code true} si le nœud est une feuille, {@code false} sinon
- */
- public boolean isLeaf() {
- return this.left == null && this.right == null;
- }
-
- /**
- * Retourne la fréquence du nœud.
- *
- * @return la fréquence
- */
- public int getFrequence() {
- return this.frequence;
- }
-
- /**
- * Retourne le fils gauche du nœud.
- *
- * @return le fils gauche, ou null si le nœud est une feuille
- */
- public HuffmanNode getLeft() {
- return this.left;
- }
-
- /**
- * Retourne le fils droit du nœud.
- *
- * @return le fils droit, ou null si le nœud est une feuille
- */
- public HuffmanNode getRight() {
- return this.right;
- }
-
- /**
- * Retourne la valeur représentée par ce nœud.
- *
- * Cette méthode n'a de sens que si le nœud est une feuille.
- *
- *
- * @return la valeur du symbole (entre 0 et 255)
- * @throws IllegalStateException si le nœud n'est pas une feuille
- */
- public int getValue() {
- if (!this.isLeaf()) {
- throw new IllegalStateException("La valeur n'est définie que pour les feuilles.");
- }
- return this.value;
- }
-
- /**
- * Retourne une représentation textuelle du nœud.
- *
- * Utile pour le débogage et l'affichage de l'arbre.
- *
- *
- * @return une chaîne décrivant le nœud
- */
- @Override
- public String toString() {
- if (this.isLeaf()) {
- return "Feuille(valeur=" + this.value + ", freq=" + this.frequence + ")";
- }
- return "Noeud(freq=" + this.frequence + ")";
- }
-}
\ No newline at end of file
diff --git a/temp/kikikikirou.pif b/temp/kikikikirou.pif
deleted file mode 100644
index 1caa413..0000000
Binary files a/temp/kikikikirou.pif and /dev/null differ
diff --git a/temp/learning-Log.txt b/temp/learning-Log.txt
deleted file mode 100644
index ec1e78d..0000000
--- a/temp/learning-Log.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-Learning log – Problème de blocage de la fenêtre après la sauvegarde:
-
- Après avoir implémenté la fonctionnalité d’export au format PIF depuis l’interface du convertisseur,
- j’ai rencontré un problème important : une fois que je cliquais sur le bouton d’exportation,
- la fenêtre se figeait complètement. Elle restait visible, mais impossible à fermer ou à interagir avec.
- Le programme semblait bloqué.
-
- En analysant le comportement et en utilisant des impressions de debug, j’ai constaté que le blocage n’était pas lié à l’écriture du
- fichier ni à la logique du convertisseur, mais bien à un problème de gestion des threads dans Swing.
-
- Swing repose sur un fonctionnement particulier : toute l’interface graphique est gérée par un seul thread dédié,
- appelé l’Event Dispatch Thread (EDT). Ce thread est responsable de tout ce qui concerne l’interface utilisateur :
- la gestion des clics, le rafraîchissement de la fenêtre, la fermeture, le dessin et l’affichage en général.
- Tant que ce thread tourne correctement, l’application reste réactive.
-
- L’EDT ne démarre réellement qu’après l’appel à la méthode permettant d’afficher la fenêtre. À partir de ce moment,
- toutes les opérations qui modifient l’interface devraient strictement être exécutées sur ce thread.
- C’est une règle fondamentale pour éviter les blocages.
-
- En examinant mon programme, je me suis rendu compte que le problème venait de la manière dont j’avais structuré mon point d’entrée.
- Mon programme principal créait la fenêtre, le contrôleur, puis lançait immédiatement tout le processus de conversion,
- qui incluait le chargement du fichier image, le calcul des fréquences, la construction des arbres de Huffman,
- la génération des codes canoniques, et éventuellement l’écriture du fichier PIF.
- Ce sont des opérations potentiellement longues et qui se déroulaient sur le thread principal,
- avant même que l’EDT ne prenne le relais pour gérer l’interface.
-
- Cela avait pour conséquences que Swing se retrouvait dans un état instable, puisque certaines opérations graphiques avaient été réalisées
- hors du thread dédié.
- C’est exactement ce qui provoquait le gel de l’interface : une fois le fichier enregistré, la fenêtre ne répondait plus car
- l’EDT était bloqué ou interrompu, empêchant toute interaction, y compris la fermeture de la fenêtre.
-
- Une fois le problème identifié, les solutions étaient claires. Il fallait s’assurer que toutes les opérations qui touchent
- a l’interface graphique soient exécutées sur l’Event Dispatch Thread. Cela signifie que toute interaction, y compris l’ouverture
- d’un sélecteur de fichiers, doit obligatoirement être déclenchée dans ce contexte. De plus, il fallait veiller à ne pas exécuter
- de longues opérations synchrones avant le démarrage complet de l’EDT.
-
- La solution consiste donc à déléguer l’appel du processus de conversion au thread graphique, en utilisant le mécanisme fourni par
- Swing pour garantir que le code s’exécute sur l’EDT. Une autre possibilité serait d’exécuter les opérations lourdes dans un thread en
- arrière-plan pour éviter de bloquer l’interface, mais dans tous les cas le respect strict de la séparation entre traitements et interface
- est essentiel.
-
- Grâce à cette analyse, j’ai mieux compris la manière dont Swing gère les threads et j’ai pu corriger la structure de mon programme
- afin qu’il reste totalement réactif, même après l’export. Cette expérience m’a rappelé l’importance de maîtriser les principes fondamentaux
- des bibliothèques graphiques et leurs contraintes en matière de multithreading.
-
-
-
-
-
- le proble aussi avec mon flush infini
\ No newline at end of file
diff --git a/temp/oiseauJPG.jpg b/temp/oiseauJPG.jpg
deleted file mode 100644
index 5be436f..0000000
Binary files a/temp/oiseauJPG.jpg and /dev/null differ
diff --git a/temp/test2.jpeg b/temp/test2.jpeg
deleted file mode 100644
index 713ad49..0000000
Binary files a/temp/test2.jpeg and /dev/null differ
diff --git a/temp/test_checkerboard_256bmp.pif b/temp/test_checkerboard_256bmp.pif
deleted file mode 100644
index 1caa413..0000000
Binary files a/temp/test_checkerboard_256bmp.pif and /dev/null differ
diff --git a/temp/un-portrait-brillant-d-une-belle-femme.jpg b/temp/un-portrait-brillant-d-une-belle-femme.jpg
deleted file mode 100644
index 0945899..0000000
Binary files a/temp/un-portrait-brillant-d-une-belle-femme.jpg and /dev/null differ
diff --git a/temp/un-portrait-brillant-d-une-belle-femme.pif b/temp/un-portrait-brillant-d-une-belle-femme.pif
deleted file mode 100644
index fee63ff..0000000
Binary files a/temp/un-portrait-brillant-d-une-belle-femme.pif and /dev/null differ