/* * 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.EventQueue; import java.awt.event.ActionEvent; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JFileChooser; import javax.swing.JPopupMenu; import javax.swing.JSeparator; import com.t3.client.AppUtil; import com.t3.client.TabletopTool; import com.t3.client.ui.macrobuttons.buttons.MacroButtonPrefs; import com.t3.client.ui.macrobuttons.panels.CampaignPanel; import com.t3.client.ui.macrobuttons.panels.GlobalPanel; import com.t3.language.I18N; import com.t3.model.MacroButtonProperties; import com.t3.model.Token; import com.t3.persistence.PersistenceUtil; import com.t3.util.guidreference.NullHelper; import com.t3.util.guidreference.TokenReference; @SuppressWarnings("serial") public class ButtonGroupPopupMenu extends JPopupMenu { private final AreaGroup areaGroup; private final String macroGroup; private final String panelClass; private TokenReference token; public ButtonGroupPopupMenu(String panelClass, AreaGroup areaGroup, String macroGroup, Token token) { this.areaGroup = areaGroup; this.macroGroup = macroGroup; this.panelClass = panelClass; this.token=NullHelper.referenceToken(token); if(panelClass.equals("SelectionPanel")) { if(areaGroup != null) { if(areaGroup.getGroupLabel().equals(I18N.getText("component.areaGroup.macro.commonMacros"))) { addCommonActions(); } else { addActions(); } } } else if(panelClass.equals("CampaignPanel")) { addCampaignActions(); } else { addActions(); } } private void addActions() { add(new AddMacroAction()); add(new JSeparator()); add(new ImportMacroAction()); add(new JSeparator()); add(new ImportMacroSetAction()); add(new ExportMacroSetAction()); add(new JSeparator()); add(new ClearGroupAction()); if(!this.panelClass.equals("SelectionPanel")) { add(new JSeparator()); add(new ClearPanelAction()); } } private void addCommonActions() { add(new AddMacroAction(I18N.getText("action.macro.addNewToSelected"))); add(new JSeparator()); add(new ImportMacroAction(I18N.getText("action.macro.importToSelected"))); add(new JSeparator()); add(new ImportMacroSetAction(I18N.getText("action.macro.importSetToSelected"))); add(new ExportMacroSetAction(I18N.getText("action.macro.exportCommonSet"))); } private void addCampaignActions() { if(TabletopTool.getPlayer().isGM()) { add(new AddMacroAction()); add(new JSeparator()); add(new ImportMacroAction()); add(new JSeparator()); add(new ImportMacroSetAction()); add(new ExportMacroSetAction()); add(new JSeparator()); add(new ClearGroupAction()); add(new JSeparator()); add(new ClearPanelAction()); } } private class AddMacroAction extends AbstractAction { public AddMacroAction() { putValue(Action.NAME, I18N.getText("action.macro.new")); } public AddMacroAction(String name) { putValue(Action.NAME, name); } @Override public void actionPerformed(ActionEvent event) { if (panelClass.equals("GlobalPanel")) { new MacroButtonProperties(panelClass, MacroButtonPrefs.getNextIndex(), macroGroup); } else if (panelClass.equals("CampaignPanel")) { new MacroButtonProperties(panelClass, TabletopTool.getCampaign().getMacroButtonNextIndex(), macroGroup); } else if(panelClass.equals("SelectionPanel")) { if(areaGroup != null) { if(areaGroup.getGroupLabel().equals(I18N.getText("component.areaGroup.macro.commonMacros"))) { for(Token nextToken : TabletopTool.getFrame().getCurrentZoneRenderer().getSelectedTokensList()) { new MacroButtonProperties(nextToken, nextToken.getMacroNextIndex(), macroGroup); } } else if(token != null) new MacroButtonProperties(token.value(), token.value().getMacroNextIndex(), macroGroup); } } else if (token != null) new MacroButtonProperties(token.value(), token.value().getMacroNextIndex(), macroGroup); } } private class ImportMacroAction extends AbstractAction { public ImportMacroAction() { putValue(Action.NAME, I18N.getText("action.macro.import")); } public ImportMacroAction(String name) { putValue(Action.NAME, name); } @Override public void actionPerformed(ActionEvent event) { JFileChooser chooser = TabletopTool.getFrame().getLoadMacroFileChooser(); if (chooser.showOpenDialog(TabletopTool.getFrame()) != JFileChooser.APPROVE_OPTION) { return; } final File selectedFile = chooser.getSelectedFile(); EventQueue.invokeLater(new Runnable() { @Override public void run() { try { MacroButtonProperties newButtonProps = PersistenceUtil.loadMacro(selectedFile); Boolean alreadyExists = false; if (panelClass.equals("GlobalPanel")) { for(MacroButtonProperties nextMacro : MacroButtonPrefs.getButtonProperties()) { if(newButtonProps.hashCodeForComparison() == nextMacro.hashCodeForComparison()) { alreadyExists = true; } } if(alreadyExists) { alreadyExists = confirmImport(newButtonProps, I18N.getText("confirm.macro.panelLocation", I18N.getText("panel.Global"))); } if(!alreadyExists) { new MacroButtonProperties(panelClass, MacroButtonPrefs.getNextIndex(), newButtonProps); } } else if (panelClass.equals("CampaignPanel")) { for(MacroButtonProperties nextMacro : TabletopTool.getCampaign().getMacroButtonPropertiesArray()) { if(newButtonProps.hashCodeForComparison() == nextMacro.hashCodeForComparison()) { alreadyExists = true; } } if(alreadyExists) { alreadyExists = confirmImport(newButtonProps, I18N.getText("confirm.macro.panelLocation", I18N.getText("panel.Campaign"))); } if(!alreadyExists) { new MacroButtonProperties(panelClass, TabletopTool.getCampaign().getMacroButtonNextIndex(), newButtonProps); } } else if(panelClass.equals("SelectionPanel")) { if(areaGroup != null) { if(areaGroup.getGroupLabel().equals(I18N.getText("component.areaGroup.macro.commonMacros"))) { for(Token nextToken : TabletopTool.getFrame().getCurrentZoneRenderer().getSelectedTokensList()) { alreadyExists = false; for(MacroButtonProperties nextMacro : nextToken.getMacroList(true)) { if(newButtonProps.hashCodeForComparison() == nextMacro.hashCodeForComparison()) { alreadyExists = true; } } if(alreadyExists) { alreadyExists = confirmImport(newButtonProps, I18N.getText("confirm.macro.commonSelectionLocation")); } if(!alreadyExists) { new MacroButtonProperties(nextToken, nextToken.getMacroNextIndex(), newButtonProps); } } } else if (token != null){ Token tokenV = token.value(); for(MacroButtonProperties nextMacro : tokenV.getMacroList(true)) { if(newButtonProps.hashCodeForComparison() == nextMacro.hashCodeForComparison()) { alreadyExists = true; } } if(alreadyExists) { String tokenName = tokenV.getName(); if(TabletopTool.getPlayer().isGM()) { if(tokenV.getGMName() != null) { if(!tokenV.getGMName().equals("")) { tokenName = tokenName + "(" + tokenV.getGMName() + ")"; } } } alreadyExists = confirmImport(newButtonProps, I18N.getText("confirm.macro.tokenLocation", tokenName)); } if(!alreadyExists) { new MacroButtonProperties(tokenV, tokenV.getMacroNextIndex(), newButtonProps); } } } } else if (token != null){ Token tokenV = token.value(); for(MacroButtonProperties nextMacro : tokenV.getMacroList(true)) { if(newButtonProps.hashCodeForComparison() == nextMacro.hashCodeForComparison()) { alreadyExists = true; } } if(alreadyExists) { String tokenName = tokenV.getName(); if(TabletopTool.getPlayer().isGM()) { if(tokenV.getGMName() != null) { if(!tokenV.getGMName().equals("")) { tokenName = tokenName + "(" + tokenV.getGMName() + ")"; } } } alreadyExists = confirmImport(newButtonProps, I18N.getText("confirm.macro.tokenLocation", tokenName)); } if(!alreadyExists) { new MacroButtonProperties(tokenV, tokenV.getMacroNextIndex(), newButtonProps); } } } catch (IOException ioe) { ioe.printStackTrace(); TabletopTool.showError(I18N.getText("msg.error.macro.exportSetFail", ioe)); } } }); } } private class ImportMacroSetAction extends AbstractAction { public ImportMacroSetAction() { putValue(Action.NAME, I18N.getText("action.macro.importSet")); } public ImportMacroSetAction(String name) { putValue(Action.NAME, name); } @Override public void actionPerformed(ActionEvent event) { JFileChooser chooser = TabletopTool.getFrame().getLoadMacroSetFileChooser(); if (chooser.showOpenDialog(TabletopTool.getFrame()) != JFileChooser.APPROVE_OPTION) { return; } final File selectedFile = chooser.getSelectedFile(); EventQueue.invokeLater(new Runnable() { @Override public void run() { try { List<MacroButtonProperties> newButtonProps = PersistenceUtil.loadMacroSet(selectedFile); Boolean alreadyExists = false; for(MacroButtonProperties nextProps : newButtonProps) { alreadyExists = false; if (panelClass.equals("GlobalPanel")) { for(MacroButtonProperties nextMacro : MacroButtonPrefs.getButtonProperties()) { if(nextProps.hashCodeForComparison() == nextMacro.hashCodeForComparison()) { alreadyExists = true; } } if(alreadyExists) { alreadyExists = confirmImport(nextProps, I18N.getText("confirm.macro.panelLocation", I18N.getText("panel.Global"))); } if(!alreadyExists) { new MacroButtonProperties(panelClass, MacroButtonPrefs.getNextIndex(), nextProps); } } else if (panelClass.equals("CampaignPanel")) { for(MacroButtonProperties nextMacro : TabletopTool.getCampaign().getMacroButtonPropertiesArray()) { if(nextProps.hashCodeForComparison() == nextMacro.hashCodeForComparison()) { alreadyExists = true; } } if(alreadyExists) { alreadyExists = confirmImport(nextProps, I18N.getText("confirm.macro.panelLocation", I18N.getText("panel.Campaign"))); } if(!alreadyExists) { new MacroButtonProperties(panelClass, TabletopTool.getCampaign().getMacroButtonNextIndex(), nextProps); } } else if(panelClass.equals("SelectionPanel")) { if(areaGroup != null) { if(areaGroup.getGroupLabel().equals(I18N.getText("component.areaGroup.macro.commonMacros"))) { for(Token nextToken : TabletopTool.getFrame().getCurrentZoneRenderer().getSelectedTokensList()) { alreadyExists = false; for(MacroButtonProperties nextMacro : nextToken.getMacroList(true)) { if(nextProps.hashCodeForComparison() == nextMacro.hashCodeForComparison()) { alreadyExists = true; } } if(alreadyExists) { alreadyExists = confirmImport(nextProps, I18N.getText("confirm.macro.commonSelectionLocation")); } if(!alreadyExists) { new MacroButtonProperties(nextToken, nextToken.getMacroNextIndex(), nextProps); } } } else if(token != null){ Token tokenV = token.value(); for(MacroButtonProperties nextMacro : tokenV.getMacroList(true)) { if(nextProps.hashCodeForComparison() == nextMacro.hashCodeForComparison()) { alreadyExists = true; } } if(alreadyExists) { String tokenName = tokenV.getName(); if(TabletopTool.getPlayer().isGM()) { if(tokenV.getGMName() != null) { if(!tokenV.getGMName().equals("")) { tokenName = tokenName + "(" + tokenV.getGMName() + ")"; } } } alreadyExists = confirmImport(nextProps, I18N.getText("confirm.macro.tokenLocation", tokenName)); } if(!alreadyExists) { new MacroButtonProperties(tokenV, tokenV.getMacroNextIndex(), nextProps); } } } } else if (token != null){ Token tokenV = token.value(); for(MacroButtonProperties nextMacro : tokenV.getMacroList(true)) { if(nextProps.hashCodeForComparison() == nextMacro.hashCodeForComparison()) { alreadyExists = true; } } if(alreadyExists) { String tokenName = tokenV.getName(); if(TabletopTool.getPlayer().isGM()) { if(tokenV.getGMName() != null) { if(!tokenV.getGMName().equals("")) { tokenName = tokenName + "(" + tokenV.getGMName() + ")"; } } } alreadyExists = confirmImport(nextProps, I18N.getText("confirm.macro.tokenLocation", tokenName)); } if(!alreadyExists) { new MacroButtonProperties(tokenV, tokenV.getMacroNextIndex(), nextProps); } } } } catch (IOException ioe) { TabletopTool.showError("msg.error.macro.importSetFail", ioe); } } }); } } private class ExportMacroSetAction extends AbstractAction { public ExportMacroSetAction() { putValue(Action.NAME, I18N.getText("action.macro.exportSet")); } public ExportMacroSetAction(String name) { putValue(Action.NAME, name); } @Override public void actionPerformed(ActionEvent event) { JFileChooser chooser = TabletopTool.getFrame().getSaveMacroSetFileChooser(); if (chooser.showSaveDialog(TabletopTool.getFrame()) != JFileChooser.APPROVE_OPTION) { return; } final File selectedFile = chooser.getSelectedFile(); if (selectedFile.exists()) { if (selectedFile.getName().endsWith(".mtmacset")) { if (!TabletopTool.confirm(I18N.getText("confirm.macro.exportSetInto"))) { return; } } else if (!TabletopTool.confirm(I18N.getText("confirm.macro.exportSetOverwrite"))) { return; } } EventQueue.invokeLater(new Runnable() { @Override public void run() { try { if (panelClass.equals("GlobalPanel")) { PersistenceUtil.saveMacroSet(MacroButtonPrefs.getButtonProperties(), selectedFile); } else if (panelClass.equals("CampaignPanel")) { PersistenceUtil.saveMacroSet(TabletopTool.getCampaign().getMacroButtonPropertiesArray(), selectedFile); } else if(panelClass.equals("SelectionPanel")) { if(areaGroup != null) { if(areaGroup.getGroupLabel().equals(I18N.getText("component.areaGroup.macro.commonMacros"))) { Boolean checkComparisons = TabletopTool.confirm("confirm.macro.checkComparisons"); List<MacroButtonProperties> commonMacros = TabletopTool.getFrame().getSelectionPanel().getCommonMacros(); List<MacroButtonProperties> exportList = new ArrayList<MacroButtonProperties>(); Boolean trusted = true; Boolean allowExport = true; for(MacroButtonProperties nextMacro : commonMacros) { trusted = true; allowExport = true; for(Token nextToken : TabletopTool.getFrame().getCurrentZoneRenderer().getSelectedTokensList()) { if(!AppUtil.playerOwns(nextToken)) { trusted = false; } if(nextToken.getMacroList(trusted).size() > 0) { for(MacroButtonProperties nextCompMacro : nextToken.getMacroList(trusted)) { if(nextCompMacro.hashCodeForComparison() == nextMacro.hashCodeForComparison() && (!TabletopTool.getPlayer().isGM() || (!TabletopTool.getPlayer().isGM() && !nextCompMacro.getAllowPlayerEdits()))) { allowExport = false; } } } else { allowExport = false; } } if(checkComparisons) { if(confirmCommonExport(nextMacro)) { if(trusted && allowExport) { exportList.add(nextMacro); } else { TabletopTool.showWarning(I18N.getText("msg.warning.macro.willNotExport", nextMacro.getLabel())); } } else { return; } } else { if(trusted && allowExport) { exportList.add(nextMacro); } else { TabletopTool.showWarning(I18N.getText("msg.warning.macro.willNotExport", nextMacro.getLabel())); } } } PersistenceUtil.saveMacroSet(exportList, selectedFile); } else if (token != null){ Token tokenV = token.value(); Boolean trusted = AppUtil.playerOwns(tokenV); List<MacroButtonProperties> exportList = new ArrayList<MacroButtonProperties>(); for(MacroButtonProperties nextMacro : tokenV.getMacroList(trusted)) { if(TabletopTool.getPlayer().isGM() || (!TabletopTool.getPlayer().isGM() && nextMacro.getAllowPlayerEdits())) { exportList.add(nextMacro); } else { TabletopTool.showWarning(I18N.getText("msg.warning.macro.willNotExport", nextMacro.getLabel())); } } PersistenceUtil.saveMacroSet(exportList, selectedFile); } } } else if (token != null) PersistenceUtil.saveMacroSet(token.value().getMacroList(true), selectedFile); } catch (IOException ioe) { ioe.printStackTrace(); TabletopTool.showError(I18N.getText("msg.error.macro.exportSetFail", ioe)); } } }); } } private class ClearGroupAction extends AbstractAction { public ClearGroupAction() { putValue(Action.NAME, I18N.getText("action.macro.clearGroup")); } @Override public void actionPerformed(ActionEvent event) { if(TabletopTool.confirm(I18N.getText("confirm.macro.clearGroup", macroGroup))) { if (panelClass.equals("GlobalPanel")) { GlobalPanel.deleteButtonGroup(macroGroup); } else if (panelClass.equals("CampaignPanel")) { CampaignPanel.deleteButtonGroup(macroGroup); } else if (token != null){ token.value().deleteMacroGroup(macroGroup, true); } } } } private class ClearPanelAction extends AbstractAction { public ClearPanelAction() { putValue(Action.NAME, I18N.getText("action.macro.clearPanel")); } @Override public void actionPerformed(ActionEvent event) { if (panelClass.equals("GlobalPanel")) { if(TabletopTool.confirm(I18N.getText("confirm.macro.clearPanel", I18N.getText("panel.Global")))) { GlobalPanel.clearPanel(); } } else if (panelClass.equals("CampaignPanel")) { if(TabletopTool.confirm(I18N.getText("confirm.macro.clearPanel", I18N.getText("panel.Campaign")))) { CampaignPanel.clearPanel(); } } else if (token != null) { if(panelClass.equals("ImpersonatePanel")) { if(TabletopTool.confirm(I18N.getText("confirm.macro.clearPanel", I18N.getText("panel.Impersonate")))) { token.value().deleteAllMacros(true); } } } } } private Boolean confirmCommonExport(MacroButtonProperties buttonMacro) { Boolean failComparison = false; String comparisonResults = ""; if(!buttonMacro.getCompareGroup()) { failComparison = true; comparisonResults = comparisonResults + "<li>" + I18N.getText("component.label.macro.group") + "</li>"; } if(!buttonMacro.getCompareSortPrefix()) { failComparison = true; comparisonResults = comparisonResults + "<li>" + I18N.getText("component.label.macro.sortPrefix") + "</li>"; } if(!buttonMacro.getCompareCommand()) { failComparison = true; comparisonResults = comparisonResults + "<li>" + I18N.getText("component.label.macro.command") + "</li>"; } if(failComparison) { failComparison = TabletopTool.confirm(I18N.getText("confirm.macro.failComparison", buttonMacro.getLabel(), comparisonResults)); } return failComparison; } private Boolean confirmImport(MacroButtonProperties importMacro, String location) { return !TabletopTool.confirm(I18N.getText("confirm.macro.import", importMacro.getLabel(), location)); } }