// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/dev/PageManager.java
// public interface PageManager extends ResourceManager<PageManager, PageResource> {
// 
//     PageResource getScreen();
// 
//     int getWidth();
// 
//     int getHeight();
// 
//     PageManager setSize(int w, int h);
// 
//     @Override
//     default String getType() {
//         return "page";
//     }
// }
// 
// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/dev/PageResource.java
// public interface PageResource extends Resource, Drawable {
//     @Override
//     PageManager getManager();
// 
//     PageResource draw(Drawable o, int dx, int dy, int w, int h, int x, int y, int mode);
// 
//     /**
//      * Display on screen
//      */
//     PageResource display();
// 
//     PageResource draw(PageResource resource);
// 
//     PageResource fill(int x, int y, int w, int h, int rgb);
// 
//     PageResource pixel(int x, int y, int rgb);
// 
//     int pixel(int x, int y);
// 
//     /**
//      * Clear page, fill with pen color, reset locate
//      */
//     PageResource clear();
// 
//     PageResource draw(PageResource resource, int x, int y);
// 
//     PageResource draw(PageResource resource, int x, int y, int w, int h, int cx, int cy);
// 
//     PageResource pen(int width, int style, int rgb);
// 
//     PageResource circle(int cx, int cy, int r);
// 
//     PageResource rectangle(int left, int top, int right, int bottom);
// 
//     PageResource line(int x, int y);
// 
//     PageResource move(int x, int y);
// 
//     /**
//      * Position of cursor in font size column, start from 1
//      */
//     PageResource locate(int row, int column);
// 
//     /**
//      * Position of cursor in pixel
//      */
//     PageResource cursor(int row, int column);
// 
//     PageResource draw(String text);
// 
//     /**
//      * Change the font
//      */
//     PageResource font(int font);
// 
//     /**
//      * Set the font style
//      */
//     PageResource font(int frontColor, int backColor, int frame);
// 
//     /**
//      * @see DeviceConstants.BackgroundMode
//      */
//     PageResource setBackgroundMode(int mode);
// }
// 
// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/exception/ExecutionException.java
// public class ExecutionException extends RuntimeException {
//     private VM vm;
// 
//     public ExecutionException() {
//     }
// 
//     public ExecutionException(String message) {
//         super(message);
//     }
// 
//     public ExecutionException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public ExecutionException(Throwable cause) {
//         super(cause);
//     }
// 
//     public VM getVm() {
//         return vm;
//     }
// 
//     public ExecutionException setVm(VM vm) {
//         this.vm = vm;
//         return this;
//     }
// }
// 
// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/exception/ResourceMissingException.java
// public class ResourceMissingException extends ExecutionException {
//     private String type;
//     private int handler;
// 
//     public ResourceMissingException(String message, String type, int handler) {
//         super(message);
//         this.type = type;
//         this.handler = handler;
//     }
// 
//     public ResourceMissingException(String type, int handler) {
//         this.type = type;
//         this.handler = handler;
//     }
// 
//     @Override
//     public String toString() {
//         return MoreObjects.toStringHelper(this)
//             .add("type", type)
//             .add("handler", handler)
//             .add("message", getMessage())
//             .toString();
//     }
// }
// 
// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/vm/event/ResetEvent.java
// public class ResetEvent extends EventObject {
//     public ResetEvent(VM source) {
//         super(source);
//     }
// }
// 
// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/vm/event/VmTestEvent.java
// public class VmTestEvent extends EventObject {
//     public VmTestEvent(VM source) {
//         super(source);
//     }
// }


import com.google.common.collect.Maps;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import me.wener.bbvm.dev.PageManager;
import me.wener.bbvm.dev.PageResource;
import me.wener.bbvm.exception.ExecutionException;
import me.wener.bbvm.exception.ResourceMissingException;
import me.wener.bbvm.vm.event.ResetEvent;
import me.wener.bbvm.vm.event.VmTestEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.imageio.ImageIO;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.io.File;
import java.util.Map;
import static com.google.common.base.Preconditions.checkState;
package me.wener.bbvm.dev.swing;




/**
 * @author wener
 * @since 15/12/26
 */
@Singleton
class SwingPageManager implements PageManager {
    private final static Logger log = LoggerFactory.getLogger(PageManager.class);
    private final Map<Integer, SwingPage> resources = Maps.newConcurrentMap();
    private int handler = 0;
    // TODO Need to reuse the page handler ?
//        private NavigableSet<Integer> handlers;
    private int width = 240, height = 320;

    public SwingPageManager() {
        // Create a default screen
        SwingPage page = new SwingPage(-1, this);
        resources.put(-1, page);
    }

    @Override
    public PageManager reset() {
// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/dev/PageManager.java
// public interface PageManager extends ResourceManager<PageManager, PageResource> {
// 
//     PageResource getScreen();
// 
//     int getWidth();
// 
//     int getHeight();
// 
//     PageManager setSize(int w, int h);
// 
//     @Override
//     default String getType() {
//         return "page";
//     }
// }
// 
// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/dev/PageResource.java
// public interface PageResource extends Resource, Drawable {
//     @Override
//     PageManager getManager();
// 
//     PageResource draw(Drawable o, int dx, int dy, int w, int h, int x, int y, int mode);
// 
//     /**
//      * Display on screen
//      */
//     PageResource display();
// 
//     PageResource draw(PageResource resource);
// 
//     PageResource fill(int x, int y, int w, int h, int rgb);
// 
//     PageResource pixel(int x, int y, int rgb);
// 
//     int pixel(int x, int y);
// 
//     /**
//      * Clear page, fill with pen color, reset locate
//      */
//     PageResource clear();
// 
//     PageResource draw(PageResource resource, int x, int y);
// 
//     PageResource draw(PageResource resource, int x, int y, int w, int h, int cx, int cy);
// 
//     PageResource pen(int width, int style, int rgb);
// 
//     PageResource circle(int cx, int cy, int r);
// 
//     PageResource rectangle(int left, int top, int right, int bottom);
// 
//     PageResource line(int x, int y);
// 
//     PageResource move(int x, int y);
// 
//     /**
//      * Position of cursor in font size column, start from 1
//      */
//     PageResource locate(int row, int column);
// 
//     /**
//      * Position of cursor in pixel
//      */
//     PageResource cursor(int row, int column);
// 
//     PageResource draw(String text);
// 
//     /**
//      * Change the font
//      */
//     PageResource font(int font);
// 
//     /**
//      * Set the font style
//      */
//     PageResource font(int frontColor, int backColor, int frame);
// 
//     /**
//      * @see DeviceConstants.BackgroundMode
//      */
//     PageResource setBackgroundMode(int mode);
// }
// 
// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/exception/ExecutionException.java
// public class ExecutionException extends RuntimeException {
//     private VM vm;
// 
//     public ExecutionException() {
//     }
// 
//     public ExecutionException(String message) {
//         super(message);
//     }
// 
//     public ExecutionException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public ExecutionException(Throwable cause) {
//         super(cause);
//     }
// 
//     public VM getVm() {
//         return vm;
//     }
// 
//     public ExecutionException setVm(VM vm) {
//         this.vm = vm;
//         return this;
//     }
// }
// 
// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/exception/ResourceMissingException.java
// public class ResourceMissingException extends ExecutionException {
//     private String type;
//     private int handler;
// 
//     public ResourceMissingException(String message, String type, int handler) {
//         super(message);
//         this.type = type;
//         this.handler = handler;
//     }
// 
//     public ResourceMissingException(String type, int handler) {
//         this.type = type;
//         this.handler = handler;
//     }
// 
//     @Override
//     public String toString() {
//         return MoreObjects.toStringHelper(this)
//             .add("type", type)
//             .add("handler", handler)
//             .add("message", getMessage())
//             .toString();
//     }
// }
// 
// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/vm/event/ResetEvent.java
// public class ResetEvent extends EventObject {
//     public ResetEvent(VM source) {
//         super(source);
//     }
// }
// 
// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/vm/event/VmTestEvent.java
// public class VmTestEvent extends EventObject {
//     public VmTestEvent(VM source) {
//         super(source);
//     }
// }


// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/dev/swing/SwingPageManager.java
import com.google.common.collect.Maps;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import me.wener.bbvm.dev.PageManager;
import me.wener.bbvm.dev.PageResource;
import me.wener.bbvm.exception.ExecutionException;
import me.wener.bbvm.exception.ResourceMissingException;
import me.wener.bbvm.vm.event.ResetEvent;
import me.wener.bbvm.vm.event.VmTestEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.imageio.ImageIO;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.io.File;
import java.util.Map;
import static com.google.common.base.Preconditions.checkState;

package me.wener.bbvm.dev.swing;




/**
 * @author wener
 * @since 15/12/26
 */
@Singleton
class SwingPageManager implements PageManager {
    private final static Logger log = LoggerFactory.getLogger(PageManager.class);
    private final Map<Integer, SwingPage> resources = Maps.newConcurrentMap();
    private int handler = 0;
    // TODO Need to reuse the page handler ?
//        private NavigableSet<Integer> handlers;
    private int width = 240, height = 320;

    public SwingPageManager() {
        // Create a default screen
        SwingPage page = new SwingPage(-1, this);
        resources.put(-1, page);
    }

    @Override
    public PageManager reset() {
        log.debug("Reset {} resource", getType());