/* * Copyright (c) 2014 tabletoptool.com team. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * rptools.com team - initial implementation * tabletoptool.com team - further development */ package com.t3.client.ui.zone.vbl; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.geom.Area; import java.awt.geom.Point2D; import javax.swing.JFrame; import javax.swing.JPanel; public class AreaTreeInspector extends JPanel { private final AreaTree tree; private final Color[] colors = { Color.gray, Color.blue, Color.yellow, Color.orange, Color.cyan }; private Point2D point; public AreaTreeInspector() { Area area = new Area(); area.add(new Area(new Rectangle(100, 100, 300, 300))); area.subtract(new Area(new Rectangle(150, 200, 100, 100))); area.subtract(new Area(new Rectangle(300, 200, 75, 100))); area.add(new Area(new Rectangle(175, 225, 50, 50))); area.subtract(new Area(new Rectangle(180, 230, 20, 20))); area.add(new Area(new Rectangle(450, 100, 300, 300))); area.subtract(new Area(new Rectangle(500, 200, 100, 100))); area.subtract(new Area(new Rectangle(650, 200, 75, 100))); area.add(new Area(new Rectangle(525, 225, 50, 50))); tree = new AreaTree(area); addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent e) { point = e.getPoint(); repaint(); } }); } @Override protected void paintComponent(Graphics g) { Dimension size = getSize(); g.setColor(Color.white); g.fillRect(0, 0, size.width, size.height); AreaOcean ocean = tree.getOcean(); // paintOcean((Graphics2D)g, ocean, 0); if (point != null) { Graphics2D g2d = (Graphics2D) g.create(0, 0, size.width, size.height); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .5f)); g2d.setColor(Color.blue); ocean = tree.getOceanAt(point); if (ocean != null && ocean.getBounds() != null) { g2d.fill(ocean.getBounds()); } g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .25f)); g2d.setColor(Color.red); for (VisibleAreaSegment segment : ocean.getVisibleAreaSegments(point)) { Area area = segment.getArea(); if (area != null) { g2d.fill(area); } } g2d.dispose(); } } private void paintOcean(Graphics2D g, AreaOcean ocean, int depth) { if (ocean.getBounds() != null) { g.setColor(Color.white); g.fill(ocean.getBounds()); g.setColor(colors[depth % colors.length]); g.draw(ocean.getBounds()); } for (AreaIsland island : ocean.getIslands()) { paintIsland(g, island, depth + 1); } } private void paintIsland(Graphics2D g, AreaIsland island, int depth) { g.setColor(Color.gray); g.fill(island.getBounds()); g.setColor(colors[depth % colors.length]); g.draw(island.getBounds()); for (AreaOcean ocean : island.getOceans()) { paintOcean(g, ocean, depth + 1); } } public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setBounds(100, 100, 800, 500); f.add(new AreaTreeInspector()); f.setVisible(true); } }