net.rptools.lib.MD5Key - java examples

Here are the examples of the java api net.rptools.lib.MD5Key taken from open source projects. By voting up you can indicate which examples are most useful and appropriate.

85 Examples 7

19 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Similar to getreplacedet(), but does not block. It will always use the listeners to preplaced the data
 */
public static void getreplacedetAsynchronously(final MD5Key id, final replacedetAvailableListener... listeners) {
    replacedetLoaderThreadPool.submit(new Runnable() {

        public void run() {
            replacedet replacedet = getreplacedet(id);
            // Simplest case, we already have it
            if (replacedet != null) {
                for (replacedetAvailableListener listener : listeners) {
                    listener.replacedetAvailable(id);
                }
                return;
            }
            // Let's get it from the server
            // As a last resort we request the replacedet from the server
            if (replacedet == null && !isreplacedetRequested(id)) {
                requestreplacedetFromServer(id, listeners);
            }
        }
    });
}

19 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Determine if the replacedet manager has the replacedet. This does not tell you if the replacedet is done
 * downloading.
 *
 * @param key
 * @return
 */
public static boolean hasreplacedet(MD5Key key) {
    return replacedetMap.containsKey(key) || replacedetIsInPersistentCache(key) || replacedetHasLocalReference(key);
}

19 View Complete Implementation : Asset.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * The binary representation of an image.
 */
public clreplaced replacedet {

    public static final String DATA_EXTENSION = "data";

    private MD5Key id;

    private String name;

    private String extension;

    private String type = "image";

    @XStreamConverter(replacedetImageConverter.clreplaced)
    private byte[] image;

    protected replacedet() {
    }

    public replacedet(String name, byte[] image) {
        this.image = image;
        this.name = name;
        if (image != null) {
            this.id = new MD5Key(image);
            extension = null;
            getImageExtension();
        }
    }

    public replacedet(String name, BufferedImage image) {
        try {
            this.image = ImageUtil.imageToBytes(image);
        } catch (IOException e) {
            e.printStackTrace();
        }
        this.name = name;
        if (this.image != null) {
            this.id = new MD5Key(this.image);
            extension = null;
            getImageExtension();
        }
    }

    public replacedet(MD5Key id) {
        this.id = id;
    }

    public MD5Key getId() {
        return id;
    }

    public void setId(MD5Key id) {
        this.id = id;
    }

    public byte[] getImage() {
        return image;
    }

    public void setImage(byte[] image) {
        this.image = image;
        extension = null;
        getImageExtension();
    }

    public String getImageExtension() {
        if (extension == null) {
            extension = "";
            try {
                if (image != null && image.length >= 4) {
                    InputStream is = new ByteArrayInputStream(image);
                    ImageInputStream iis = ImageIO.createImageInputStream(is);
                    Iterator<ImageReader> readers = ImageIO.getImageReaders(iis);
                    if (readers.hasNext()) {
                        ImageReader reader = readers.next();
                        reader.setInput(iis);
                        extension = reader.getFormatName().toLowerCase();
                    }
                    // We can store more than images, eg HeroLabData in the form of a HashMap, replacedume this if
                    // an image type can not be established
                    if (extension.isEmpty())
                        extension = DATA_EXTENSION;
                }
            } catch (IOException e) {
                // Can this happen??
                MapTool.showError("IOException?!", e);
            }
        }
        return extension;
    }

    public String getName() {
        return name;
    }

    /**
     * Get the properties of the replacedet and put them in a JSONObject.
     *
     * @return the JSONObject with the properties.
     */
    public JSONObject getProperties() {
        JSONObject properties = new JSONObject();
        properties.put("type", type);
        properties.put("subtype", extension);
        properties.put("id", id.toString());
        properties.put("name", name);
        // wait until loaded, so width/height are correct
        Image img = ImageManager.getImageAndWait(id);
        String status = "loaded";
        if (img == ImageManager.BROKEN_IMAGE) {
            status = "broken";
        } else if (img == ImageManager.TRANSFERING_IMAGE) {
            status = "transferring";
        }
        properties.put("status", status);
        properties.put("width", img.getWidth(null));
        properties.put("height", img.getHeight(null));
        return properties;
    }

    public boolean isTransfering() {
        return replacedetManager.isreplacedetRequested(id);
    }

    public String getType() {
        return type;
    }

    @Override
    public String toString() {
        return id + "/" + name + "(" + (image != null ? image.length : "-") + ")";
    }

    @Override
    public int hashCode() {
        return getId().hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof replacedet)) {
            return false;
        }
        replacedet replacedet = (replacedet) obj;
        return replacedet.getId().equals(getId());
    }
}

19 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Return the replacedet link file, if any
 *
 * @param id MD5 sum of the replacedet
 * @return File The replacedet link file
 */
private static File getreplacedetLinkFile(MD5Key id) {
    return new File(cacheDir.getAbsolutePath() + File.separator + id + ".lnk");
}

19 View Complete Implementation : HeroLabData.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public List<String> getAllImagereplacedetsURLs() {
    List<String> replacedetSet = new ArrayList<String>();
    for (MD5Key replacedetKey : heroImagereplacedets.values()) replacedetSet.add("replacedet://" + replacedetKey.toString());
    return replacedetSet;
}

19 View Complete Implementation : TwoImageBarTokenOverlay.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Token overlay for bar meters.
 *
 * @author Jay
 */
public clreplaced TwoImageBarTokenOverlay extends BarTokenOverlay {

    /**
     * ID of the base image displayed in the overlay.
     */
    private MD5Key bottomreplacedetId;

    /**
     * ID of the top image displayed in the overlay.
     */
    private MD5Key topreplacedetId;

    /**
     * Needed for serialization
     */
    public TwoImageBarTokenOverlay() {
        this(AbstractTokenOverlay.DEFAULT_STATE_NAME, null, null);
    }

    /**
     * Create the complete image overlay.
     *
     * @param name Name of the new token overlay
     * @param theTopreplacedetId Id of the image displayed to show the bar
     * @param theBottomreplacedetId Id of the base image.
     */
    public TwoImageBarTokenOverlay(String name, MD5Key theTopreplacedetId, MD5Key theBottomreplacedetId) {
        super(name);
        topreplacedetId = theTopreplacedetId;
        bottomreplacedetId = theBottomreplacedetId;
    }

    /**
     * @see net.rptools.maptool.client.ui.token.AbstractTokenOverlay#clone()
     */
    @Override
    public Object clone() {
        BarTokenOverlay overlay = new TwoImageBarTokenOverlay(getName(), topreplacedetId, bottomreplacedetId);
        overlay.setOrder(getOrder());
        overlay.setGroup(getGroup());
        overlay.setMouseover(isMouseover());
        overlay.setOpacity(getOpacity());
        overlay.setIncrements(getIncrements());
        overlay.setSide(getSide());
        overlay.setShowGM(isShowGM());
        overlay.setShowOwner(isShowOwner());
        overlay.setShowOthers(isShowOthers());
        return overlay;
    }

    /**
     * @see net.rptools.maptool.client.ui.token.BarTokenOverlay#paintOverlay(java.awt.Graphics2D,
     *     net.rptools.maptool.model.Token, java.awt.Rectangle, double)
     */
    @Override
    public void paintOverlay(Graphics2D g, Token token, Rectangle bounds, double value) {
        // Get the images
        BufferedImage[] images = { ImageManager.getImageAndWait(topreplacedetId), ImageManager.getImageAndWait(bottomreplacedetId) };
        Dimension d = bounds.getSize();
        Dimension size = new Dimension(images[0].getWidth(), images[0].getHeight());
        SwingUtil.constrainTo(size, d.width, d.height);
        // Find the position of the images according to the size and side where they are placed
        int x = 0;
        int y = 0;
        switch(getSide()) {
            case RIGHT:
                x = d.width - size.width;
                break;
            case BOTTOM:
                y = d.height - size.height;
        }
        Composite tempComposite = g.getComposite();
        if (getOpacity() != 100)
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) getOpacity() / 100));
        int width = (getSide() == Side.TOP || getSide() == Side.BOTTOM) ? calcBarSize(images[0].getWidth(), value) : images[0].getWidth();
        int height = (getSide() == Side.LEFT || getSide() == Side.RIGHT) ? calcBarSize(images[0].getHeight(), value) : images[0].getHeight();
        int screenWidth = (getSide() == Side.TOP || getSide() == Side.BOTTOM) ? calcBarSize(size.width, value) : size.width;
        int screenHeight = (getSide() == Side.LEFT || getSide() == Side.RIGHT) ? calcBarSize(size.height, value) : size.height;
        g.drawImage(images[1], x, y, size.width, size.height, null);
        if (getSide() == Side.LEFT || getSide() == Side.RIGHT) {
            g.drawImage(images[0], x, size.height - screenHeight, x + screenWidth, size.height, 0, images[0].getHeight() - height, width, images[0].getHeight(), null);
        } else {
            g.drawImage(images[0], x, y, x + screenWidth, y + screenHeight, 0, 0, width, height, null);
        }
        g.setComposite(tempComposite);
    }

    /**
     * @return Getter for bottomreplacedetId
     */
    public MD5Key getBottomreplacedetId() {
        return bottomreplacedetId;
    }

    /**
     * @param bottomreplacedetId Setter for bottomreplacedetId
     */
    public void setBottomreplacedetId(MD5Key bottomreplacedetId) {
        this.bottomreplacedetId = bottomreplacedetId;
    }

    /**
     * @return Getter for topreplacedetId
     */
    public MD5Key getTopreplacedetId() {
        return topreplacedetId;
    }

    /**
     * @param topreplacedetId Setter for topreplacedetId
     */
    public void setTopreplacedetId(MD5Key topreplacedetId) {
        this.topreplacedetId = topreplacedetId;
    }
}

19 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Request that the replacedet be loaded from the server, blocks access while loading, use with
 * caution!
 *
 * @param id MD5 of the replacedet to load from the server
 * @return
 */
public static replacedet requestreplacedetFromServer(MD5Key id) {
    if (id != null) {
        replacedetLoader.requestreplacedet(id);
        return getreplacedet(id);
    }
    return null;
}

19 View Complete Implementation : TokenLayoutPanel.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public void setTokenImage(MD5Key tokenImage) {
    this.tokenImage = tokenImage;
}

19 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Determine if the replacedet is in the persistent cache.
 *
 * @param id MD5 sum of the replacedet
 * @return True if replacedet is in the persistent cache, false otherwise
 * @see this#replacedetIsInPersistentCache(replacedet)
 */
private static boolean replacedetIsInPersistentCache(MD5Key id) {
    return getreplacedetCacheFile(id).exists() && getreplacedetCacheFile(id).length() > 0;
}

19 View Complete Implementation : AssetLoader.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
protected List<String> createRequestQueue(MD5Key id) {
    List<String> requestList = new LinkedList<String>();
    for (java.util.Map.Entry<String, Map<String, String>> entry : repositoryMap.entrySet()) {
        String repo = entry.getKey();
        if (repositoryStateMap.get(repo) == RepoState.ACTIVE && entry.getValue().containsKey(id.toString())) {
            requestList.add(repo);
        }
    }
    return requestList;
}

19 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Request that the replacedet be loaded from the server
 *
 * @param id MD5 of the replacedet to load from the server
 */
private static void requestreplacedetFromServer(MD5Key id, replacedetAvailableListener... listeners) {
    if (id != null) {
        addreplacedetListener(id, listeners);
        replacedetLoader.requestreplacedet(id);
    }
}

19 View Complete Implementation : LookupTable.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public void setTableImage(MD5Key tableImage) {
    this.tableImage = tableImage;
}

19 View Complete Implementation : TwoImageBarTokenOverlay.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * @param topreplacedetId Setter for topreplacedetId
 */
public void setTopreplacedetId(MD5Key topreplacedetId) {
    this.topreplacedetId = topreplacedetId;
}

19 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Return the replacedets cache file, if any
 *
 * @param id MD5 sum of the replacedet
 * @return The replacedets cache file, or null if it doesn't have one
 * @see replacedetManager#getreplacedetCacheFile(replacedet replacedet)
 */
public static File getreplacedetCacheFile(MD5Key id) {
    return new File(cacheDir.getAbsolutePath() + File.separator + id);
}

19 View Complete Implementation : SingleImageBarTokenOverlay.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Token overlay for bar meters.
 *
 * @author Jay
 */
public clreplaced SingleImageBarTokenOverlay extends BarTokenOverlay {

    /**
     * ID of the bar image displayed in the overlay.
     */
    private MD5Key replacedetId;

    /**
     * Needed for serialization
     */
    public SingleImageBarTokenOverlay() {
        this(AbstractTokenOverlay.DEFAULT_STATE_NAME, null);
    }

    /**
     * Create the complete image overlay.
     *
     * @param name Name of the new token overlay
     * @param thereplacedetId Id of the bar image
     */
    public SingleImageBarTokenOverlay(String name, MD5Key thereplacedetId) {
        super(name);
        replacedetId = thereplacedetId;
    }

    /**
     * @see net.rptools.maptool.client.ui.token.AbstractTokenOverlay#clone()
     */
    @Override
    public Object clone() {
        BarTokenOverlay overlay = new SingleImageBarTokenOverlay(getName(), replacedetId);
        overlay.setOrder(getOrder());
        overlay.setGroup(getGroup());
        overlay.setMouseover(isMouseover());
        overlay.setOpacity(getOpacity());
        overlay.setIncrements(getIncrements());
        overlay.setSide(getSide());
        overlay.setShowGM(isShowGM());
        overlay.setShowOwner(isShowOwner());
        overlay.setShowOthers(isShowOthers());
        return overlay;
    }

    /**
     * @see net.rptools.maptool.client.ui.token.BarTokenOverlay#paintOverlay(java.awt.Graphics2D,
     *     net.rptools.maptool.model.Token, java.awt.Rectangle, double)
     */
    @Override
    public void paintOverlay(Graphics2D g, Token token, Rectangle bounds, double value) {
        // Get the images
        BufferedImage image = ImageManager.getImageAndWait(replacedetId);
        Dimension d = bounds.getSize();
        Dimension size = new Dimension(image.getWidth(), image.getHeight());
        SwingUtil.constrainTo(size, d.width, d.height);
        // Find the position of the images according to the size and side where they are placed
        int x = 0;
        int y = 0;
        switch(getSide()) {
            case RIGHT:
                x = d.width - size.width;
                break;
            case BOTTOM:
                y = d.height - size.height;
        }
        Composite tempComposite = g.getComposite();
        if (getOpacity() != 100) {
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) getOpacity() / 100));
        }
        int width = (getSide() == Side.TOP || getSide() == Side.BOTTOM) ? calcBarSize(image.getWidth(), value) : image.getWidth();
        int height = (getSide() == Side.LEFT || getSide() == Side.RIGHT) ? calcBarSize(image.getHeight(), value) : image.getHeight();
        int screenWidth = (getSide() == Side.TOP || getSide() == Side.BOTTOM) ? calcBarSize(size.width, value) : size.width;
        int screenHeight = (getSide() == Side.LEFT || getSide() == Side.RIGHT) ? calcBarSize(size.height, value) : size.height;
        g.drawImage(image, x + size.width - screenWidth, y + size.height - screenHeight, x + size.width, y + size.height, image.getWidth() - width, image.getHeight() - height, image.getWidth(), image.getHeight(), null);
        g.setComposite(tempComposite);
    }

    /**
     * @return Getter for replacedetId
     */
    public MD5Key getreplacedetId() {
        return replacedetId;
    }

    /**
     * @param topreplacedetId Setter for replacedetId
     */
    public void setreplacedetId(MD5Key topreplacedetId) {
        this.replacedetId = topreplacedetId;
    }
}

19 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Remove the replacedet from the replacedet cache.
 *
 * @param id MD5 of the replacedet to remove
 */
public static void removereplacedet(MD5Key id) {
    replacedetMap.remove(id);
}

19 View Complete Implementation : Asset.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public void setId(MD5Key id) {
    this.id = id;
}

19 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Determine if the replacedet is currently being requested. While an replacedet is being loaded it will be
 * marked as requested and this function will return true. Once the replacedet is done loading this
 * function will return false and the replacedet will be available from the cache.
 *
 * @param key MD5Key of replacedet being requested
 * @return True if replacedet is currently being requested, false otherwise
 */
public static boolean isreplacedetRequested(MD5Key key) {
    return replacedetLoader.isIdRequested(key);
}

19 View Complete Implementation : MultipleImageBarTokenOverlay.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Token overlay for bar meters.
 *
 * @author Jay
 */
public clreplaced MultipleImageBarTokenOverlay extends BarTokenOverlay {

    /**
     * ID of the base image displayed in the overlay.
     */
    private MD5Key[] replacedetIds;

    /**
     * Needed for serialization
     */
    public MultipleImageBarTokenOverlay() {
        this(AbstractTokenOverlay.DEFAULT_STATE_NAME, null);
    }

    /**
     * Create the complete image overlay.
     *
     * @param name Name of the new token overlay
     * @param thereplacedetIds Id of the base image.
     */
    public MultipleImageBarTokenOverlay(String name, MD5Key[] thereplacedetIds) {
        super(name);
        replacedetIds = thereplacedetIds;
    }

    /**
     * @see net.rptools.maptool.client.ui.token.AbstractTokenOverlay#clone()
     */
    @Override
    public Object clone() {
        BarTokenOverlay overlay = new MultipleImageBarTokenOverlay(getName(), replacedetIds);
        overlay.setOrder(getOrder());
        overlay.setGroup(getGroup());
        overlay.setMouseover(isMouseover());
        overlay.setOpacity(getOpacity());
        overlay.setIncrements(getIncrements());
        overlay.setSide(getSide());
        overlay.setShowGM(isShowGM());
        overlay.setShowOwner(isShowOwner());
        overlay.setShowOthers(isShowOthers());
        return overlay;
    }

    /**
     * @see net.rptools.maptool.client.ui.token.BarTokenOverlay#paintOverlay(java.awt.Graphics2D,
     *     net.rptools.maptool.model.Token, java.awt.Rectangle, double)
     */
    @Override
    public void paintOverlay(Graphics2D g, Token token, Rectangle bounds, double value) {
        int incr = findIncrement(value);
        // Get the images
        BufferedImage image = ImageManager.getImageAndWait(replacedetIds[incr]);
        Dimension d = bounds.getSize();
        Dimension size = new Dimension(image.getWidth(), image.getHeight());
        SwingUtil.constrainTo(size, d.width, d.height);
        // Find the position of the image according to the size and side where they are placed
        int x = 0;
        int y = 0;
        switch(getSide()) {
            case RIGHT:
                x = d.width - size.width;
                break;
            case BOTTOM:
                y = d.height - size.height;
        }
        Composite tempComposite = g.getComposite();
        if (getOpacity() != 100) {
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) getOpacity() / 100));
        }
        g.drawImage(image, x, y, size.width, size.height, null);
        g.setComposite(tempComposite);
    }

    /**
     * @return Getter for bottomreplacedetId
     */
    public MD5Key[] getreplacedetIds() {
        return replacedetIds;
    }

    /**
     * @param thereplacedetIds Setter for bottomreplacedetId
     */
    public void setreplacedetIds(MD5Key[] thereplacedetIds) {
        this.replacedetIds = thereplacedetIds;
    }
}

19 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Determine if the replacedet has a local reference
 *
 * @param id MD5 sum of the replacedet
 * @return True if there is a local reference, false otherwise
 */
private static boolean replacedetHasLocalReference(MD5Key id) {
    return getLocalReference(id) != null;
}

19 View Complete Implementation : AssetLoader.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public synchronized void requestreplacedet(MD5Key id) {
    retrievalThreadPool.submit(new ImageRetrievalRequest(id, createRequestQueue(id)));
    requestedIdSet.add(id);
}

19 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Return the replacedet info file, if any
 *
 * @param id MD5 sum of the replacedet
 * @return File - The replacedets info file, or null if it doesn't have one
 * @see this@getreplacedetInfoFile(replacedet replacedet)
 */
private static File getreplacedetInfoFile(MD5Key id) {
    return new File(cacheDir.getAbsolutePath() + File.separator + id + ".info");
}

19 View Complete Implementation : MultipleImageBarTokenOverlay.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * @param thereplacedetIds Setter for bottomreplacedetId
 */
public void setreplacedetIds(MD5Key[] thereplacedetIds) {
    this.replacedetIds = thereplacedetIds;
}

19 View Complete Implementation : LookupTable.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public void addEntry(int min, int max, String result, MD5Key imageId) {
    getInternalEntryList().add(new LookupEntry(min, max, result, imageId));
}

19 View Complete Implementation : AssetLoader.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public synchronized boolean isIdRequested(MD5Key id) {
    return requestedIdSet.contains(id);
}

19 View Complete Implementation : TokenLayoutPanel.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Support clreplaced used by the token editor dialog on the "Properties" tab to allow a token's image to
 * be moved around within a one-cell grid area. Scaling is supported using the mousewheel and
 * position is supported using left-drag. We should add rotation ability using Shift-mousewheel as
 * well.
 *
 * @author trevor
 */
public clreplaced TokenLayoutPanel extends JPanel {

    private Token token;

    private int dragOffsetX;

    private int dragOffsetY;

    private MD5Key tokenImage;

    public TokenLayoutPanel() {
        addMouseWheelListener(new MouseWheelListener() {

            public void mouseWheelMoved(MouseWheelEvent e) {
                // Not for snap-to-scale
                if (!token.isSnapToScale()) {
                    return;
                }
                double delta = e.getWheelRotation() > 0 ? -.1 : .1;
                if (SwingUtil.isShiftDown(e)) {
                // Nothing yet, as changing the facing isn't the right way to handle it --
                // the image itself really should be rotated. And it's probably better to
                // not simply store a Transform but to create a new image. We could
                // store an AffineTransform until the dialog is closed and then create
                // the new image. But the amount of rotation needs to be saved so
                // that future adjustments can return back to the original image (as
                // a way of reducing round off error from multiple rotations).
                }
                double scale = token.getSizeScale() + delta;
                // Range
                scale = Math.max(.1, scale);
                scale = Math.min(3, scale);
                token.setSizeScale(scale);
                repaint();
            }
        });
        addMouseListener(new MouseAdapter() {

            String old;

            @Override
            public void mousePressed(MouseEvent e) {
                dragOffsetX = e.getX();
                dragOffsetY = e.getY();
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                old = MapTool.getFrame().getStatusMessage();
                MapTool.getFrame().setStatusMessage("Mouse Wheel to zoom; double-LClick to reset position and zoom");
            }

            @Override
            public void mouseExited(MouseEvent e) {
                if (old != null)
                    MapTool.getFrame().setStatusMessage(old);
            }

            @Override
            public void mouseClicked(MouseEvent e) {
                if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {
                    dragOffsetX = 0;
                    dragOffsetY = 0;
                    token.setAnchor(0, 0);
                    token.setSizeScale(1.0);
                    repaint();
                }
            }
        });
        addMouseMotionListener(new MouseMotionAdapter() {

            @Override
            public void mouseDragged(MouseEvent e) {
                int dx = e.getX() - dragOffsetX;
                int dy = e.getY() - dragOffsetY;
                Zone zone = MapTool.getFrame().getCurrentZoneRenderer().getZone();
                int gridSize = zone.getGrid().getSize();
                int halfGridSize = gridSize / 2;
                int maxXoff = Math.max(halfGridSize, token.getBounds(zone).width - gridSize);
                int maxYoff = Math.max(halfGridSize, token.getBounds(zone).height - gridSize);
                int offX = Math.min(maxXoff, Math.max(token.getAnchor().x + dx, -maxXoff));
                int offY = Math.min(maxYoff, Math.max(token.getAnchor().y + dy, -maxYoff));
                token.setAnchor(offX, offY);
                dragOffsetX = e.getX();
                dragOffsetY = e.getY();
                repaint();
            }
        });
    }

    public double getSizeScale() {
        return token.getSizeScale();
    }

    public int getAnchorX() {
        return token.getAnchor().x;
    }

    public int getAnchorY() {
        return token.getAnchor().y;
    }

    public void setToken(Token token) {
        this.token = new Token(token);
        setTokenImage(token.getImagereplacedetId());
    }

    public MD5Key getTokenImage() {
        return tokenImage;
    }

    public void setTokenImage(MD5Key tokenImage) {
        this.tokenImage = tokenImage;
    }

    @Override
    protected void paintComponent(Graphics g) {
        Dimension size = getSize();
        Zone zone = MapTool.getFrame().getCurrentZoneRenderer().getZone();
        // Gather info
        BufferedImage image = ImageManager.getImage(getTokenImage());
        Rectangle tokenSize = token.getBounds(zone);
        Dimension imgSize = new Dimension(image.getWidth(), image.getHeight());
        // If figure we need to calculate an additional offset for the token height
        double iso_ho = 0;
        if (token.getShape() == TokenShape.FIGURE) {
            double th = token.getHeight() * Double.valueOf(tokenSize.width) / token.getWidth();
            iso_ho = tokenSize.height - th;
            tokenSize = new Rectangle(tokenSize.x, tokenSize.y - (int) iso_ho, tokenSize.width, (int) th);
        }
        SwingUtil.constrainTo(imgSize, tokenSize.width, tokenSize.height);
        Point centerPoint = new Point(size.width / 2, size.height / 2);
        Graphics2D g2d = (Graphics2D) g;
        // Background
        ((Graphics2D) g).setPaint(new TexturePaint(AppStyle.panelTexture, new Rectangle(0, 0, AppStyle.panelTexture.getWidth(), AppStyle.panelTexture.getHeight())));
        g2d.fillRect(0, 0, size.width, size.height);
        AppStyle.shadowBorder.paintWithin((Graphics2D) g, 0, 0, size.width, size.height);
        // Grid
        if (zone.getGrid().getCapabilities().isSnapToGridSupported()) {
            Area gridShape = zone.getGrid().getCellShape();
            int offsetX = (size.width - gridShape.getBounds().width) / 2;
            int offsetY = (size.height - gridShape.getBounds().height) / 2;
            g2d.setColor(Color.black);
            // Add horizontal and vertical lines to help with centering
            g2d.drawLine(0, (size.height - (int) iso_ho) / 2, size.width, (size.height - (int) iso_ho) / 2);
            g2d.drawLine(size.width / 2, 0, size.width / 2, (size.height - (int) iso_ho));
            offsetY = offsetY - (int) (iso_ho / 2);
            g2d.translate(offsetX, offsetY);
            g2d.draw(gridShape);
            g2d.translate(-offsetX, -offsetY);
        }
        // Token
        g2d.drawImage(image, centerPoint.x - imgSize.width / 2 + token.getAnchor().x, centerPoint.y - imgSize.height / 2 + token.getAnchor().y, imgSize.width, imgSize.height, this);
    }
}

19 View Complete Implementation : ZoneFactory.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public clreplaced ZoneFactory {

    public static final String DEFAULT_MAP_NAME = "Grreplacedlands";

    public static MD5Key defaultImageId;

    static {
        // TODO: I really don't like this being hard wired this way, need to make it a preference or
        // something
        File grreplacedImage = new File(AppUtil.getAppHome("resource/Default/Textures").getAbsolutePath() + "/Grreplaced.png");
        if (grreplacedImage.exists()) {
            try {
                replacedet replacedet = new replacedet(DEFAULT_MAP_NAME, FileUtils.readFileToByteArray(grreplacedImage));
                defaultImageId = replacedet.getId();
                // Make sure the image is loaded to avoid a flash screen when it becomes visible
                ImageManager.getImageAndWait(replacedet.getId());
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    }

    public static Zone createZone() {
        Zone zone = new Zone();
        zone.setName(DEFAULT_MAP_NAME);
        zone.setBackgroundPaint(new DrawableTexturePaint(defaultImageId));
        zone.setFogPaint(new DrawableColorPaint(Color.black));
        zone.setVisible(AppPreferences.getNewMapsVisible());
        zone.setHasFog(AppPreferences.getNewMapsHaveFOW());
        zone.setUnitsPerCell(AppPreferences.getDefaultUnitsPerCell());
        zone.setTokenVisionDistance(AppPreferences.getDefaultVisionDistance());
        zone.setGrid(GridFactory.createGrid(AppPreferences.getDefaultGridType(), AppPreferences.getFaceEdge(), AppPreferences.getFaceVertex()));
        zone.setGridColor(AppPreferences.getDefaultGridColor().getRGB());
        zone.getGrid().setSize(AppPreferences.getDefaultGridSize());
        zone.getGrid().setOffset(0, 0);
        return zone;
    }
}

19 View Complete Implementation : SingleImageBarTokenOverlay.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * @param topreplacedetId Setter for replacedetId
 */
public void setreplacedetId(MD5Key topreplacedetId) {
    this.replacedetId = topreplacedetId;
}

19 View Complete Implementation : TwoImageBarTokenOverlay.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * @param bottomreplacedetId Setter for bottomreplacedetId
 */
public void setBottomreplacedetId(MD5Key bottomreplacedetId) {
    this.bottomreplacedetId = bottomreplacedetId;
}

19 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Determines if the replacedet data is in memory.
 *
 * @param key MD5 sum replacedociated with replacedet
 * @return True if hte replacedet is loaded, false otherwise
 */
public static boolean hasreplacedetInMemory(MD5Key key) {
    return replacedetMap.containsKey(key);
}

19 View Complete Implementation : ImageManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Loads the replacedet's raw image data into a buffered image, and waits for the image to load.
 *
 * @param replacedetId Load image data from this replacedet
 * @return BufferedImage Return the loaded image
 */
public static BufferedImage getImageAndWait(MD5Key replacedetId) {
    return getImageAndWait(replacedetId, null);
}

18 View Complete Implementation : ThumbnailManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
private File getThumbnailFile(File file) {
    MD5Key key = new MD5Key(file.getAbsolutePath().getBytes());
    return new File(thumbnailLocation.getPath(), key.toString());
}

18 View Complete Implementation : ServerCommandClientImpl.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public void getreplacedet(MD5Key replacedetID) {
    makeServerCall(COMMAND.getreplacedet, replacedetID);
}

18 View Complete Implementation : ServerCommandClientImpl.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public void removereplacedet(MD5Key replacedetID) {
    makeServerCall(COMMAND.removereplacedet, replacedetID);
}

18 View Complete Implementation : ImageChooserDialog.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public clreplaced ImageChooserDialog extends JDialog {

    private MD5Key imageId = null;

    private replacedetPanel imageChooser = new replacedetPanel("imagereplacedetPanel", MapTool.getFrame().getreplacedetPanel().getModel());

    public ImageChooserDialog(JFrame owner) {
        super(owner, "Choose Image", true);
        setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                imageId = null;
                setVisible(false);
            }
        });
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(BorderLayout.CENTER, imageChooser);
        panel.add(BorderLayout.SOUTH, createButtonPanel());
        setContentPane(panel);
        setSize(400, 500);
        SwingUtil.centerOver(this, getOwner());
        imageChooser.addImageSelectionListener(new SelectionListener() {

            @Override
            public void selectionPerformed(List<Object> selected) {
                if (selected.isEmpty() || (Integer) selected.get(0) < 0) {
                    return;
                }
                replacedet replacedet = imageChooser.getreplacedet((Integer) selected.get(0));
                imageId = replacedet.getId();
                // Put the replacedet into the replacedet manager since we have the replacedet handy here
                replacedetManager.putreplacedet(replacedet);
            }
        });
    }

    /**
     * Returns the replacedet ID of the last selected image.
     *
     * @return replacedet ID
     */
    public MD5Key getImageId() {
        return imageId;
    }

    private JPanel createButtonPanel() {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        panel.add(createOKButton());
        panel.add(createCancelButton());
        return panel;
    }

    private JButton createOKButton() {
        JButton button = new JButton("OK");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(java.awt.event.ActionEvent e) {
                setVisible(false);
            }
        });
        return button;
    }

    private JButton createCancelButton() {
        JButton button = new JButton("Cancel");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(java.awt.event.ActionEvent e) {
                imageId = null;
                setVisible(false);
            }
        });
        return button;
    }
}

18 View Complete Implementation : TransferableAssetReference.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 */
public clreplaced TransferablereplacedetReference implements Transferable {

    public static final DataFlavor dataFlavor = new DataFlavor(GUID.clreplaced, "replacedetReference");

    private MD5Key replacedetID;

    public TransferablereplacedetReference(replacedet replacedet) {
        this.replacedetID = replacedet.getId();
    }

    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
        return replacedetID;
    }

    public DataFlavor[] getTransferDataFlavors() {
        return new DataFlavor[] { dataFlavor };
    }

    public boolean isDataFlavorSupported(DataFlavor flavor) {
        return flavor.equals(dataFlavor);
    }
}

18 View Complete Implementation : AssetViewerDialog.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public clreplaced replacedetViewerDialog extends JDialog {

    private final MD5Key replacedetId;

    private boolean sized;

    private Rectangle cancelBounds;

    private boolean showHelp;

    public replacedetViewerDialog(String replacedle, MD5Key replacedetId) {
        super(MapTool.getFrame(), replacedle);
        this.replacedetId = replacedetId;
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setLayout(new GridLayout());
        setUndecorated(true);
        add(new InnerPanel());
    }

    @Override
    public void setVisible(boolean b) {
        if (b) {
            SwingUtil.centerOver(this, MapTool.getFrame());
        }
        super.setVisible(b);
    }

    private clreplaced InnerPanel extends JPanel {

        private int dragStartX, dragStartY;

        public InnerPanel() {
            setMinimumSize(new Dimension(100, 100));
            setPreferredSize(new Dimension(100, 100));
            setOpaque(false);
            addMouseListener(new MouseAdapter() {

                @Override
                public void mousePressed(MouseEvent e) {
                    dragStartX = e.getX();
                    dragStartY = e.getY();
                }

                @Override
                public void mouseClicked(MouseEvent e) {
                    if (cancelBounds != null && cancelBounds.contains(e.getX(), e.getY())) {
                        replacedetViewerDialog.this.setVisible(false);
                        replacedetViewerDialog.this.dispose();
                    }
                }

                @Override
                public void mouseEntered(MouseEvent e) {
                    showHelp = true;
                    repaint();
                }

                @Override
                public void mouseExited(MouseEvent e) {
                    showHelp = false;
                    repaint();
                }
            });
            addMouseMotionListener(new MouseMotionAdapter() {

                @Override
                public void mouseDragged(MouseEvent e) {
                    int dx = e.getX() - dragStartX;
                    int dy = e.getY() - dragStartY;
                    if (SwingUtilities.isLeftMouseButton(e)) {
                        // Move
                        Point currLocation = replacedetViewerDialog.this.getLocation();
                        replacedetViewerDialog.this.setLocation(currLocation.x + dx, currLocation.y + dy);
                    } else {
                        // Resize
                        Dimension size = replacedetViewerDialog.this.getSize();
                        // Keep aspect ratio the same
                        size.width += dx;
                        size.height += dy;
                        BufferedImage image = ImageManager.getImage(replacedetId, replacedetViewerDialog.this);
                        double ratio = image.getWidth() / (double) image.getHeight();
                        size.height = (int) (size.width / ratio);
                        // Keep it within the screen
                        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
                        if (size.width > screenSize.width || size.height > screenSize.height) {
                            SwingUtil.constrainTo(size, screenSize.width, screenSize.height);
                        }
                        replacedetViewerDialog.this.setSize(size.width, size.height);
                        replacedetViewerDialog.this.validate();
                        dragStartX = e.getX();
                        dragStartY = e.getY();
                    }
                }
            });
        }

        @Override
        public void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            Dimension size = getSize();
            BufferedImage image = ImageManager.getImage(replacedetId, this);
            if (!sized) {
                updateSize(image);
                if (image != ImageManager.TRANSFERING_IMAGE) {
                    sized = true;
                }
            }
            Dimension imgSize = new Dimension(image.getWidth(), image.getHeight());
            SwingUtil.constrainTo(imgSize, size.width, size.height);
            Object oldHint = g2d.getRenderingHint(RenderingHints.KEY_RENDERING);
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.drawImage(image, 0, 0, imgSize.width, imgSize.height, this);
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING, oldHint);
            // BORDER
            g.setColor(Color.black);
            g.drawRect(0, 0, size.width - 1, size.height - 1);
            // Controls
            BufferedImage cancelButton = AppStyle.cancelButton;
            int x = size.width - cancelButton.getWidth() - 1;
            int y = 1;
            g.drawImage(cancelButton, x, y, this);
            cancelBounds = new Rectangle(x, y, cancelButton.getWidth(), cancelButton.getHeight());
            // Help
            if (showHelp) {
                Object oldAA = SwingUtil.useAntiAliasing(g2d);
                // $NON-NLS-1$
                String helpLeftClick = I18N.getString("replacedetViewerDialog.leftDragMove");
                // $NON-NLS-1$
                String helpRightClick = I18N.getString("replacedetViewerDialog.rightDragResize");
                FontMetrics fm = g2d.getFontMetrics();
                int hx = 5;
                int hy = 5;
                g.setColor(Color.black);
                g.drawString(helpLeftClick, hx, hy + fm.getAscent());
                g.drawString(helpRightClick, hx, hy + fm.getHeight() + fm.getAscent() + 5);
                g.setColor(Color.white);
                g.drawString(helpLeftClick, hx - 1, hy + fm.getAscent() - 1);
                g.drawString(helpRightClick, hx - 1, hy + fm.getHeight() + fm.getAscent() + 5 - 1);
                SwingUtil.restoreAntiAliasing(g2d, oldAA);
            }
        }

        @Override
        public boolean imageUpdate(final Image img, int infoflags, int x, int y, int w, int h) {
            if (infoflags == ALLBITS) {
                EventQueue.invokeLater(new Runnable() {

                    public void run() {
                        updateSize(img);
                    }
                });
            }
            return super.imageUpdate(img, infoflags, x, y, w, h);
        }
    }

    private void updateSize(Image img) {
        Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
        // Keep it within the screen
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        if (size.width > screenSize.width || size.height > screenSize.height) {
            SwingUtil.constrainTo(size, screenSize.width, screenSize.height);
        }
        getContentPane().setPreferredSize(size);
        getContentPane().setMinimumSize(size);
        pack();
        // Keep it on screen
        SwingUtil.centerOver(this, MapTool.getFrame());
        Point p = getLocation();
        setLocation(Math.max(0, p.x), Math.max(0, p.y));
    }
}

18 View Complete Implementation : ImageAssetPanel.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public void setImageId(MD5Key sheetreplacedetId, ImageObserver... observers) {
    this.imageId = sheetreplacedetId;
    this.observers = observers != null && observers.length > 0 ? observers : new ImageObserver[] { this };
    getCancelButton().setVisible(allowEmpty && sheetreplacedetId != null);
    revalidate();
    repaint();
}

18 View Complete Implementation : ImageTokenOverlay.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * This is a token overlay that shows an image over the entire token
 *
 * @author Jay
 */
public clreplaced ImageTokenOverlay extends BooleanTokenOverlay {

    /**
     * If of the image displayed in the overlay.
     */
    private MD5Key replacedetId;

    /**
     * Logger instance for this clreplaced.
     */
    private static final Logger LOGGER = LogManager.getLogger(ImageTokenOverlay.clreplaced);

    /**
     * Needed for serialization
     */
    public ImageTokenOverlay() {
        this(BooleanTokenOverlay.DEFAULT_STATE_NAME, null);
    }

    /**
     * Create the complete image overlay.
     *
     * @param name Name of the new token overlay
     * @param anreplacedetId Id of the image displayed in the new token overlay.
     */
    public ImageTokenOverlay(String name, MD5Key anreplacedetId) {
        super(name);
        replacedetId = anreplacedetId;
    }

    /**
     * @see net.rptools.maptool.client.ui.token.BooleanTokenOverlay#clone()
     */
    @Override
    public Object clone() {
        BooleanTokenOverlay overlay = new ImageTokenOverlay(getName(), replacedetId);
        overlay.setOrder(getOrder());
        overlay.setGroup(getGroup());
        overlay.setMouseover(isMouseover());
        overlay.setOpacity(getOpacity());
        overlay.setShowGM(isShowGM());
        overlay.setShowOwner(isShowOwner());
        overlay.setShowOthers(isShowOthers());
        return overlay;
    }

    /**
     * @see net.rptools.maptool.client.ui.token.BooleanTokenOverlay#paintOverlay(java.awt.Graphics2D,
     *     net.rptools.maptool.model.Token, java.awt.Rectangle)
     */
    @Override
    public void paintOverlay(Graphics2D g, Token token, Rectangle bounds) {
        // Get the image
        Rectangle iBounds = getImageBounds(bounds, token);
        Dimension d = iBounds.getSize();
        BufferedImage image = ImageManager.getImageAndWait(replacedetId);
        Dimension size = new Dimension(image.getWidth(), image.getHeight());
        SwingUtil.constrainTo(size, d.width, d.height);
        // Paint it at the right location
        int width = size.width;
        int height = size.height;
        int x = iBounds.x + (d.width - width) / 2;
        int y = iBounds.y + (d.height - height) / 2;
        Composite tempComposite = g.getComposite();
        if (getOpacity() != 100)
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) getOpacity() / 100));
        g.drawImage(image, x, y, size.width, size.height, null);
        g.setComposite(tempComposite);
    }

    /**
     * @return Getter for replacedetId
     */
    public MD5Key getreplacedetId() {
        return replacedetId;
    }

    /**
     * Calculate the image bounds from the token bounds
     *
     * @param bounds Bounds of the token preplaceded to the overlay.
     * @param token Token being decorated.
     * @return The bounds w/in the token where the image is painted.
     */
    protected Rectangle getImageBounds(Rectangle bounds, Token token) {
        return bounds;
    }
}

18 View Complete Implementation : AssetLoader.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public synchronized void completeRequest(MD5Key id) {
    requestedIdSet.remove(id);
}

18 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Get the replacedet from the cache. If the replacedet is not currently available, will return null. Does
 * not request the replacedet from the server
 *
 * @param id MD5 of the replacedet requested
 * @return replacedet object for the MD5 sum
 */
public static replacedet getreplacedet(MD5Key id) {
    if (id == null) {
        return null;
    }
    replacedet replacedet = replacedetMap.get(id);
    if (replacedet == null && usePersistentCache && replacedetIsInPersistentCache(id)) {
        // Guaranteed that replacedet is in the cache.
        replacedet = getFromPersistentCache(id);
    }
    if (replacedet == null && replacedetHasLocalReference(id)) {
        File imageFile = getLocalReference(id);
        if (imageFile != null) {
            try {
                String name = FileUtil.getNameWithoutExtension(imageFile);
                byte[] data = FileUtils.readFileToByteArray(imageFile);
                replacedet = new replacedet(name, data);
                // Just to be sure the image didn't change
                if (!replacedet.getId().equals(id)) {
                    throw new IOException("Image reference did not match the requested image");
                }
                // Put it in the persistent cache so we'll find it faster next time
                putInPersistentCache(replacedet);
            } catch (IOException ioe) {
                // Log, but continue as if we didn't have a link
                ioe.printStackTrace();
            }
        }
    }
    return replacedet;
}

18 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Return a set of properties replacedociated with the replacedet.
 *
 * @param id MD5 of the replacedet
 * @return Properties object containing replacedet properties.
 */
public static Properties getreplacedetInfo(MD5Key id) {
    File infoFile = getreplacedetInfoFile(id);
    try {
        Properties props = new Properties();
        InputStream is = new FileInputStream(infoFile);
        props.load(is);
        is.close();
        return props;
    } catch (Exception e) {
        return new Properties();
    }
}

18 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Register a listener with the replacedet manager. The listener will be notified when the replacedet is
 * done loading.
 *
 * @param key MD5Key of the replacedet
 * @param listeners Listener to notify when the replacedet is done loading
 */
public static void addreplacedetListener(MD5Key key, replacedetAvailableListener... listeners) {
    if (listeners == null || listeners.length == 0) {
        return;
    }
    List<replacedetAvailableListener> listenerList = replacedetListenerListMap.get(key);
    if (listenerList == null) {
        listenerList = new LinkedList<replacedetAvailableListener>();
        replacedetListenerListMap.put(key, listenerList);
    }
    for (replacedetAvailableListener listener : listeners) {
        if (!listenerList.contains(listener)) {
            listenerList.add(listener);
        }
    }
}

18 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public static void removereplacedetListener(MD5Key key, replacedetAvailableListener... listeners) {
    if (listeners == null || listeners.length == 0) {
        return;
    }
    List<replacedetAvailableListener> listenerList = replacedetListenerListMap.get(key);
    if (listenerList == null) {
        // Nothing to do
        return;
    }
    for (replacedetAvailableListener listener : listeners) {
        listenerList.remove(listener);
    }
}

18 View Complete Implementation : AssetManager.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * Retrieve the replacedet from the persistent cache. If the replacedet is not in the cache, or loading from
 * the cache failed then this function returns null.
 *
 * @param id MD5 of the requested replacedet
 * @return replacedet from the cache
 */
private static replacedet getFromPersistentCache(MD5Key id) {
    if (id == null || id.toString().length() == 0) {
        return null;
    }
    if (!replacedetIsInPersistentCache(id)) {
        return null;
    }
    File replacedetFile = getreplacedetCacheFile(id);
    try {
        byte[] data = FileUtils.readFileToByteArray(replacedetFile);
        Properties props = getreplacedetInfo(id);
        replacedet replacedet = new replacedet(props.getProperty(NAME), data);
        if (!replacedet.getId().equals(id)) {
            log.error("MD5 for replacedet " + replacedet.getName() + " corrupted");
        }
        replacedetMap.put(id, replacedet);
        return replacedet;
    } catch (IOException ioe) {
        log.error("Could not load replacedet from persistent cache", ioe);
        return null;
    }
}

18 View Complete Implementation : HeroLabData.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public void setHandoutImage(MD5Key imagereplacedet) {
    heroImagereplacedets.put(DefaultreplacedetKey.HANDOUT_KEY, imagereplacedet);
}

18 View Complete Implementation : HeroLabData.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
/**
 * @author Jamz
 *     <p>Created to hold various bits of info about a Hero Lab portfolio for Token clreplaced to use and
 *     store. Can also be used to store extra data like getStatBlocks() from other sources if
 *     needed. The portfolio used is stored as a File and/or URL so the token can be easily updated.
 */
public clreplaced HeroLabData {

    private static replacedet DEFAULT_HERO_LAB_TOKEN_replacedET;

    private static replacedet DEFAULT_HERO_LAB_PORTRAIT_replacedET;

    private MD5Key heroLabStatblockreplacedetID;

    private String name;

    private String summary;

    private String playerName;

    private String gameSystem;

    private String heroLabIndex;

    private String minionMasterIndex;

    private String minionMasterName = "";

    private boolean isAlly = true;

    private boolean isDirty = false;

    private boolean isMinion = false;

    private File portfolioFile;

    private String portfolioPath;

    private long lastModified = 0L;

    private final HashMap<String, MD5Key> heroImagereplacedets = new HashMap<>();

    private static interface DefaultreplacedetKey {

        final String PORTRAIT_KEY = "0";

        final String TOKEN_KEY = "1";

        final String HANDOUT_KEY = "2";
    }

    public interface StatBlockKey {

        String DATA = "data";

        String LOCATION = "location";
    }

    public interface StatBlockType {

        String TEXT = "text";

        String HTML = "html";

        String XML = "xml";
    }

    public HeroLabData(String name) {
        this.name = name;
        try {
            DEFAULT_HERO_LAB_TOKEN_replacedET = new replacedet("DEFAULT_HERO_LAB_TOKEN", ImageIO.read(HeroLabData.clreplaced.getClreplacedLoader().getResource("net/rptools/maptool/client/image/hero-lab-token.png")));
            DEFAULT_HERO_LAB_PORTRAIT_replacedET = new replacedet("DEFAULT_HERO_LAB_PORTRAIT", ImageIO.read(HeroLabData.clreplaced.getClreplacedLoader().getResource("net/rptools/maptool/client/image/powered_by_hero_lab_small.png")));
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (!replacedetManager.hasreplacedet(DEFAULT_HERO_LAB_TOKEN_replacedET))
            replacedetManager.putreplacedet(DEFAULT_HERO_LAB_TOKEN_replacedET);
        if (!replacedetManager.hasreplacedet(DEFAULT_HERO_LAB_PORTRAIT_replacedET))
            replacedetManager.putreplacedet(DEFAULT_HERO_LAB_PORTRAIT_replacedET);
        heroImagereplacedets.put(DefaultreplacedetKey.TOKEN_KEY, DEFAULT_HERO_LAB_TOKEN_replacedET.getId());
        heroImagereplacedets.put(DefaultreplacedetKey.PORTRAIT_KEY, DEFAULT_HERO_LAB_PORTRAIT_replacedET.getId());
    }

    /*
   * Evaluate the HeroLab XML statBlock against the supplied xPath expression Sample expression: /doreplacedent/public/character/race/@racetext
   */
    public String parseXML(String xPathExpression) {
        if (xPathExpression.isEmpty())
            return "Error: No XPath expression given.";
        String results;
        XML xmlObj = new XMLDoreplacedent(getStatBlock_xml());
        results = String.join(", ", xmlObj.xpath(xPathExpression));
        // System.out.println("HeroLabData parseXML(" + xPathExpression + ") :: '" + results + "'");
        return results;
    }

    /*
   * Other xpath tests... String xml = heroData.getStatBlock_xml();
   *
   * XPathFactory xpathFactory = XPathFactory.newInstance(); XPath xpath = xpathFactory.newXPath();
   *
   * InputSource source = new InputSource(new StringReader(xml)); String results = ""; try { results = xpath.evaluate(searchText, source); } catch (XPathExpressionException e1) { // TODO
   * Auto-generated catch block e1.printStackTrace(); } System.out.println(searchText); System.out.println(results);
   */
    public boolean refresh() {
        return lastModified != getPortfolioLastModified();
    }

    @SuppressWarnings("unchecked")
    public HashMap<String, HashMap<String, String>> getStatBlocks() {
        HashMap<String, HashMap<String, String>> statBlocks = new HashMap<>();
        if (heroLabStatblockreplacedetID == null)
            return statBlocks;
        replacedet statBlockreplacedet = replacedetManager.getreplacedet(heroLabStatblockreplacedetID);
        if (statBlockreplacedet == null) {
            System.out.println("Requesting replacedet from the server...");
            statBlockreplacedet = replacedetManager.requestreplacedetFromServer(heroLabStatblockreplacedetID);
            int maxWait = 100;
            while (!replacedetManager.hasreplacedet(heroLabStatblockreplacedetID) && maxWait-- > 0) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println("Waiting on replacedet from server... " + maxWait);
            }
            statBlockreplacedet = replacedetManager.getreplacedet(heroLabStatblockreplacedetID);
        }
        try {
            ByteArrayInputStream byteIn = new ByteArrayInputStream(statBlockreplacedet.getImage());
            ObjectInputStream in = new ObjectInputStream(byteIn);
            statBlocks = (HashMap<String, HashMap<String, String>>) in.readObject();
            byteIn.close();
            in.close();
        } catch (ClreplacedNotFoundException | IOException e) {
            System.out.println("ERROR: Attempting to read replacedet ID: " + heroLabStatblockreplacedetID);
            e.printStackTrace();
        }
        return statBlocks;
    }

    public void setStatBlocks(HashMap<String, HashMap<String, String>> statBlocks) {
        // Jamz: Since statblocks do not change or accessed often, moved object data to an replacedet
        // as heroLabData could be pretty large with XML data causing lag on token transfers
        if (heroLabStatblockreplacedetID != null)
            replacedetManager.removereplacedet(heroLabStatblockreplacedetID);
        // Convert Map to byte array
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        ObjectOutputStream out;
        try {
            out = new ObjectOutputStream(byteOut);
            if (statBlocks != null) {
                out.writeObject(statBlocks);
                String replacedetName = getPortfolioFile() + "/" + heroLabIndex + "/" + name;
                replacedet statBlockreplacedet = new replacedet(replacedetName, byteOut.toByteArray());
                replacedetManager.putreplacedet(statBlockreplacedet);
                heroLabStatblockreplacedetID = statBlockreplacedet.getId();
                out.close();
                byteOut.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String getStatBlock_location(String type) {
        return getStatBlocks().get(type).get(StatBlockKey.LOCATION);
    }

    public String getStatBlock_data(String type) {
        if (getStatBlocks() == null)
            return "";
        if (type.equalsIgnoreCase(StatBlockType.HTML))
            type = StatBlockType.HTML;
        else if (type.equalsIgnoreCase(StatBlockType.XML))
            type = StatBlockType.XML;
        else
            type = StatBlockType.TEXT;
        if (getStatBlocks().get(type) == null)
            return "";
        Object statBlock = getStatBlocks().get(type).get(StatBlockKey.DATA);
        if (statBlock == null)
            return "";
        else
            return (String) statBlock;
    }

    public String getStatBlock_text() {
        return getStatBlock_data(StatBlockType.TEXT);
    }

    public String getStatBlock_html() {
        return getStatBlock_data(StatBlockType.HTML);
    }

    public String getStatBlock_xml() {
        return getStatBlock_data(StatBlockType.XML);
    }

    public boolean isDirty() {
        boolean hasChanged = refresh();
        if (hasChanged)
            isDirty = true;
        return isDirty;
    }

    public void setDirty(boolean isDirty) {
        if (!isDirty)
            lastModified = getPortfolioLastModified();
        // lastModified = portfolioWatcher.getLastModified();
        this.isDirty = isDirty;
    }

    public String getPortfolioPath() {
        if (portfolioPath == null)
            setPortfolioPath("");
        return portfolioPath;
    }

    public void setPortfolioPath(String portfolioPath) {
        this.portfolioPath = portfolioPath;
    }

    public File getPortfolioFile() {
        String fileSyncPath = AppPreferences.getFileSyncPath();
        if (portfolioPath == null || portfolioPath.isEmpty() || fileSyncPath.isEmpty()) {
            return portfolioFile;
        } else {
            if (portfolioPath.startsWith(fileSyncPath))
                return new File(portfolioPath);
            else
                return new File(fileSyncPath, portfolioPath);
        }
    }

    public void setPortfolioFile(File portfolioFile) {
        this.portfolioFile = portfolioFile;
        lastModified = getPortfolioLastModified();
        if (!AppPreferences.getFileSyncPath().isEmpty()) {
            try {
                portfolioPath = Paths.get(AppPreferences.getFileSyncPath()).relativize(portfolioFile.toPath()).toString();
            } catch (IllegalArgumentException e) {
                System.out.println("Unable to relativize paths for: [" + portfolioFile + "] [" + AppPreferences.getFileSyncPath() + "]");
                portfolioPath = "";
            }
        } else {
            portfolioPath = portfolioFile.getPath().toString();
        }
    }

    private long getPortfolioLastModified() {
        if (getPortfolioFile() != null)
            return getPortfolioFile().lastModified();
        else
            return 0L;
    }

    public String getLastModifiedDateString() {
        if (lastModified != getPortfolioLastModified())
            return "<html><i>" + new Date(lastModified).toString() + "</i></html>";
        else
            return new Date(lastModified).toString();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHeroLabIndex() {
        return heroLabIndex;
    }

    public void setHeroLabIndex(String heroLabIndex) {
        this.heroLabIndex = heroLabIndex;
    }

    public String getMinionMasterIndex() {
        return minionMasterIndex;
    }

    public void setMinionMasterIndex(String minionsMasterIndex) {
        this.minionMasterIndex = minionsMasterIndex;
    }

    public String getMinionMasterName() {
        return minionMasterName;
    }

    public void setMinionMasterName(String minionMasterName) {
        this.minionMasterName = minionMasterName;
    }

    public String getSummary() {
        return summary;
    }

    public void setSummary(String summary) {
        this.summary = summary;
    }

    public boolean isAlly() {
        return isAlly;
    }

    public void setAlly(boolean isAlly) {
        this.isAlly = isAlly;
    }

    public boolean isMinion() {
        return isMinion;
    }

    public void setMinion(boolean isMinion) {
        this.isMinion = isMinion;
    }

    public String getPlayerName() {
        return playerName;
    }

    public void setPlayerName(String playerName) {
        this.playerName = playerName;
    }

    public String getGameSystem() {
        return gameSystem;
    }

    public void setGameSystem(String gameSystem) {
        this.gameSystem = gameSystem;
    }

    public MD5Key getTokenImage() {
        if (!heroImagereplacedets.containsKey(DefaultreplacedetKey.TOKEN_KEY))
            heroImagereplacedets.put(DefaultreplacedetKey.TOKEN_KEY, DEFAULT_HERO_LAB_TOKEN_replacedET.getId());
        return heroImagereplacedets.get(DefaultreplacedetKey.TOKEN_KEY);
    }

    public void setTokenImage(MD5Key imagereplacedet) {
        heroImagereplacedets.put(DefaultreplacedetKey.TOKEN_KEY, imagereplacedet);
    }

    public MD5Key getPortraitImage() {
        if (!heroImagereplacedets.containsKey(DefaultreplacedetKey.PORTRAIT_KEY))
            heroImagereplacedets.put(DefaultreplacedetKey.PORTRAIT_KEY, DEFAULT_HERO_LAB_PORTRAIT_replacedET.getId());
        return heroImagereplacedets.get(DefaultreplacedetKey.PORTRAIT_KEY);
    }

    public void setPortraitImage(MD5Key imagereplacedet) {
        heroImagereplacedets.put(DefaultreplacedetKey.PORTRAIT_KEY, imagereplacedet);
    }

    public MD5Key getHandoutImage() {
        if (heroImagereplacedets.containsKey(DefaultreplacedetKey.HANDOUT_KEY))
            return heroImagereplacedets.get(DefaultreplacedetKey.HANDOUT_KEY);
        else
            return null;
    }

    public void setHandoutImage(MD5Key imagereplacedet) {
        heroImagereplacedets.put(DefaultreplacedetKey.HANDOUT_KEY, imagereplacedet);
    }

    public int getImageCount() {
        return heroImagereplacedets.size();
    }

    public Map<String, MD5Key> getreplacedetMap() {
        return heroImagereplacedets;
    }

    public Collection<MD5Key> getAllreplacedetIDs() {
        HashMap<String, MD5Key> allreplacedetIDs = new HashMap<>();
        if (heroImagereplacedets != null)
            allreplacedetIDs.putAll(heroImagereplacedets);
        if (heroLabStatblockreplacedetID != null)
            allreplacedetIDs.put("statBlocks", heroLabStatblockreplacedetID);
        return allreplacedetIDs.values();
    }

    public List<String> getAllImagereplacedetsURLs() {
        List<String> replacedetSet = new ArrayList<String>();
        for (MD5Key replacedetKey : heroImagereplacedets.values()) replacedetSet.add("replacedet://" + replacedetKey.toString());
        return replacedetSet;
    }

    public MD5Key getImagereplacedetID(int index) {
        return heroImagereplacedets.get(Integer.toString(index));
    }

    public void addImage(String imageName, BufferedImage image) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            ImageIO.write(image, "png", baos);
        } catch (IOException e) {
            e.printStackTrace();
        }
        replacedet imagereplacedet = new replacedet(imageName, baos.toByteArray());
        replacedetManager.putreplacedet(imagereplacedet);
        this.heroImagereplacedets.put(Integer.toString(heroImagereplacedets.size()), imagereplacedet.getId());
    }

    public void clearImages() {
        this.heroImagereplacedets.clear();
    }

    public void setDefaultImages() {
        heroImagereplacedets.put(DefaultreplacedetKey.TOKEN_KEY, DEFAULT_HERO_LAB_TOKEN_replacedET.getId());
        heroImagereplacedets.put(DefaultreplacedetKey.PORTRAIT_KEY, DEFAULT_HERO_LAB_PORTRAIT_replacedET.getId());
    }

    @Override
    public String toString() {
        return getInfo().toString(4);
    }

    public JSONObject getInfo() {
        Map<String, Object> heroLabInfo = new HashMap<String, Object>();
        heroLabInfo.put("name", name);
        heroLabInfo.put("summary", summary);
        heroLabInfo.put("playerName", playerName);
        heroLabInfo.put("gameSystem", gameSystem);
        heroLabInfo.put("heroLabIndex", heroLabIndex);
        heroLabInfo.put("masterIndex", minionMasterIndex);
        heroLabInfo.put("masterName", minionMasterName);
        heroLabInfo.put("isDirty", isDirty());
        heroLabInfo.put("isAlly", isAlly);
        heroLabInfo.put("isMinion", isMinion);
        heroLabInfo.put("portfolioFile", getPortfolioFile().getAbsolutePath());
        heroLabInfo.put("portfolioPath", portfolioPath);
        heroLabInfo.put("lastModified", getLastModifiedDateString());
        heroLabInfo.put("images", getAllImagereplacedetsURLs().toArray());
        return JSONObject.fromObject(heroLabInfo);
    }
}

18 View Complete Implementation : LookupTable.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public clreplaced LookupTable {

    private static ExpressionParser expressionParser = new ExpressionParser();

    private List<LookupEntry> entryList;

    private String name;

    private String defaultRoll;

    private MD5Key tableImage;

    private Boolean visible;

    private Boolean allowLookup;

    public LookupTable() {
    }

    public LookupTable(LookupTable table) {
        name = table.name;
        defaultRoll = table.defaultRoll;
        tableImage = table.tableImage;
        if (table.entryList != null) {
            getInternalEntryList().addAll(table.entryList);
        }
    }

    public void setRoll(String roll) {
        defaultRoll = roll;
    }

    public void clearEntries() {
        getInternalEntryList().clear();
    }

    public void addEntry(int min, int max, String result, MD5Key imageId) {
        getInternalEntryList().add(new LookupEntry(min, max, result, imageId));
    }

    public LookupEntry getLookup() throws ParserException {
        return getLookup(null);
    }

    public String getRoll() {
        return getDefaultRoll();
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public LookupEntry getLookup(String roll) throws ParserException {
        if (roll == null) {
            roll = getDefaultRoll();
        }
        int tableResult = 0;
        try {
            Result result = expressionParser.evaluate(roll);
            tableResult = Integer.parseInt(result.getValue().toString());
            Integer minmin = Integer.MAX_VALUE;
            Integer maxmax = Integer.MIN_VALUE;
            for (LookupEntry entry : getInternalEntryList()) {
                if (entry.min < minmin) {
                    minmin = entry.min;
                }
                if (entry.max > maxmax) {
                    maxmax = entry.max;
                }
            }
            if (tableResult > maxmax) {
                tableResult = maxmax;
            }
            if (tableResult < minmin) {
                tableResult = minmin;
            }
            for (LookupEntry entry : getInternalEntryList()) {
                if (tableResult >= entry.min && tableResult <= entry.max) {
                    // Support for "/" commands
                    return entry;
                }
            }
        } catch (NumberFormatException nfe) {
            throw new ParserException("Error lookup up value: " + tableResult);
        }
        throw new ParserException("Unknown table lookup: " + tableResult);
    }

    private String getDefaultRoll() {
        if (defaultRoll != null && defaultRoll.length() > 0) {
            return defaultRoll;
        }
        // Find the min and max range
        Integer min = null;
        Integer max = null;
        for (LookupEntry entry : getInternalEntryList()) {
            if (min == null || entry.min < min) {
                min = entry.min;
            }
            if (max == null || entry.max > max) {
                max = entry.max;
            }
        }
        return min != null ? "d" + (max - min + 1) + (min - 1 != 0 ? "+" + (min - 1) : "") : "";
    }

    private List<LookupEntry> getInternalEntryList() {
        if (entryList == null) {
            entryList = new ArrayList<LookupEntry>();
        }
        return entryList;
    }

    public List<LookupEntry> getEntryList() {
        return Collections.unmodifiableList(getInternalEntryList());
    }

    public MD5Key getTableImage() {
        return tableImage;
    }

    public void setTableImage(MD5Key tableImage) {
        this.tableImage = tableImage;
    }

    public String toString() {
        StringBuilder builder = new StringBuilder();
        for (LookupEntry entry : getInternalEntryList()) {
            if (entry.min == entry.max) {
                builder.append(entry.min);
            } else {
                builder.append(entry.min).append("-").append(entry.max);
            }
            builder.append("=").append(entry.value).append("\n");
        }
        return builder.toString();
    }

    public static clreplaced LookupEntry {

        private int min;

        private int max;

        private String value;

        private MD5Key imageId;

        /**
         * @Deprecated here to prevent xstream from breaking b24-b25
         */
        private String result;

        public LookupEntry(int min, int max, String result, MD5Key imageId) {
            this.min = min;
            this.max = max;
            this.value = result;
            this.imageId = imageId;
        }

        public MD5Key getImageId() {
            return imageId;
        }

        public int getMax() {
            return max;
        }

        public int getMin() {
            return min;
        }

        public String getValue() {
            // Temporary fix to convert b24 to b25
            if (result != null) {
                value = result;
                result = null;
            }
            return value;
        }
    }

    public Set<MD5Key> getAllreplacedetIds() {
        Set<MD5Key> replacedetSet = new HashSet<MD5Key>();
        if (getTableImage() != null) {
            replacedetSet.add(getTableImage());
        }
        for (LookupEntry entry : getEntryList()) {
            if (entry.getImageId() != null) {
                replacedetSet.add(entry.getImageId());
            }
        }
        return replacedetSet;
    }

    /**
     * Retrieves the visible flag for the LookupTable.
     *
     * @return Boolean -- True indicates that the table will be visible to players. False indicates
     *     that the table will be hidden from players.
     */
    public Boolean getVisible() {
        if (visible == null) {
            visible = new Boolean(true);
        }
        return visible;
    }

    /**
     * Sets the visible flag for the LookupTable.
     *
     * @param value(Boolean) -- True specifies that the table will be visible to players. False
     *     indicates that the table will be hidden from players.
     */
    public void setVisible(Boolean value) {
        visible = value;
    }

    /**
     * Retrieves the allowLookup flag for the LookupTable.
     *
     * @return Boolean -- True indicates that players can call for values from this table. False
     *     indicates that players will be prevented from calling values from this table. GM's can
     *     ALWAYS perform lookups against a table.
     */
    public Boolean getAllowLookup() {
        if (allowLookup == null) {
            allowLookup = true;
        }
        return allowLookup;
    }

    /**
     * Sets the allowLookup flag for the LookupTable.
     *
     * @param value(Boolean) -- True indicates that players can call for values from this table. False
     *     indicates that players will be prevented from calling values from this table. GM's can
     *     ALWAYS perform lookups against a table.
     */
    public void setAllowLookup(Boolean value) {
        allowLookup = value;
    }
}

18 View Complete Implementation : ServerMethodHandler.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public void removereplacedet(MD5Key replacedetID) {
    replacedetManager.removereplacedet(replacedetID);
}

18 View Complete Implementation : ServerMethodHandler.java
Copyright GNU Affero General Public License v3.0
Author : RPTools
public void setBoard(GUID zoneGUID, MD5Key mapId, int x, int y) {
    forwardToClients();
}