package hu.elte.inf.pszt.prt.javalib.swingapp;

import java.io.*;
import javax.swing.SwingUtilities;

/** @author lengyel zsolt
 */
public class ElteSwingApp implements Runnable {

public static void main(String[] args) {
  String[] classPath = System.getProperty("java.class.path").split(System.
          getProperty("path.separator"));
  for (String dir : classPath) {
    loadClassesInDirectory(new File(dir), "");
  }
  if (window == null) {
    System.err.println(
            "No ElteJFrame is found. Please inherit a class from ElteJFrame");
  } else {
    startAppWithWindow();
  }
}
private static ElteJFramable window = null;

private static void startAppWithWindow() {
  SwingUtilities.invokeLater(new ElteSwingApp());
}

private static void loadClassesInDirectory(File directory, String packageName) {
  File[] classFiles = directory.listFiles(new FileFilter() {
  @Override
  public boolean accept(File pathname) {
    return pathname.isDirectory() || pathname.getName().endsWith(".class");
  }
  });
  if (classFiles == null) {
    return;
  }
  for (File classFile : classFiles) {
    final String className = classFile.getName();
    if (classFile.isDirectory() && !(className.equals("org") || className.
                                     equals("com"))) {
      loadClassesInDirectory(classFile, packageName.concat(className + "."));
    } else {
      try {
        String classFullName = packageName.concat(
                className.substring(0, className.length() - 6));
        Class<?> classs = ClassLoader.getSystemClassLoader().loadClass(
                classFullName);
        if (classs.getSuperclass() != null && classs.getSuperclass().
                equals(ElteJFrame.class)) {
          try {
            window = (ElteJFramable) classs.newInstance();
            return;
          } catch (InstantiationException | IllegalAccessException ex) {
            System.err.println(ex.getMessage());
          }
        }
      } catch (ClassNotFoundException ex) {
        System.err.println(ex.getMessage());
      }
    }
  }
}

@Override
public void run() {
  window.onCreate();
  window.registerWindowAdapter();
  window.onConfigLoad();
  window.onShow();
}
}
