/*
* 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.macrobuttons.buttongroups;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Insets;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.SwingUtilities;
import com.t3.client.TabletopTool;
import com.t3.client.ui.macrobuttons.panels.AbstractMacroPanel;
import com.t3.model.MacroButtonProperties;
import com.t3.model.Token;
import com.t3.util.guidreference.NullHelper;
import com.t3.util.guidreference.TokenReference;
public class AreaGroup extends AbstractButtonGroup {
// constructor for creating an area group in the campaign/global panels
public AreaGroup(List<MacroButtonProperties> propertiesList, String panelLabel, AbstractMacroPanel panel) {
setPropertiesList(propertiesList);
setPanel(panel);
setPanelClass(panel.getPanelClass());
setGroupClass("AreaGroup");
setGroupLabel(panelLabel);
setTokenReference(NullHelper.referenceToken(panel.getToken()));
addMouseListener(this);
drawArea();
}
// constructor for creating an area group for the impersonate/selection panels
public AreaGroup(TokenReference token, AbstractMacroPanel panel) {
setTokenReference(token);
setPropertiesList(getToken().getMacroList(true));
setPanel(panel);
setPanelClass(panel.getPanelClass());
setGroupClass("AreaGroup");
setGroupLabel(getTokenName(getToken()));
addMouseListener(this);
drawArea();
}
// constructor for creating an area spacer, used to take up space where an area label would be
public AreaGroup(int height, AbstractMacroPanel panel) {
setPanel(panel);
setPanelClass(panel.getPanelClass());
setOpaque(false);
// addMouseListener(this); don't use; the label has its own
}
public void drawArea() {
if (getToken() == null && getGroupLabel().equals("")) {
// don't put an extra border around the campaign/global panels, or if there is no label
} else {
ThumbnailedBorder border = createBorder(getGroupLabel());
setBorder(border);
add(new AreaGroup(12, getPanel())); // spacer
}
String lastGroup = "akjaA#$Qq4jakjj#%455jkkajDAJFAJ"; // random string
String currentGroup = "";
List<MacroButtonProperties> propertiesList = getPropertiesList();
List<MacroButtonProperties> groupList = new ArrayList<MacroButtonProperties>();
Collections.sort(propertiesList);
if (propertiesList.isEmpty()) {
add(new ButtonGroup(propertiesList, "", getPanel(), getTokenReference(), this));
} else {
// build separate button groups for each user-defined group
for (MacroButtonProperties prop : propertiesList) {
currentGroup = prop.getGroup();
if (!groupList.isEmpty() && !lastGroup.equalsIgnoreCase(currentGroup)) { // better to use currentGroup.equals(lastGroup) since lastGroup could be initialized to null
add(new ButtonGroup(groupList, lastGroup, getPanel(), getTokenReference(), this));
groupList.clear();
}
lastGroup = currentGroup;
groupList.add(prop);
}
if (!groupList.isEmpty()) {
add(new ButtonGroup(groupList, lastGroup, getPanel(), getTokenReference(), this));
groupList.clear();
}
}
setLayout(new FlowLayout(FlowLayout.LEFT));
revalidate();
repaint();
}
@Override
public void drop(DropTargetDropEvent event) {
//System.out.println("BG: drop!");
event.rejectDrop(); // don't accept drops in an area group, it should be in the button group
event.dropComplete(true);
}
@Override
public Insets getInsets() {
return new Insets(0, 1, 3, 0);
}
@Override
public Dimension getPreferredSize() {
FlowLayout layout = (FlowLayout) getLayout();
Insets insets = getInsets();
// This isn't exact, but hopefully it's close enough
int availableWidth = getPanel().getAvailableWidth() - insets.left - insets.right;
int height = insets.top + insets.bottom + layout.getVgap();
int rowHeight = 0;
int rowWidth = insets.left + layout.getHgap() + insets.right;
for (Component c : getComponents()) {
Dimension cSize = c.getPreferredSize();
if (rowWidth + cSize.width + layout.getHgap() - 5 > availableWidth && rowWidth > 0) {
height += rowHeight + layout.getVgap();
rowHeight = 0;
rowWidth = insets.left + layout.getHgap() + insets.right;
}
rowWidth += cSize.width + layout.getHgap();
rowHeight = Math.max(cSize.height, rowHeight);
}
height += rowHeight;
Dimension prefSize = new Dimension(availableWidth, height);
return prefSize;
}
@Override
public void mouseReleased(MouseEvent event) {
Token token = getToken();
if (SwingUtilities.isRightMouseButton(event)) {
if (getPanelClass() == "CampaignPanel" && !TabletopTool.getPlayer().isGM()) {
return;
}
// open button group menu
new ButtonGroupPopupMenu(getPanelClass(), this, getMacroGroup(), token).show(this, event.getX(), event.getY());
}
}
public List<ButtonGroup> getButtonGroups() {
List<ButtonGroup> myButtonGroups = new ArrayList<ButtonGroup>();
for (int buttonGroupCount = 0; buttonGroupCount < this.getComponentCount(); buttonGroupCount++) {
myButtonGroups.add((ButtonGroup) this.getComponent(buttonGroupCount));
}
return myButtonGroups;
}
}