jNetClient/src/jnet/client/gui/mapview/PaintObject.java

254 lines
6.8 KiB
Java

package jnet.client.gui.mapview;
import jnet.client.Client;
import java.awt.BasicStroke;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.RoundRectangle2D;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Collections;
import java.util.List;
import javax.imageio.ImageIO;
import jnet.lib.LogFile;
import jnet.lib.object.MapObject;
import jnet.lib.object.ObjectType;
public class PaintObject extends Rectangle {
private MapObject obj;
private Image icon;
private int x;
private int y;
private int boxX = 0;
private int boxY;
private int paddingBoxu = 20;
private int sirka;
private int vyska;
private RoundRectangle2D box;
private Graphics2D g2;
private Boolean selected = false;
private Font fontNormal12 = new Font("Arial", Font.PLAIN, 12);
private Font fontBold12 = new Font("Arial", Font.BOLD, 12);
private Font fontNormalSmall = new Font("Arial", Font.PLAIN, 10);
public PaintObject(MapObject obj) {
this.obj = obj;
vypocitat_rozmery();
}
/**
* vypocita vyšku boxu
*/
private void vypocitat_rozmery() {
// padding top
vyska = 5;
// vyska obrazku
if (this.icon != null) {
vyska += this.icon.getHeight(null);
}
// vyska prvniho radku s nazvem zarizeni
vyska += getStringHeight(fontBold12);
// vyska druheho radku s ip adresou (pokud je vyplnena)
if (!obj.getIp().equals("")) {
vyska += 5; // mezera mezi radky
vyska += getStringHeight(fontNormal12);
}
// padding bottom
vyska += 5;
//sirka boxu
List<Integer> sList = new ArrayList<Integer>();
sList.add(getStringWidth(obj.getName(), fontBold12) + paddingBoxu);
sList.add(getStringWidth(obj.getIp(), fontNormal12) + paddingBoxu);
sirka = Collections.max(sList);
}
public void paint(Graphics g) {
g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// nastaveni pozice x, y objektu
this.x = obj.getX();
this.y = obj.getY();
// nastaveni ikony objektu
try {
for (ObjectType ot : Client.objectType) {
if (ot.getId() == obj.getObjectType()) {
byte[] decodedBytes = Base64.getDecoder().decode(ot.getImgStr());
ByteArrayInputStream bis = new ByteArrayInputStream(decodedBytes);
this.icon = ImageIO.read(bis);
break;
}
}
} catch (IOException ex) {
LogFile.printErr("Object icon exception: " + ex.getMessage());
}
vypocitat_rozmery();
/* TODO box gradient
GradientPaint redtowhite = new GradientPaint(x, y, Color.red, 200, y,Color.blue);
g2.setPaint(redtowhite);
*/
// status objektu
switch (obj.getStatus()) {
case 1: // online
g2.setPaint(new Color(83, 241, 83));
break;
case 2: // warning
g2.setPaint(new Color(255, 131, 0));
break;
case 3: // offline
g2.setPaint(new Color(221, 63, 63));
break;
default: // other
g2.setPaint(new Color(172, 172, 172));
}
// vypocitani pocatecnich souradnic
boxX = x - (sirka / 2);
boxY = y - (vyska / 2);
// vykresleni boxu
box = new RoundRectangle2D.Double(boxX, boxY, sirka, vyska, 10, 10);
g2.fill(box);
if (selected) {
g2.setStroke(new BasicStroke(1.5f));
g2.setColor(Color.BLACK);
g2.draw(box);
}
//
// nacteni ikonka zarizeni
if (icon != null) {
int imgX = boxX + sirka / 2 - (icon.getWidth(null) / 2);
int imgY = boxY + 5;
g.drawImage(icon, imgX, imgY, null);
boxY += icon.getHeight(null); // pricte vysku ikonky
} else {
}
// vypsani nazvu prvku
g2.setPaint(Color.BLACK);
g2.setFont(fontBold12);
g2.drawString(obj.getName(), boxX + (int) (box.getWidth() / 2) - (getStringWidth(obj.getName(), g2.getFont()) / 2), boxY + getStringHeight(g2.getFont()));
// vypsani ip prvku
boxY += 20;
g2.setFont(fontNormal12);
g2.drawString(obj.getIp(), boxX + (int) (box.getWidth() / 2) - (getStringWidth(obj.getIp(), g2.getFont()) / 2), boxY + getStringHeight(g2.getFont()));
// vypsani snmp sond
g2.setFont(fontNormalSmall);
/*
for (SnmpProbe snmpProbe : obj.getSnmpProbe()) {
if (snmpProbe.isView()) {
boxY += 20;
String str = snmpProbe.getName() + ": " + snmpProbe.getValue();
g2.drawString(str, boxX + (int) (box.getWidth() / 2) - (getStringWidth(str, g2.getFont()) / 2), boxY + getStringHeight(g2.getFont()));
}
}
*/
this.setBounds(boxX, boxY, sirka, vyska);
}
public int getBoxX() {
return (int) box.getX();
}
public int getBoxY() {
return (int) box.getY();
}
@Override
public double getX() {
return x;
}
@Override
public double getY() {
return y;
}
public int getBoxWidth() {
return sirka;
}
public int getBoxHeight() {
return vyska;
}
public void setSelected(Boolean value) {
this.selected = value;
}
private int getStringWidth(String text, Font font) {
Canvas c = new Canvas();
FontMetrics fm = c.getFontMetrics(font);
return fm.stringWidth(text);
}
private int getStringHeight(Font font) {
Canvas c = new Canvas();
FontMetrics fm = c.getFontMetrics(font);
return fm.getHeight();
}
@Override
public boolean contains(Point p) {
if ((box.getMinX() < p.getX() && p.getX() < box.getMaxX()) && (box.getMinY() < p.getY() && p.getY() < box.getMaxY())) {
return true;
} else {
return false;
}
}
public void setPosition(Point p) {
obj.setX(p.x + sirka / 2);
obj.setY(p.y + vyska / 2);
}
public int getId() {
return obj.getId();
}
public MapObject getObject() {
return obj;
}
public Point getPoint() {
Point p = new Point();
p.x = this.x;
p.y = this.y;
return p;
}
}