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.
This commit is contained in:
@@ -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.
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
}
|
||||
});
|
||||
|
||||
228
acrobat-plugin/src/Imposition-08-MiseAJour.js
Executable file
228
acrobat-plugin/src/Imposition-08-MiseAJour.js
Executable file
@@ -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.
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user