/*
***************************************************************************************
* Copyright (C) 2006 EsperTech, Inc. All rights reserved. *
* http://www.espertech.com/esper *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
***************************************************************************************
*/
package com.espertech.esper.example.rfidassetzone;
import com.espertech.esper.client.EPServiceProvider;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.net.URL;
public class DisplayCanvas extends JPanel {
private static final int NUM_IMAGES = 3;
private final EPServiceProvider engine;
private final String[] assetIds;
private final int[] x;
private final int[] y;
private final BufferedImage bi;
private final int imageWidth;
private final int imageHeight;
private int currentImage;
protected DisplayCanvas(EPServiceProvider engine, int width, int height) {
this.engine = engine;
setBackground(Color.white);
setSize(width, height);
addMouseMotionListener(new MouseMotionHandler());
this.addMouseListener(new MouseListenerHandler(this));
URL imageURL = this.getClass().getClassLoader().getResource("rfid_tag_image.gif");
Image image = getToolkit().getImage(imageURL);
// Load image
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 1);
try {
mt.waitForAll();
} catch (Exception e) {
System.out.println("Exception while loading image.");
}
if (image.getWidth(this) == -1) {
System.out.println("no gif file");
System.exit(0);
}
// setup
imageWidth = image.getWidth(this);
imageHeight = image.getHeight(this);
x = new int[NUM_IMAGES];
y = new int[NUM_IMAGES];
assetIds = new String[NUM_IMAGES];
for (int i = 0; i < NUM_IMAGES; i++) {
x[i] = i * (imageWidth + 10);
y[i] = 0;
assetIds[i] = "A" + Integer.toString(i + 1);
// boostrap initial positions in zone 1
engine.getEPRuntime().sendEvent(new LocationReport(assetIds[i], 1));
}
System.out.println("-- END OF STARTUP SEQUENCE with initial positions --");
bi = new BufferedImage(image.getWidth(this), image.getHeight(this), BufferedImage.TYPE_INT_ARGB);
Graphics2D big = bi.createGraphics();
for (int i = 0; i < NUM_IMAGES; i++) {
big.drawImage(image, x[i], y[i], this);
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
for (int i = 0; i < NUM_IMAGES; i++) {
g2D.drawImage(bi, x[i], y[i], this);
}
int lineLen = 50;
// draw zones
int middleX = (int) this.getSize().getWidth() / 2;
int middleY = (int) this.getSize().getHeight() / 2;
int width = (int) this.getSize().getWidth();
int height = (int) this.getSize().getHeight();
g2D.drawLine(0, middleY, lineLen, middleY);
g2D.drawLine(width, middleY, width - lineLen, middleY);
g2D.drawLine(middleX, 0, middleX, lineLen);
g2D.drawLine(middleX, height, middleX, height - lineLen);
g2D.drawLine(middleX - 20, middleY, middleX + 20, middleY);
g2D.drawLine(middleX, middleY - 20, middleX, middleY + 20);
int offsetXText = middleX / 2 - 20;
g2D.setFont(new Font("arial", Font.PLAIN, 30));
g2D.drawString("Zone1", offsetXText, middleY / 2); // middle of zone
g2D.drawString("Zone2", middleX + offsetXText, middleY / 2);
g2D.drawString("Zone3", offsetXText, middleY + middleY / 2);
g2D.drawString("Zone4", middleX + offsetXText, middleY + middleY / 2);
}
class MouseMotionHandler extends MouseMotionAdapter {
public void mouseDragged(MouseEvent e) {
if (currentImage != -1) {
x[currentImage] = e.getX();
y[currentImage] = e.getY();
}
repaint();
}
}
class MouseListenerHandler implements MouseListener {
private JPanel panel;
public MouseListenerHandler(JPanel panel) {
this.panel = panel;
}
/* (non-Javadoc)
* @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
*/
public void mouseClicked(MouseEvent arg0) {
}
/* (non-Javadoc)
* @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
*/
public void mouseEntered(MouseEvent arg0) {
}
/* (non-Javadoc)
* @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
*/
public void mouseExited(MouseEvent arg0) {
}
/* (non-Javadoc)
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*/
public void mousePressed(MouseEvent e) {
int imageNum = -1;
for (int i = 0; i < NUM_IMAGES; i++) {
if ((e.getX() >= x[i]) && (e.getX() <= (x[i] + imageWidth))) {
if ((e.getY() >= y[i]) && (e.getY() <= (y[i] + imageHeight))) {
imageNum = i;
break;
}
}
}
currentImage = imageNum;
}
/* (non-Javadoc)
* @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
*/
public void mouseReleased(MouseEvent arg0) {
if (currentImage != -1) {
int xpos = x[currentImage];
int ypos = y[currentImage];
// Determine zone
int xzone = 0;
int yzone = 0;
if (xpos > panel.getSize().getWidth() / 2) {
xzone = 1;
}
if (ypos > panel.getSize().getHeight() / 2) {
yzone = 1;
}
int zone = xzone + 2 * yzone + 1;
System.out.println("Moved asset " + assetIds[currentImage] + " to coordinates (" + xpos + "," + ypos + ") to zone " + zone);
// Send event
LocationReport report = new LocationReport(assetIds[currentImage], zone);
engine.getEPRuntime().sendEvent(report);
}
}
}
}