Ce guide explique comment doter une nouvelle application JavaFX d'un manuel utilisateur
intégré avec mgt-manuel-core : production du manuel, affichage dans l'application,
écran d'administration optionnel et personnalisation de la charte graphique.
Application de référence : Sirius-FT intègre le viewer (menu A propos →
« Manuel utilisateur ») exactement comme décrit ici ; son manuel est produit avec
Manuel Studio et déposé dans le répertoire configuré (clé REP_MANUEL).
Le manuel est un bundle de fichiers autonome posé dans un répertoire :
<repertoire-manuel>/
├── index.html page d'accueil (sommaire cliquable)
├── 01_<document>.html une page HTML par document source (préfixe = ordre)
├── images/ images extraites (Word) ou diapositives rendues (PowerPoint)
├── styles.css feuille de style des pages (rendue par le thème)
├── toc.json manifeste de navigation lu par le viewer
└── sources/ copies des documents importés + sources.json (régénération)
Deux briques l'exploitent :
| Brique | Rôle |
|---|---|
ManuelGenerator |
produit le bundle à partir de documents Word/PowerPoint |
HelpViewer |
affiche le bundle (sommaire arborescent, recherche, zoom, navigation) |
La charte (couleurs, logo, CSS) des deux côtés est portée par un ManuelTheme.
javafx-controls et javafx-webprovided : c'est votrecd mgt-manuel-module && ./build.sh (fait un mvn -o install).<dependency>
<groupId>com.megatim.manuel</groupId>
<artifactId>mgt-manuel-core</artifactId>
<version>1.0</version>
</dependency>
<!-- Fournis par VOTRE application (versions à votre main, >= 17) -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>17.0.7</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-web</artifactId>
<version>17.0.7</version>
</dependency>
<!-- Logging : la lib n'embarque que slf4j-api. Apache POI logge via log4j2-api :
ajoutez le pont vers votre backend (exemple avec Logback). -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.20.0</version>
</dependency>
⚠️ Si vos modules JavaFX viennent de dépendances transitives, vérifiez avec
mvn dependency:tree -Dincludes=org.openjfxqu'une seule version est résolue :
un runtime mélangé (ex. base 11 + web 17) fait planter WebView au démarrage
(PlatformLogger ... not implemented).
Décidez où vit le bundle dans votre application. Recommandation : un répertoire
relatif au dossier d'installation, rendu configurable par une clé de configuration
(pattern ManuelConfig de Sirius-FT) :
// Exemple minimal : <dossier-courant>/manuel, surchargé par une propriété
public final class MonManuelConfig {
public static Path repertoireManuel() {
String rep = System.getProperty("app.manuel.dir",
Paths.get("").toAbsolutePath() + File.separator + "manuel");
return Path.of(rep);
}
}
java -jar mgt-manuel-studio-1.0.jar..properties pour que le styles.css généré porte vos couleurs.ManuelGenerator generator = new ManuelGenerator(monTheme); // ou new ManuelGenerator()
Path manuel = generator.generate(
MonManuelConfig.repertoireManuel(), // répertoire cible (remplacé atomiquement)
List.of(Path.of("Manuel utilisateur.docx")), // sources ordonnées
"Mon Application", // titre du projet (en-tête du viewer)
"1.0.0", // version
"Manuel utilisateur", // titre de l'aide
ligne -> Platform.runLater(() -> journal.appendText(ligne + "\n")));
Points importants :
- Jamais sur le thread JavaFX : lancez generate(...) dans unjavafx.concurrent.Task (les convertisseurs PowerPoint rendent les diapositives
en PNG via AWT et la conversion peut durer plusieurs secondes).
- La génération est atomique : elle se fait dans <cible>.tmp puis remplace le
répertoire ; un échec ne détruit jamais le manuel existant.
- Les documents importés sont copiés dans <cible>/sources/ avec sources.json
(SourcesManifest.load(dir)) : votre écran d'administration peut recharger la liste
des sources et les métadonnées entre deux sessions, et régénérer sans les originaux.
- Formats acceptés : .docx, .doc, .pptx, .ppt
(filtrez vos FileChooser avec ConverterFactory.isSupported(nomFichier)).
import com.megatim.manuel.core.viewer.HelpViewer;
HelpViewer viewer = new HelpViewer(MonManuelConfig.repertoireManuel());
Parent contenu = viewer.build(); // IOException si toc.json absent/corrompu
monConteneur.setCenter(contenu); // s'intègre dans n'importe quel layout
maFenetre.setTitle(viewer.title()); // "Mon Application — v1.0.0"
build() retourne un Parent classique : onglet, fenêtre dédiée, panneau latéral…
Le viewer fournit sommaire arborescent + recherche instantanée, navigation
Précédent/Suivant (grisée selon l'historique), bouton Accueil et zoom.
@FXML
public void ouvrirManuel(ActionEvent e) {
Path toc = MonManuelConfig.repertoireManuel().resolve(HelpExporter.TOC_JSON);
if (!Files.exists(toc)) {
afficherAvertissement("Aucun manuel disponible. Contactez votre administrateur.");
return;
}
Stage stage = new Stage();
HelpViewer viewer = new HelpViewer(MonManuelConfig.repertoireManuel());
stage.setScene(new Scene((Parent) viewer.build(), 1120, 700));
stage.setTitle(viewer.title());
stage.show();
}
Le thème par défaut (ManuelTheme.defaultTheme()) reproduit la charte Sirius-FT.
Pour votre application, construisez un thème et passez-le aux deux briques
(le générateur pour le styles.css des pages HTML, le viewer pour l'interface JavaFX) :
ManuelTheme theme = ManuelTheme.builder()
// Interface JavaFX du viewer
.accentColor("#ffe3d0") // bouton Accueil + hover
.buttonColor("#faf6f2") // boutons de la barre d'outils
.buttonBorderColor("#d9b89c")
.panelBorderColor("#e0d5ca") // encadrés (sommaire)
.selectionColor("#ffd9c2") // sélection dans le sommaire
.hoverColor("#fff3ea")
.textColor("#3a2c20")
.backgroundColor("#ffffff")
// Identité
.appTitle("Mon Application")
.logo(getClass().getResource("/images/logo.png"))
// Pages HTML générées
.htmlVar("html.h1", "#8a3e00")
.htmlVar("html.link", "#c2571a")
.htmlVar("html.navbar.bg", "#fdf1e7")
.build();
new ManuelGenerator(theme).generate(...); // bundle aux couleurs du thème
new HelpViewer(dossier, theme).build(); // viewer aux couleurs du thème
.extraViewerStylesheet(uri) ajoute votre feuille APRÈS la CSSstyleClass : help-viewer (racine), button-primaryhelp-left-panel, help-panel-title, help-project-title,help-project-version, help-status..viewerStylesheet(uri) remplace la CSS embarquéemgt-manuel-core/src/main/resources/com/megatim/manuel/core/viewer/help-viewer.css).Surchargeables une à une via htmlVar(cle, valeur) — défauts entre parenthèses :html.font, html.text (#1a1a1a), html.bg (#ffffff), html.h1 (#1f3a5f),html.h2 (#22507a), html.h3 (#2b6098), html.link (#1565c0), html.caption,html.muted, html.rule, html.navbar.bg (#eef2f7), html.navbar.border,html.navbar.disabled, html.table.border, html.img.border.
Pour un contrôle total : .htmlStylesTemplate(monTemplate) (placeholders ${...}).
.propertiesLe studio (et votre application, via la même classe ThemeLoader du module studio ou
une copie) peut charger un thème depuis un fichier :
accentColor=#ffe3d0
selectionColor=#ffd9c2
appTitle=Mon Application
logo=logo.png
htmlVars.html.h1=#8a3e00
extraViewerStylesheets=file:/opt/monapp/styles/mon-viewer.css
Le convertisseur exploite la structure du document — respectez ces conventions :
| Élément du manuel | Convention Word |
|---|---|
| Page de garde | tout le contenu avant le premier titre |
| Préambule (onglet dédié) | titres nommés Résumé, Mots clés, Historique, Diffusion |
| Sommaire numéroté (1, 1.1…) | styles Titre 1 / Titre 2 / Titre 3 (Heading 1-3) |
| Onglet Illustrations | légendes d'images en style Légende (Caption), ex. « Figure 12 : Page de connexion » |
| Images | insérées normalement (elles sont extraites dans images/) |
Le nom du fichier devient le titre du document dans le sommaire — nommez-le
proprement (ex. Manuel utilisateur MonApp v1.0.0.docx).
module-info requis.META-INF/*.SF|*.DSA|*.RSA (jars POI signés).javafx-web (WebKit) ≈ 45 Mo| Symptôme | Cause / correctif |
|---|---|
IOException: toc.json introuvable |
Aucun manuel généré dans le répertoire — affichez votre message « Aucun manuel disponible » (voir §5). |
NoClassDefFoundError: javafx/scene/web/WebView |
Le module javafx-web n'est pas fourni par l'hôte — ajoutez la dépendance (la lib est en provided). |
Crash WebView PlatformLogger ... not implemented |
Versions JavaFX mélangées sur le classpath — alignez tout sur une seule version (dependency:tree). |
| Fenêtre UNDECORATED impossible à déplacer sur la zone du manuel | La WebView consomme les événements souris : prévoir le drag sur votre barre de titre uniquement. |
| Génération qui gèle l'interface | generate() appelé sur le thread JavaFX — passez par un Task (voir §4). |
Warning multiple Log4j providers |
log4j-core présent ailleurs dans l'hôte en plus de log4j-to-slf4j — cosmétique, le pont gagne ; sinon excluez log4j-core. |
Caractères ◀▶ en carrés dans vos surcharges |
Police système sans ces glyphes — préférez des libellés texte (le viewer utilise « Précédent / Suivant »). |
mgt-manuel-core + modules JavaFX controls/web fournis par l'hôtelog4j-to-slf4j + backend)ManuelTheme aux couleurs de l'application, passé au générateur ET au viewer