/* * 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; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.Stroke; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.SwingUtilities; import com.t3.client.AppState; import com.t3.client.TabletopTool; import com.t3.client.ui.zone.ZoneRenderer; public class ZoneSelectionPopup extends JPopupMenu { private static final int PADDING = 5; public ZoneSelectionPopup() { List<ZoneRenderer> rendererList = new LinkedList<ZoneRenderer>(TabletopTool.getFrame().getZoneRenderers()); if (!TabletopTool.getPlayer().isGM()) { for (ListIterator<ZoneRenderer> iter = rendererList.listIterator(); iter.hasNext();) { ZoneRenderer renderer = iter.next(); if (!renderer.getZone().isVisible()) { iter.remove(); } } } Collections.sort(rendererList, new Comparator<ZoneRenderer>() { @Override public int compare(ZoneRenderer o1, ZoneRenderer o2) { String name1 = o1.getZone().getName(); String name2 = o2.getZone().getName(); return String.CASE_INSENSITIVE_ORDER.compare(name1, name2); } }); for (ZoneRenderer renderer : rendererList) { add(new SelectZoneButton(renderer)); } } private class SelectZoneButton extends JMenuItem implements ActionListener{ private ZoneRenderer renderer; private boolean isMouseOver; public SelectZoneButton(ZoneRenderer renderer) { this.renderer = renderer; addActionListener(this); addMouseListener(new MouseAdapter(){ @Override public void mouseEntered(MouseEvent e) { isMouseOver = true; repaint(); } @Override public void mouseExited(MouseEvent e) { isMouseOver = false; repaint(); } }); } @Override public Dimension getPreferredSize() { FontMetrics fm = getFontMetrics(getFont()); int width = Math.max(SwingUtilities.computeStringWidth(fm, renderer.getZone().getName()) + PADDING * 2, 100); int height = fm.getHeight() + PADDING*2; return new Dimension(width, height); } @Override public void actionPerformed(ActionEvent e) { if (TabletopTool.getFrame().getCurrentZoneRenderer() != renderer) { TabletopTool.getFrame().setCurrentZoneRenderer(renderer); TabletopTool.getFrame().refresh(); if (AppState.isPlayerViewLinked() && TabletopTool.getPlayer().isGM()) { TabletopTool.serverCommand().enforceZone(renderer.getZone().getId()); renderer.forcePlayersView(); } } ZoneSelectionPopup.this.setVisible(false); } @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; FontMetrics fm = g.getFontMetrics(); Object oldAA = g2d.getRenderingHint(RenderingHints.KEY_ANTIALIASING); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); boolean isSelected = renderer == TabletopTool.getFrame().getCurrentZoneRenderer(); // Background Dimension size = getSize(); if (isSelected) { g2d.setPaint(new GradientPaint(0, 0, Color.lightGray.brighter(), 0, size.height, Color.gray.brighter())); g.fillRect(0, 0, size.width, size.height); // g2d.setPaint(new GradientPaint(0, 0, Color.lightGray, size.width, 0, Color.gray.brighter())); // g.drawLine(PADDING, (size.height-fm.getHeight())/2+fm.getAscent()+2, size.width-1-PADDING, (size.height-fm.getHeight())/2+fm.getAscent()+2); } else { g.setColor(Color.white); g.fillRect(0, 0, size.width, size.height); } // Visibility if (!renderer.getZone().isVisible()) { Stroke oldStroke = g2d.getStroke(); g.setColor(Color.lightGray); g2d.setStroke(new BasicStroke(2)); for (int i = 0; i < size.width*2 || i < size.height*2; i += 10) { g.drawLine(i, 0, 0, i); } g2d.setStroke(oldStroke); } // Mouse over if (!isSelected && isMouseOver) { Stroke oldStroke = g2d.getStroke(); g2d.setColor(Color.yellow); g2d.setStroke(new BasicStroke(5)); g2d.drawRoundRect(0, 0, size.width-1, size.height-1, 10, 10); g2d.setStroke(oldStroke); } // Label String name = renderer.getZone().getName(); if (name == null || name.length() == 0) { name = "Map"; } int nameWidth = SwingUtilities.computeStringWidth(g.getFontMetrics(), name); if (!renderer.getZone().isVisible()) { // Clear out the lines from the label g.setColor(isSelected ? Color.lightGray : Color.white); g.fillRect(PADDING-3, (size.height - fm.getHeight())/2, nameWidth+6, fm.getHeight()); } g.setColor(Color.black); g.drawString(name, PADDING, (size.height - fm.getHeight())/2 + fm.getAscent()); // Border if (isSelected) { Stroke oldStroke = g2d.getStroke(); g2d.setColor(Color.blue); g2d.setStroke(new BasicStroke(2)); g2d.drawRoundRect(0, 0, size.width-1, size.height-1, 10, 10); g2d.setStroke(oldStroke); } g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, oldAA); } @Override public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h) { repaint(); return super.imageUpdate(img, infoflags, x, y, w, h); } } }