From 775ae2e3fb216872af7977eefeacc675b9afde1b Mon Sep 17 00:00:00 2001 From: Jules Date: Sun, 21 Jun 2026 22:27:35 +0200 Subject: [PATCH] Ajoute l'auto-mise a jour et regroupe les menus sous "Imposition Pro" Module 8 : verifie/installe les mises a jour directement depuis le menu Acrobat (compare version.txt sur Gitea a CDImp.VERSION, retelecharge les .js si plus recent). Tous les items de menu sont desormais regroupes dans un sous-menu "Edition > Imposition Pro" (Ouvrir le panneau, Gerer la licence, Verifier les mises a jour, A propos) plutot que disperses directement dans le menu Edition. --- acrobat-plugin/src/Imposition-00-Core.js | 40 ++- acrobat-plugin/src/Imposition-00b-Licence.js | 4 +- acrobat-plugin/src/Imposition-01-UI.js | 33 +++ acrobat-plugin/src/Imposition-08-MiseAJour.js | 228 ++++++++++++++++++ acrobat-plugin/version.txt | 1 + 5 files changed, 294 insertions(+), 12 deletions(-) create mode 100755 acrobat-plugin/src/Imposition-08-MiseAJour.js create mode 100755 acrobat-plugin/version.txt diff --git a/acrobat-plugin/src/Imposition-00-Core.js b/acrobat-plugin/src/Imposition-00-Core.js index a9e2dac..b79d78c 100755 --- a/acrobat-plugin/src/Imposition-00-Core.js +++ b/acrobat-plugin/src/Imposition-00-Core.js @@ -209,23 +209,43 @@ CDImp.Util.FORMATS_MM = { }; // ----------------------------------------------------------------------- -// Menu racine "Imposition Pro" +// Numero de version (affiche dans "A propos", compare lors de la +// verification de mise a jour - voir Imposition-08-MiseAJour.js). A +// incrementer a chaque modification poussee sur Gitea. // ----------------------------------------------------------------------- -// Cree un menu de premier niveau avec un seul point d'entree qui ouvre le -// panneau de controle principal (boite de dialogue maitresse, voir Module 1). -// La creation/modification de menus est une operation privilegiee. +CDImp.VERSION = "1.0.0"; + +// ----------------------------------------------------------------------- +// Sous-menu "Imposition Pro" +// ----------------------------------------------------------------------- +// Cree un sous-menu (et non un simple item) accroche au menu Edition, dans +// lequel chaque module/fichier ajoute ensuite ses propres entrees via +// app.addMenuItem({ cParent: "ImpositionPro", ... }). app.addSubMenu() est +// l'API documentee pour creer un sous-menu (distincte de addMenuItem, qui +// cree une entree simple). La creation de menus est une operation +// privilegiee. // ----------------------------------------------------------------------- CDImp.Util.avecPrivileges(function () { try { - app.addMenuItem({ - cName: "CDImpRacine", + app.addSubMenu({ + cName: "ImpositionPro", cParent: "Edit", // accroche dans le menu Edition (peut etre adapte) - cExec: "CDImp.UI.ouvrirPanneauPrincipal(this);", - cEnable: "event.rc = (CDImp.UI != undefined);", + cUser: "Imposition Pro", nPos: -1 }); } catch (e) { - // Si le menu existe deja (rechargement de script), on ignore - // silencieusement l'erreur de doublon. + // Sous-menu deja present (rechargement de script) : ignore. + } + + try { + app.addMenuItem({ + cName: "CDImpOuvrirPanneau", + cParent: "ImpositionPro", + cExec: "CDImp.UI.ouvrirPanneauPrincipal(this);", + cEnable: "event.rc = (CDImp.UI != undefined);", + nPos: 0 + }); + } catch (e) { + // Item deja present (rechargement de script) : ignore. } }); diff --git a/acrobat-plugin/src/Imposition-00b-Licence.js b/acrobat-plugin/src/Imposition-00b-Licence.js index 15435e5..94b2bbd 100755 --- a/acrobat-plugin/src/Imposition-00b-Licence.js +++ b/acrobat-plugin/src/Imposition-00b-Licence.js @@ -331,10 +331,10 @@ CDImp.Util.avecPrivileges(function () { try { app.addMenuItem({ cName: "CDImpGererLicence", - cParent: "Edit", + cParent: "ImpositionPro", cExec: "CDImp.Licence.gererCle();", cEnable: "event.rc = (CDImp.Licence != undefined);", - nPos: -1 + nPos: 1 }); } catch (e) { // menu deja present (rechargement de script) : ignore diff --git a/acrobat-plugin/src/Imposition-01-UI.js b/acrobat-plugin/src/Imposition-01-UI.js index b43888d..59b741d 100755 --- a/acrobat-plugin/src/Imposition-01-UI.js +++ b/acrobat-plugin/src/Imposition-01-UI.js @@ -100,6 +100,23 @@ CDImp.UI._moduleAVenir = function (nomModule) { CDImp.Util.info("Module \"" + nomModule + "\" : en cours de developpement.\nDisponible dans une prochaine version de la suite d'imposition."); }; +/** + * Boite "A propos" : version installee, modules disponibles, support. + */ +CDImp.UI.afficherAPropos = function () { + CDImp.Util.info( + "Imposition Professionnelle pour Acrobat Pro\n" + + "Version : " + CDImp.VERSION + "\n\n" + + "Modules : Livret/Delivretisation, N-Up & Step and Repeat,\n" + + "Decoupe & reassemblage, Marges & cadrages,\n" + + "Reperes/numerotation, Automatisation.\n\n" + + "Depot : git.copydev.fr/jules/copydev-imposing-tool\n" + + "(dossier acrobat-plugin/)\n\n" + + "Utilisez \"Imposition Pro > Verifier les mises a jour...\"\n" + + "pour installer la derniere version." + ); +}; + /** * Point d'entree principal : ouvre le panneau de controle, puis route vers * le module choisi par l'utilisateur. Le document actif (celui depuis lequel @@ -152,3 +169,19 @@ CDImp.UI.ouvrirPanneauPrincipal = function (docCourant) { } // Fermeture / Annulation : rien a faire. }; + +// ----------------------------------------------------------------------- +// Entree de menu "A propos..." +// ----------------------------------------------------------------------- +CDImp.Util.avecPrivileges(function () { + try { + app.addMenuItem({ + cName: "CDImpAPropos", + cParent: "ImpositionPro", + cExec: "CDImp.UI.afficherAPropos();", + nPos: 3 + }); + } catch (e) { + // Item deja present (rechargement de script) : ignore. + } +}); diff --git a/acrobat-plugin/src/Imposition-08-MiseAJour.js b/acrobat-plugin/src/Imposition-08-MiseAJour.js new file mode 100755 index 0000000..ceaecc7 --- /dev/null +++ b/acrobat-plugin/src/Imposition-08-MiseAJour.js @@ -0,0 +1,228 @@ +// Imposition-08-MiseAJour.js +// --------------------------------------------------------------------------- +// Suite d'imposition professionnelle - Folder-Level Script pour Adobe Acrobat Pro +// Module 8 : Verification et installation des mises a jour, depuis le menu +// Acrobat lui-meme (pas besoin de relancer un installeur externe pour les +// mises a jour ulterieures ; l'installeur externe ne sert plus qu'au tout +// premier deploiement). +// +// Depend de Imposition-00-Core.js et Imposition-00b-Licence.js (reutilise +// CDImp.Licence._lireFluxReponse pour lire les reponses Net.HTTP). +// +// AVERTISSEMENTS TECHNIQUES - a tester dans Acrobat Pro reel : +// - Le parametre cFile de Net.HTTP.request() (telechargement direct vers +// un fichier disque) est suppose exister par analogie avec d'autres +// usages documentes du Network Object, mais n'a pas pu etre verifie ici. +// Si indisponible, ecrire le fichier autrement (ex: lire le flux comme +// pour la licence, puis l'ecrire avec un mecanisme de fichier - a +// determiner selon les API reellement exposees par votre version +// d'Acrobat). +// - L'enumeration des dossiers Acrobat installes evite volontairement +// l'objet `Enumerator` (specifique a JScript/WSH, probablement absent du +// moteur JS d'Acrobat) : on teste une liste de noms de version connus +// via FolderExists() plutot que d'enumerer dynamiquement le contenu du +// dossier %APPDATA%\Adobe\Acrobat. Completer CONFIG.versionsConnues si +// une version recente n'y figure pas. +// --------------------------------------------------------------------------- + +if (typeof CDImp === "undefined") { + throw new Error("Imposition-08-MiseAJour.js : CDImp.Core doit etre charge avant ce fichier."); +} + +CDImp.MiseAJour = CDImp.MiseAJour || {}; + +CDImp.MiseAJour.CONFIG = { + urlBaseRaw: "https://git.copydev.fr/jules/copydev-imposing-tool/raw/branch/master/acrobat-plugin/", + fichierVersion: "version.txt", + dossierSrc: "src/", + fichiers: [ + "Imposition-00-Core.js", + "Imposition-00b-Licence.js", + "Imposition-01-UI.js", + "Imposition-02-Livret.js", + "Imposition-03-NUp.js", + "Imposition-04-Decoupe.js", + "Imposition-05-Marges.js", + "Imposition-06-Reperes.js", + "Imposition-07-Auto.js", + "Imposition-08-MiseAJour.js" + ], + versionsConnues: ["DC", "2024", "2023", "2022", "2021", "2020", "11.0"] +}; + +// ----------------------------------------------------------------------- +// Comparaison de versions "x.y.z" +// ----------------------------------------------------------------------- +/** + * @returns {Number} 1 si b > a, -1 si b < a, 0 si egales + */ +CDImp.MiseAJour._comparerVersions = function (a, b) { + var pa = String(a).split(".").map(Number); + var pb = String(b).split(".").map(Number); + var n = Math.max(pa.length, pb.length); + for (var i = 0; i < n; i++) { + var va = pa[i] || 0; + var vb = pb[i] || 0; + if (vb > va) { return 1; } + if (vb < va) { return -1; } + } + return 0; +}; + +// ----------------------------------------------------------------------- +// Detection des dossiers JavaScripts d'Acrobat installes +// ----------------------------------------------------------------------- +CDImp.MiseAJour._trouverDossiersJavaScripts = function () { + var dossiers = []; + try { + var shell = new ActiveXObject("WScript.Shell"); + var fso = new ActiveXObject("Scripting.FileSystemObject"); + var racine = shell.ExpandEnvironmentStrings("%APPDATA%") + "\\Adobe\\Acrobat"; + + for (var i = 0; i < CDImp.MiseAJour.CONFIG.versionsConnues.length; i++) { + var dossierVersion = racine + "\\" + CDImp.MiseAJour.CONFIG.versionsConnues[i]; + if (fso.FolderExists(dossierVersion)) { + var dossierJS = dossierVersion + "\\JavaScripts"; + if (!fso.FolderExists(dossierJS)) { + fso.CreateFolder(dossierJS); + } + dossiers.push(dossierJS); + } + } + } catch (e) { + // ActiveXObject indisponible : on ne peut pas detecter les dossiers + // automatiquement (cas hors Windows, ou scripts non-privilegies). + } + return dossiers; +}; + +// ----------------------------------------------------------------------- +// Requete HTTP GET -> texte (reutilise la lecture de flux de Licence.js) +// ----------------------------------------------------------------------- +CDImp.MiseAJour._telechargerTexte = function (url) { + var resultat = { erreur: null, texte: null }; + try { + Net.HTTP.request({ + cVerb: "GET", + cURL: url, + oHandler: { + response: function (msgStream, status) { + if (status && status >= 400) { + resultat.erreur = "HTTP " + status; + } else { + resultat.texte = CDImp.Licence._lireFluxReponse(msgStream); + } + }, + error: function (msg, err) { + resultat.erreur = (err || msg || "Erreur reseau inconnue").toString(); + } + }, + bAsync: false + }); + } catch (e) { + resultat.erreur = e.toString(); + } + return resultat; +}; + +/** + * Telecharge url directement vers le fichier cheminDest (ecrase si present). + */ +CDImp.MiseAJour._telechargerVersFichier = function (url, cheminDest) { + var resultat = { erreur: null }; + try { + Net.HTTP.request({ + cVerb: "GET", + cURL: url, + cFile: cheminDest, + oHandler: { + response: function (msgStream, status) { + if (status && status >= 400) { + resultat.erreur = "HTTP " + status; + } + }, + error: function (msg, err) { + resultat.erreur = (err || msg || "Erreur reseau inconnue").toString(); + } + }, + bAsync: false + }); + } catch (e) { + resultat.erreur = e.toString(); + } + return resultat; +}; + +// ----------------------------------------------------------------------- +// Point d'entree : verifie puis propose d'installer la mise a jour +// ----------------------------------------------------------------------- +CDImp.MiseAJour.verifier = function () { + var reponse = CDImp.MiseAJour._telechargerTexte( + CDImp.MiseAJour.CONFIG.urlBaseRaw + CDImp.MiseAJour.CONFIG.fichierVersion); + + if (reponse.erreur || !reponse.texte) { + CDImp.Util.erreur("Impossible de verifier les mises a jour (reseau indisponible ou serveur inaccessible) :\n" + (reponse.erreur || "")); + return; + } + + var versionDistante = reponse.texte.replace(/[\r\n\s]+/g, ""); + var comparaison = CDImp.MiseAJour._comparerVersions(CDImp.VERSION, versionDistante); + + if (comparaison <= 0) { + CDImp.Util.info("Vous avez deja la derniere version (v" + CDImp.VERSION + ")."); + return; + } + + var confirmer = app.alert({ + cMsg: "Une mise a jour est disponible : v" + versionDistante + " (vous avez v" + CDImp.VERSION + ").\nInstaller maintenant ?", + cTitle: "Mise a jour disponible", + nIcon: 2, // question + nType: 2 // Oui/Non + }); + if (confirmer !== 4) { // 4 = "Oui" pour nType 2 dans Acrobat JS + return; + } + + var dossiers = CDImp.MiseAJour._trouverDossiersJavaScripts(); + if (dossiers.length === 0) { + CDImp.Util.erreur("Aucun dossier JavaScripts d'Acrobat detecte automatiquement.\nMise a jour annulee : utilisez l'installeur externe si besoin."); + return; + } + + var erreurs = []; + CDImp.Util.avecPrivileges(function () { + for (var d = 0; d < dossiers.length; d++) { + for (var f = 0; f < CDImp.MiseAJour.CONFIG.fichiers.length; f++) { + var nomFichier = CDImp.MiseAJour.CONFIG.fichiers[f]; + var url = CDImp.MiseAJour.CONFIG.urlBaseRaw + CDImp.MiseAJour.CONFIG.dossierSrc + nomFichier; + var cheminDest = dossiers[d] + "\\" + nomFichier; + var resultatTelechargement = CDImp.MiseAJour._telechargerVersFichier(url, cheminDest); + if (resultatTelechargement.erreur) { + erreurs.push(nomFichier + " (" + dossiers[d] + ") : " + resultatTelechargement.erreur); + } + } + } + }); + + if (erreurs.length > 0) { + CDImp.Util.erreur("Mise a jour partielle, erreurs sur " + erreurs.length + " fichier(s) :\n" + erreurs.join("\n")); + } else { + CDImp.Util.info("Mise a jour vers v" + versionDistante + " installee avec succes.\nRedemarrez Acrobat Pro pour l'appliquer."); + } +}; + +// ----------------------------------------------------------------------- +// Entree de menu "Verifier les mises a jour..." +// ----------------------------------------------------------------------- +CDImp.Util.avecPrivileges(function () { + try { + app.addMenuItem({ + cName: "CDImpVerifierMAJ", + cParent: "ImpositionPro", + cExec: "CDImp.MiseAJour.verifier();", + nPos: 2 + }); + } catch (e) { + // Item deja present (rechargement de script) : ignore. + } +}); diff --git a/acrobat-plugin/version.txt b/acrobat-plugin/version.txt new file mode 100755 index 0000000..3eefcb9 --- /dev/null +++ b/acrobat-plugin/version.txt @@ -0,0 +1 @@ +1.0.0