eu.irreality.age.SwingAetheriaGameLoaderInterface.java Source code

Java tutorial

Introduction

Here is the source code for eu.irreality.age.SwingAetheriaGameLoaderInterface.java

Source

/*
 * (c) 2000-2009 Carlos Gmez Rodrguez, todos los derechos reservados / all rights reserved.
 * Licencia en license/bsd.txt / License in license/bsd.txt
 */
package eu.irreality.age;

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyVetoException;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.filechooser.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.dom.*;
import org.xml.sax.*;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.w3c.dom.*;

import eu.irreality.age.filemanagement.Paths;
import eu.irreality.age.server.ServerHandler;
import eu.irreality.age.server.ServerLogWindow;
import eu.irreality.age.swing.mdi.MDIMenuBar;
import eu.irreality.age.swing.mdi.SwingAetheriaGUI;
import eu.irreality.age.swing.sdi.SwingSDIInterface;

import javax.xml.parsers.*;

/*class SplashWindow extends Window {
Image splashIm;
    
SplashWindow(Frame parent, Image splashIm) {
    super(parent);
    this.splashIm = splashIm;
    setSize(splashIm.getWidth(null),splashIm.getHeight(null));
    
    // Center the window
    Dimension screenDim = 
         Toolkit.getDefaultToolkit().getScreenSize();
    Rectangle winDim = getBounds();
    setLocation((screenDim.width - winDim.width) / 2,
  (screenDim.height - winDim.height) / 2);
    setVisible(true);
}
    
public void paint(Graphics g) {
   if (splashIm != null) {
       g.drawImage(splashIm,0,0,this);
   }
}
}
 */

//this runs the GUI (but doesn't represent the GUI)
public class SwingAetheriaGameLoaderInterface {

    public static Font font;

    public static Font getFont() {
        if (font == null)
            loadFont();
        return font;
    }

    public static void loadFont() {

        //cargar configuracin del ini

        String fontName = "Courier New";
        int fontSize = 12;
        try {
            BufferedReader iniReader = new BufferedReader(
                    Utility.getBestInputStreamReader(new FileInputStream("age.cfg")));
            String linea;
            for (int line = 1; line < 100; line++) {
                linea = iniReader.readLine();
                if (linea != null) {
                    //System.out.println("Linea " + linea );
                    String codigo = StringMethods.getTok(linea, 1, '=').trim().toLowerCase();
                    if (codigo.equals("font name")) {
                        //System.out.println("Nombre: " + StringMethods.getTok(linea,2,'=').trim() );
                        fontName = StringMethods.getTok(linea, 2, '=').trim();
                    } else if (codigo.equals("font size")) {
                        fontSize = Integer.parseInt(StringMethods.getTok(linea, 2, '=').trim());
                    }
                }
            }
        }
        //las excepciones nos la sudan porque hay valores por defecto
        catch (FileNotFoundException fnfe) {
            ;
        } catch (NumberFormatException nfe) {
            ;
        } catch (IOException ioe) {
            ;
        } catch (SecurityException se) //applet mode
        {
            ;
        }
        Font[] fuentes = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
        Font fuenteElegida;
        for (int f = 0; f < fuentes.length; f++) {
            if (fuentes[f].getFontName().equalsIgnoreCase(fontName)) {
                SwingAetheriaGameLoaderInterface.font = fuentes[f].deriveFont((float) fontSize);
                break;
            }
            //System.out.println("Fuente: " + fuentes[f]);
        }

        //System.err.println("He seleccionado mi fuente, y es: " + SwingAetheriaGameLoaderInterface.font  );

        //font not selected? be less picky
        if (SwingAetheriaGameLoaderInterface.font == null) {
            String[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
            Arrays.sort(fonts);
            if (Arrays.binarySearch(fonts, "Courier New") >= 0) {
                SwingAetheriaGameLoaderInterface.font = new Font("Courier New", Font.PLAIN, 12);
            } else if (Arrays.binarySearch(fonts, "Courier") >= 0) {
                SwingAetheriaGameLoaderInterface.font = new Font("Courier", Font.PLAIN, 12);
            } else if (Arrays.binarySearch(fonts, "Monospaced") >= 0) {
                SwingAetheriaGameLoaderInterface.font = new Font("Monospaced", Font.PLAIN, 13);
            }
        }

        //still not selected? well, in that case just default to font 0
        if (SwingAetheriaGameLoaderInterface.font == null)
            SwingAetheriaGameLoaderInterface.font = fuentes[0].deriveFont((float) fontSize);
    }

    public static void setStandalone(boolean standalone) {
        /*
        if ( standalone == true )
        {
           //obsolete
           SwingAetheriaGUI.getInstance().setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
           //this:
           SwingAetheriaGUI.getInstance().removeWindowListener ( SwingAetheriaGUI.nonStandaloneWindowListener );
           SwingAetheriaGUI.getInstance().addWindowListener ( SwingAetheriaGUI.standaloneWindowListener );
            
        }
        else
        {
           //obsolete
           SwingAetheriaGUI.getInstance().setDefaultCloseOperation( JFrame.HIDE_ON_CLOSE );
           //this:
           SwingAetheriaGUI.getInstance().removeWindowListener ( SwingAetheriaGUI.standaloneWindowListener );
           SwingAetheriaGUI.getInstance().addWindowListener ( SwingAetheriaGUI.nonStandaloneWindowListener );
        }
        */
        SwingAetheriaGUI.getInstance().setStandalone(standalone);
    }

    public static void showIfAlreadyOpen() {
        if (SwingAetheriaGUI.getInstance() != null) {
            System.err.println("Showing previous instance...");
            SwingAetheriaGUI.getInstance().setVisible(true);
            System.err.flush();
        }
    }

    public static void setLookAndFeel() {
        try {

            boolean setLAF = true;

            setLAF = false; //pasamos del native look and feel.

            //check java version and native look and feel: seems that GTK look and feel is broken for versions < 1.6

            if (UIManager.getSystemLookAndFeelClassName().indexOf("gtk") >= 0) {
                String javaVersion = System.getProperty("java.version");
                StringTokenizer st = new StringTokenizer(javaVersion, ".-_");
                int firstNum;
                int secondNum;
                try {
                    firstNum = Integer.valueOf(st.nextToken()).intValue();
                    secondNum = Integer.valueOf(st.nextToken()).intValue();

                    /*
                    if ( firstNum <= 1 && secondNum <= 5 )
                       setLAF = false;
                    */
                    //don't use GTK l&f at all
                    setLAF = false;
                } catch (Exception exc) {
                    ; //version unreadable: bah, set the look and feel and pray.
                }

            }

            if (setLAF) {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            }

        } catch (Exception ulafe) {
            ulafe.printStackTrace();
        }
    }

    public static void main(String[] args) {

        if (args.length > 0) {
            //parse command line

            Option sdi = new Option("sdi", "use single-document interface");
            Option worldFile = OptionBuilder.withArgName("file").hasArg()
                    .withDescription("The world file or URL to play").withLongOpt("worldfile").create("w");
            /*
            Option worldUrl = OptionBuilder.withArgName( "url" )
               .hasArg()
               .withDescription(  "The world URL to play" )
               .create( "worldurl" );   */
            Option logFile = OptionBuilder.withArgName("file").hasArg()
                    .withDescription("Log file to load the game from (requires a world file)")
                    .withLongOpt("logfile").create("l");
            Option stateFile = OptionBuilder.withArgName("file").hasArg()
                    .withDescription("State file to load the game from (requires a world file)")
                    .withLongOpt("statefile").create("s");
            Option errorLog = OptionBuilder.withArgName("errorlog").hasArg()
                    .withDescription("A file to append the error output to").withLongOpt("errorlog").create("e");

            Option saveDir = OptionBuilder.withArgName("pathToDir").hasArg()
                    .withDescription("Path to the directory where saves will be stored by default")
                    .withLongOpt("savedir").create("d");

            Options options = new Options();

            options.addOption(sdi);
            options.addOption(worldFile);
            //options.addOption( worldUrl );
            options.addOption(logFile);
            options.addOption(stateFile);
            options.addOption(errorLog);
            options.addOption(saveDir);

            CommandLineParser parser = new GnuParser();
            try {
                // parse the command line arguments
                CommandLine line = parser.parse(options, args);

                String desiredWorldFile = null;
                //String desiredWorldUrl = null;
                String desiredLogFile = null;
                String desiredStateFile = null;

                String errorLogFile = null;

                String saveDirPath = null;

                if (line.hasOption("e"))
                    errorLogFile = line.getOptionValue("e");

                if (line.hasOption("s"))
                    desiredStateFile = line.getOptionValue("s");
                if (line.hasOption("l"))
                    desiredLogFile = line.getOptionValue("l");
                if (line.hasOption("w"))
                    desiredWorldFile = line.getOptionValue("w");

                if (line.hasOption("d"))
                    saveDirPath = line.getOptionValue("sd");

                //first, redirect std. error if necessary
                if (errorLogFile != null)
                    redirectStandardError(errorLogFile);

                //set save dir if requested
                if (saveDirPath != null) {
                    Paths.setSaveDir(saveDirPath);
                }

                //if ( line.hasOption("worldurl") ) desiredWorldFile = line.getOptionValue("worldurl");
                if (desiredWorldFile == null /*&& desiredWorldUrl == null*/ && line.getArgs().length > 0)
                    desiredWorldFile = line.getArgs()[0];
                boolean desiredSdi = line.hasOption("sdi"); //Boolean.valueOf( line.getOptionValue("sdi") ).booleanValue();       

                if (SwingAetheriaGUI.getInstance() != null && !desiredSdi) {
                    //abrir un fichero en una instancia de AGE ya abierta
                    System.out.println("Opening file in existing instance...");
                    createLocalGameFromFile(desiredWorldFile, true, desiredLogFile != null, desiredLogFile,
                            desiredStateFile);
                    return;
                } else {

                    System.out.println("Working directory: " + Paths.getWorkingDirectory());
                    setLookAndFeel();

                    if (!desiredSdi) {
                        new SwingAetheriaGUI();
                        if (desiredWorldFile != null)
                            createLocalGameFromFile(desiredWorldFile, !desiredSdi, desiredLogFile != null,
                                    desiredLogFile, desiredStateFile);
                    } else {
                        if (desiredWorldFile != null)
                            createLocalGameFromFile(desiredWorldFile, !desiredSdi, desiredLogFile != null,
                                    desiredLogFile, desiredStateFile);
                        else
                            SwingSDIInterface.main(args); //args does nothing in this case, really
                    }
                }

            } catch (ParseException exp) {
                // oops, something went wrong
                System.err.println("Parsing failed.  Reason: " + exp.getMessage());
            }

        } else {
            setLookAndFeel();
            new SwingAetheriaGUI();
        }

        /*
        if ( args.length > 0 && SwingAetheriaGUI.getInstance() != null )
        {
           //abrir un fichero en una instancia de AGE ya abierta
           System.out.println("Opening file in existing instance...");
           createLocalGameFromFile(args[0]);
           return;
        }
        */

        /*
        if ( args.length > 0 )
        {
           System.out.println("Opening file in newly created instance...");
           createLocalGameFromFile(args[0]);
        }
        */

    }

    public static void redirectStandardError(String file) {
        File f = new File(file);
        if (!f.exists()) {
            if (!f.getParentFile().exists()) {
                if (!f.getParentFile().mkdirs()) {
                    System.err.println(
                            "Could not redirect standard error to " + file + ": unable to create directories.");
                    return;
                }
            }
        }
        //{f.getParentFile().exists()
        try {
            System.setErr(new PrintStream(new FileOutputStream(f, true)));
            System.err.println("[" + new Date() + "]");
        } catch (FileNotFoundException e) {
            System.err.println("Could not redirect standard error to " + file + ":");
            e.printStackTrace();
        }
    }

    /**
     * This is a simple game creation function prepared to call from the outside without needing any data except for the game file.
     * This can be used for the PUCK IDE's "go" button.
     *
     */
    public static void createLocalGameFromFile(String file) {
        createLocalGameFromFile(file, true);

    }

    public static void createLocalGameFromFile(String file, boolean mdi) {
        if (mdi)
            new SwingAetheriaGameLoader(file, SwingAetheriaGUI.getInstance().getPanel(), false, null, null, false);
        else
            new SwingSDIInterface(file, false, null, null);
    }

    public static void createLocalGameFromFile(String file, boolean mdi, boolean usarLog, String logFile,
            String stateFile) {
        if (mdi)
            new SwingAetheriaGameLoader(file, SwingAetheriaGUI.getInstance().getPanel(), usarLog, logFile,
                    stateFile, false);
        else {
            SwingAetheriaGameLoaderInterface.loadFont();
            new SwingSDIInterface(file, usarLog, logFile, stateFile);
        }
    }

}