/*
* 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.tokenpanel;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import com.t3.client.AppUtil;
import com.t3.client.ui.TokenPopupMenu;
import com.t3.client.ui.zone.ZoneRenderer;
import com.t3.guid.GUID;
import com.t3.model.ModelChangeEvent;
import com.t3.model.ModelChangeListener;
import com.t3.model.Token;
import com.t3.model.Zone;
import com.t3.model.ZonePoint;
import com.t3.swing.SwingUtil;
public class TokenPanel extends JPanel implements ModelChangeListener {
private ZoneRenderer currentZoneRenderer;
private JList<Token> tokenList;
public TokenPanel() {
setLayout(new BorderLayout());
tokenList = new JList<Token>();
tokenList.setCellRenderer(new TokenListCellRenderer());
tokenList.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// TODO: make this not an aic
if (e.getClickCount() == 2 && SwingUtilities.isLeftMouseButton(e)) {
Token token = tokenList.getSelectedValue();
currentZoneRenderer.centerOn(new ZonePoint(token.getX(), token.getY()));
currentZoneRenderer.clearSelectedTokens();
currentZoneRenderer.selectToken(token.getId());
}
if (SwingUtilities.isRightMouseButton(e)) {
int itemUnderMouse = tokenList.locationToIndex(new Point(e.getX(), e.getY()));
if (!tokenList.isSelectedIndex(itemUnderMouse)) {
if (!SwingUtil.isShiftDown(e)) {
tokenList.clearSelection();
}
tokenList.addSelectionInterval(itemUnderMouse, itemUnderMouse);
}
final int x = e.getX();
final int y = e.getY();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Token firstToken = null;
Set<GUID> selectedTokenSet = new HashSet<GUID>();
for (int index : tokenList.getSelectedIndices()) {
Token token = tokenList.getModel().getElementAt(index);
if (firstToken == null) {
firstToken = token;
}
if (AppUtil.playerOwns(token)) {
selectedTokenSet.add(token.getId());
}
}
if (selectedTokenSet.size() > 0) {
new TokenPopupMenu(selectedTokenSet, x, y, currentZoneRenderer, firstToken).showPopup(tokenList);
}
}
});
}
}
});
new TokenPanelTransferHandler(tokenList);
add(BorderLayout.CENTER, new JScrollPane(tokenList));
}
public void setZoneRenderer(ZoneRenderer renderer) {
if (currentZoneRenderer != null) {
currentZoneRenderer.getZone().removeModelChangeListener(this);
}
currentZoneRenderer = renderer;
if (currentZoneRenderer != null) {
currentZoneRenderer.getZone().addModelChangeListener(this);
repaint();
}
// TODO: make this not a aic
EventQueue.invokeLater(new Runnable(){
@Override
public void run() {
Zone zone = currentZoneRenderer != null ? currentZoneRenderer.getZone() : null;
tokenList.setModel(new TokenListModel(zone));
}
});
}
////
// ModelChangeListener
@Override
public void modelChanged(ModelChangeEvent event) {
// Tokens are added and removed, just repaint ourself
((TokenListModel)tokenList.getModel()).update();
repaint();
}
}