package com.baselet.element.old.element; import java.awt.Color; import java.awt.Composite; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Polygon; import java.util.Vector; import com.baselet.control.HandlerElementMap; import com.baselet.control.enums.AlignHorizontal; import com.baselet.control.util.Utils; import com.baselet.element.old.OldGridElement; import com.baselet.element.sticking.StickingPolygon; @SuppressWarnings("serial") public class Taxonomy_of_Actors extends OldGridElement { @Override public void paintEntity(Graphics g) { float zoom = HandlerElementMap.getHandlerForElement(this).getZoomFactor(); Graphics2D g2 = (Graphics2D) g; g2.setFont(HandlerElementMap.getHandlerForElement(this).getFontHandler().getFont()); Composite[] composites = colorize(g2); // enable colors g2.setColor(fgColor); g2.setComposite(composites[1]); g2.setColor(bgColor); g2.fillRect(0, 0, getRectangle().width - 1, getRectangle().height - 1); g2.setComposite(composites[0]); if (HandlerElementMap.getHandlerForElement(this).getDrawPanel().getSelector().isSelected(this)) { g2.setColor(fgColor); } else { g2.setColor(fgColorBase); } g2.drawRect(0, 0, getRectangle().width - 1, getRectangle().height - 1); Vector<String> tmp = Utils.decomposeStrings(getPanelAttributes()); int level = 0; float yPos = 10 * zoom; float xPos = 10 * zoom; float actorHeight = 60 * zoom; float actorWidth = 14 * zoom; Vector<Point> dock = new Vector<Point>(); Point nextDock = new Point((int) (xPos + actorWidth / 2 + 0.5), (int) (actorHeight + yPos + 0.5)); dock.add(nextDock); for (int i = 0; i < tmp.size(); i++) { String s = tmp.elementAt(i); int currentLineLevel = calculateLevel(s); s = s.replaceAll("\t", ""); // increase level if (currentLineLevel > level && i > 0) { level++; nextDock = new Point((int) (xPos + actorWidth / 2 + 0.5), (int) (actorHeight + yPos + 0.5)); dock.add(nextDock); nextDock = dock.elementAt(level - 1); drawDockAnchor(g2, nextDock); } // decrease level if (currentLineLevel < level) { level = currentLineLevel; } xPos = 10 * zoom + 4 * actorWidth * level; drawActor(g2, xPos, yPos, s); // draw docks for non root elements if (level > 0) { // change dock color to red if too much tabs occur Color color = g2.getColor(); if (currentLineLevel > level) { g2.setColor(Color.red); } nextDock = dock.elementAt(level - 1); drawDock(g2, nextDock, xPos, yPos); // reset color g2.setColor(color); } nextDock = new Point((int) (xPos + actorWidth / 2 + 0.5), (int) (actorHeight + yPos + 0.5)); dock.set(level, nextDock); yPos += actorHeight; } } @Override public StickingPolygon generateStickingBorder() { StickingPolygon p = new StickingPolygon(0, 0); return p; } private void drawDock(Graphics2D g2, Point nextDock, float xPos, float yPos) { float zoom = HandlerElementMap.getHandlerForElement(this).getZoomFactor(); float dockHeight = 50 * zoom; g2.drawLine(nextDock.x, nextDock.y, nextDock.x, (int) (dockHeight / 2 + yPos + 0.5)); g2.drawLine(nextDock.x, (int) (dockHeight / 2 + yPos + 0.5), (int) (xPos - 4 * zoom + 0.5), (int) (dockHeight / 2 + yPos + 0.5)); } private void drawActor(Graphics2D g2, float xPos, float yPos, String name) { float zoom = HandlerElementMap.getHandlerForElement(this).getZoomFactor(); float head = 14 * zoom; float distance = 10 * zoom; g2.drawOval((int) (xPos + 0.5), (int) (yPos + 0.5), (int) (head + 0.5), (int) (head + 0.5)); g2.drawLine((int) (head / 2 + xPos + 0.5), (int) (head + yPos + 0.5), (int) (head / 2 + xPos + 0.5), (int) (yPos + head * 3 - distance + 0.5)); g2.drawLine((int) (xPos - 4 * zoom + 0.5), (int) (yPos + head + head / 3 + 0.5), (int) (xPos + head + 4 * zoom + 0.5), (int) (yPos + head + head / 3 + 0.5)); g2.drawLine((int) (head / 2 + xPos + 0.5), (int) (yPos + head * 3 - distance + 0.5), (int) (head + xPos + 0.5), (int) (yPos + head * 4 - distance + 0.5)); g2.drawLine((int) (head / 2 + xPos), (int) (yPos + head * 3 - distance + 0.5), (int) (xPos + 0.5), (int) (yPos + head * 4 - distance + 0.5)); // this.getHandler().getFontHandler().writeText(g2, name, xPos, yPos + (int) (4.5*head), false); HandlerElementMap.getHandlerForElement(this).getFontHandler().writeText(g2, name, (int) (xPos + head * 1.5 + HandlerElementMap.getHandlerForElement(this).getFontHandler().getDistanceBetweenTexts() + 0.5), (int) (2 * head + yPos + 0.5), AlignHorizontal.LEFT); } private void drawDockAnchor(Graphics2D g2, Point nextDock) { float zoom = HandlerElementMap.getHandlerForElement(this).getZoomFactor(); int[] xkanten = { nextDock.x, nextDock.x + (int) (6 * zoom), nextDock.x - (int) (6 * zoom) }; int[] ykanten = { nextDock.y - (int) (9 * zoom), nextDock.y, nextDock.y }; int kanten_zahl = 3; g2.drawPolygon(new Polygon(xkanten, ykanten, kanten_zahl)); } // calculates the hierarchy level according to tab count in the string protected int calculateLevel(String s) { int level = 0; while (s.length() > 0 && s.charAt(0) == '\t') { level++; s = s.substring(1); } // Logger.getAnonymousLogger().info("string=="+s+";index=="+level); return level; } }