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
|
CDImp.VERSION = "1.0.0";
|
||||||
// panneau de controle principal (boite de dialogue maitresse, voir Module 1).
|
|
||||||
// La creation/modification de menus est une operation privilegiee.
|
// -----------------------------------------------------------------------
|
||||||
|
// 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 () {
|
CDImp.Util.avecPrivileges(function () {
|
||||||
try {
|
try {
|
||||||
app.addMenuItem({
|
app.addSubMenu({
|
||||||
cName: "CDImpRacine",
|
cName: "ImpositionPro",
|
||||||
cParent: "Edit", // accroche dans le menu Edition (peut etre adapte)
|
cParent: "Edit", // accroche dans le menu Edition (peut etre adapte)
|
||||||
cExec: "CDImp.UI.ouvrirPanneauPrincipal(this);",
|
cUser: "Imposition Pro",
|
||||||
cEnable: "event.rc = (CDImp.UI != undefined);",
|
|
||||||
nPos: -1
|
nPos: -1
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// Si le menu existe deja (rechargement de script), on ignore
|
// Sous-menu deja present (rechargement de script) : ignore.
|
||||||
// silencieusement l'erreur de doublon.
|
}
|
||||||
|
|
||||||
|
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 {
|
try {
|
||||||
app.addMenuItem({
|
app.addMenuItem({
|
||||||
cName: "CDImpGererLicence",
|
cName: "CDImpGererLicence",
|
||||||
cParent: "Edit",
|
cParent: "ImpositionPro",
|
||||||
cExec: "CDImp.Licence.gererCle();",
|
cExec: "CDImp.Licence.gererCle();",
|
||||||
cEnable: "event.rc = (CDImp.Licence != undefined);",
|
cEnable: "event.rc = (CDImp.Licence != undefined);",
|
||||||
nPos: -1
|
nPos: 1
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// menu deja present (rechargement de script) : ignore
|
// 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.");
|
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
|
* Point d'entree principal : ouvre le panneau de controle, puis route vers
|
||||||
* le module choisi par l'utilisateur. Le document actif (celui depuis lequel
|
* 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.
|
// 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.
|
||||||
|
}
|
||||||
|
});
|
||||||
1
acrobat-plugin/version.txt
Executable file
1
acrobat-plugin/version.txt
Executable file
@@ -0,0 +1 @@
|
|||||||
|
1.0.0
|
||||||
Reference in New Issue
Block a user