// Path: src/main/java/yk/senjin/LoadTickUnload.java
// public interface LoadTickUnload<T> {
//     void onLoad(T watch);
//     void onTick(T watch, float dt);
//     void onUnload();
// }
// 
// Path: src/main/java/yk/senjin/TickingWatcher.java
// public class TickingWatcher<T> {
//     public ClassChangeWatcher<LoadTickUnload<T>> watcher;
// 
//     public TickingWatcher(String path, T t, LoadTickUnload<T> o, Class... otherClasses) {
//         watcher = ClassChangeWatcher.watch(path, o, otherClasses);
//         watcher.dst.onLoad(t);
//     }
// 
//     public void tick(T t, float dt) {
//         LoadTickUnload<T> old = watcher.dst;
//         if (watcher.reload()) {
//             old.onUnload();
//             watcher.dst.onLoad(t);
//         }
//         watcher.dst.onTick(t, dt);
//     }
// 
// }


import yk.jcommon.utils.Threads;
import yk.senjin.LoadTickUnload;
import yk.senjin.TickingWatcher;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
package yk.senjin.education;



/**
 * Created with IntelliJ IDEA.
 * User: yuri
 * Date: 20/11/15
 * Time: 12:26
 */
public class Viewer extends JPanel implements MouseListener, MouseMotionListener {
    public int w = 640;
    public int h = 480;
    public BufferedImage result;
    public final List<JLabel> labels = new ArrayList<>();

    public TickingWatcher<Viewer> newWatcher;

    public Viewer(LoadTickUnload<Viewer> ltu, int w, int h) {
        this("target/classes/", ltu, w, h);
    }

// Path: src/main/java/yk/senjin/LoadTickUnload.java
// public interface LoadTickUnload<T> {
//     void onLoad(T watch);
//     void onTick(T watch, float dt);
//     void onUnload();
// }
// 
// Path: src/main/java/yk/senjin/TickingWatcher.java
// public class TickingWatcher<T> {
//     public ClassChangeWatcher<LoadTickUnload<T>> watcher;
// 
//     public TickingWatcher(String path, T t, LoadTickUnload<T> o, Class... otherClasses) {
//         watcher = ClassChangeWatcher.watch(path, o, otherClasses);
//         watcher.dst.onLoad(t);
//     }
// 
//     public void tick(T t, float dt) {
//         LoadTickUnload<T> old = watcher.dst;
//         if (watcher.reload()) {
//             old.onUnload();
//             watcher.dst.onLoad(t);
//         }
//         watcher.dst.onTick(t, dt);
//     }
// 
// }


// Path: src/main/java/yk/senjin/education/Viewer.java
import yk.jcommon.utils.Threads;
import yk.senjin.LoadTickUnload;
import yk.senjin.TickingWatcher;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

package yk.senjin.education;



/**
 * Created with IntelliJ IDEA.
 * User: yuri
 * Date: 20/11/15
 * Time: 12:26
 */
public class Viewer extends JPanel implements MouseListener, MouseMotionListener {
    public int w = 640;
    public int h = 480;
    public BufferedImage result;
    public final List<JLabel> labels = new ArrayList<>();

    public TickingWatcher<Viewer> newWatcher;

    public Viewer(LoadTickUnload<Viewer> ltu, int w, int h) {
        this("target/classes/", ltu, w, h);
    }

    public Viewer(String path, LoadTickUnload<Viewer> ltu, int w, int h) {