/* Jaxe - Editeur XML en Java Copyright (C) 2002 Observatoire de Paris-Meudon Ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier conformément aux dispositions de la Licence Publique Générale GNU, telle que publiée par la Free Software Foundation ; version 2 de la licence, ou encore (à votre choix) toute version ultérieure. Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE ; sans même la garantie implicite de COMMERCIALISATION ou D'ADAPTATION A UN OBJET PARTICULIER. Pour plus de détail, voir la Licence Publique Générale GNU . Vous devez avoir reçu un exemplaire de la Licence Publique Générale GNU en même temps que ce programme ; si ce n'est pas le cas, écrivez à la Free Software Foundation Inc., 675 Mass Ave, Cambridge, MA 02139, Etats-Unis. */ package jaxe; import java.io.File; import java.util.Vector; import javax.swing.JOptionPane; import jaxe.macjaxe.MacJaxe; import jaxe.macjaxe.MacJaxeFactory; import textbender.recombinant.common.awt.EventQueueX; /** * Classe de départ de Jaxe, avec la gestion des évènements de l'application */ public class Jaxe { // tous les objets Jaxe public static Vector allFrames = new Vector(); //static String newline = System.getProperty("line.separator"); static String newline = "\n"; static String nomFichierCfg; // par défaut pour un nouveau document static MacJaxe mac = null; private static final Object lock = new Object(); static DialogueDepart dlgDepart = null; /** * Nouvel objet identifiant l'application */ public Jaxe(String nomFichierCfg) { this.nomFichierCfg = nomFichierCfg; Preferences.chargerPref(); if (mac == null) { try { mac = MacJaxeFactory.getInstance().buildMacJaxe(); } catch(Exception e) { // TODO better logging? e.printStackTrace(); } } } // dans les 3 méthodes suivantes, jframe indique la fenêtre active // jframe est facultatif, et peut être null // si jframe est spécifié, elle peut être utilisée au lieu d'ouvrir une nouvelle fenêtre /** * Ouverture d'un nouveau document dans une frame particulière, ou dans une nouvelle frame si jframe==null */ public static void nouveau(JaxeFrame jframe) { synchronized (lock) { if (jframe == null || (jframe.doc.modif || jframe.doc.fsave != null)) { jframe = new JaxeFrame(); allFrames.add(jframe); } try { jframe.initNew(nomFichierCfg); } catch (Exception ex) { System.err.println("Java bug 4353673"); ex.printStackTrace(); //JOptionPane.showMessageDialog(jframe, "Java bug 4353673", // "fatal Java bug", JOptionPane.ERROR_MESSAGE); // deuxième chance ! jframe.fermer(true); jframe = new JaxeFrame(); allFrames.add(jframe); jframe.initNew(nomFichierCfg); } } } /** * Dialogue de choix d'une configuration pour créer un nouveau document */ public static void dialogueNouveau(JaxeFrame jframe) { File configdir = new File("config"); int nbconf = 0; String[] lfichiers = configdir.list(); if (lfichiers == null && nomFichierCfg != null) lfichiers = new String[] {nomFichierCfg}; // fall back to default if (lfichiers == null) { System.err.println(JaxeResourceBundle.getRB().getString("erreur.DossierConfig")); return; } for (int i=0; i=0; i--) { // doClose modifie allFrames JaxeFrame ji = (JaxeFrame)allFrames.get(i); if (!ji.fermer(true)) vafermer = false; } if (vafermer) System.exit(0); } /** * Dialogue "à propos" de l'application */ public static void aPropos() { JaxeFrame jframe = premiereFrame(); if (jframe != null) jframe.getJaxeMenuBar().doAbout(); else System.err.println("pas de fenêtre, pas de dialogue !"); } /** * Dialogue des préférences de l'application */ public static void preferences() { JaxeFrame jframe = premiereFrame(); if (jframe != null) jframe.getJaxeMenuBar().doPreferences(); else System.err.println("pas de fenêtre, pas de dialogue !"); } /** * Renvoit la première fenêtre ouverte (pas forcément celle au premier plan) */ public static JaxeFrame premiereFrame() { if (allFrames.size() == 0) return(null); return((JaxeFrame)allFrames.get(0)); } /** * Méthode principale */ public static void main(final String args[]) { EventQueueX.invokeNowOrWait( new Runnable() { public final void run() { // in AWT event dispatch thread // <<< Common.i(); // thus instantiating it early, for sake of its UncaughtExceptionHandler if (System.getProperty("jaxe.config") != null) { // lancement sans argument new Jaxe(System.getProperty("jaxe.config")); if (args.length == 1) { JaxeFrame jframe = new JaxeFrame(); Jaxe.allFrames.add(jframe); jframe.ouvrir(args[0]); } else nouveau(null); } else if (args.length == 1 && args[0].endsWith("cfg.xml")) { // ouverture config new Jaxe(args[0]); nouveau(null); } else if (args.length == 2 && args[1].endsWith("cfg.xml")) { // ouverture fichier avec config new Jaxe(args[1]); ouvrirAvecConf(new File(args[0]), new File(args[1]), null); } else { // ouverture d'un fichier sans préciser la config File dir = new File("config"); if (!dir.exists()) { JOptionPane.showMessageDialog(null, JaxeResourceBundle.getRB().getString("erreur.DossierConfig"), JaxeResourceBundle.getRB().getString("config.ErreurLancement"), JOptionPane.ERROR_MESSAGE); System.exit(1); } int nbconf = 0; File[] liste = dir.listFiles(); for (int i=0; i 0) ouvrir(new File(args[0]), null); else if (nbconf > 1) { synchronized (lock) { // synchronisation avec MacJaxe.ouvrir if (allFrames.size() == 0) dialogueDepart(); } } else if (nbconf == 1) nouveau(null); } // >>> } }); } }