import java.io.File;

import kdu_jni.Kdu_message;
import kdu_jni.Kdu_message_formatter;
import kdu_jni.Kdu_global;
import kdu_jni.KduException;


class KduSysMessage extends Kdu_message
{
  private boolean raiseException;

  public KduSysMessage(boolean raiseException)
  {
    this.raiseException = raiseException;
  }

  public void Put_text(String text)
  {
    System.out.print(text);
  }

  public void Flush(boolean endOfMessage) throws KduException
  {
    if(endOfMessage && raiseException) throw new KduException("Kakadu message error");
  }
}

public class JP2Viewer
{
  public static void main(String[] args)
  {
    // Cargamos la libreria Kakadu
    // Es algo superfluo, ya que todas las clases Java del sistema Kakadu intentan cargar la libreria,
    // pero con este codigo mejoramos el mensaje de error, poco aclaratorio
    try {
      System.loadLibrary("kdu_jni");
    } catch(UnsatisfiedLinkError ex) {
      System.out.println("");
      System.out.println("Error: No se ha podido cargar la libreria Kakadu.");
      System.out.println("   - Sistemas Windows: kdu_jni.dll y kdu_v40R.dll");
      System.out.println("   - Sistemas Unix:    kdu_jni.so  y kdu_v40.so");
      System.out.println("");
      System.exit(-1);
    }

    try {
      // Optimizamos el tratamiento de los mensajes del sistema Kakadu, de forma que
      // los warnings aparezcan (que por defecto no lo hacen) y que los mensajes de error
      // lancen ademas una excepcion.
      Kdu_global.Kdu_customize_warnings(
        new Kdu_message_formatter(new KduSysMessage(false), 79)
      );

      Kdu_global.Kdu_customize_errors(
        new Kdu_message_formatter(new KduSysMessage(true), 79)
      );

      // Cargamos los recursos utilizados por la aplicacion
      String baseAddress = (new File(".")).toURL().toString();
      ProyectoProperties.baseAddress = baseAddress.substring(0, baseAddress.length() - 2);
      ProyectoProperties.read();

      // Creamos la ventana principal
      JP2ViewerWindow imageWindow = new JP2ViewerWindow();

    } catch(Exception ex) { ex.printStackTrace();}
  }
}