/* * 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.buttons; 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.MacroButtonDialog; import com.t3.language.I18N; import com.t3.model.MacroButtonProperties; import com.t3.model.Token; import com.t3.persistence.PersistenceUtil; @SuppressWarnings("serial") public class MacroButtonPopupMenu extends JPopupMenu{ private final MacroButton button; private final String panelClass; public MacroButtonPopupMenu(MacroButton parent, String panelClass, Boolean commonMacro) { this.button = parent; this.panelClass = panelClass; if(panelClass.equals("SelectionPanel")) { if(button.getProperties().getCommonMacro()) { addCommonActions(); } else { addActions(); } } else if(panelClass.equals("CampaignPanel")) { addCampaignActions(); } else { addActions(); } } private void addActions() { if(TabletopTool.getPlayer().isGM() || button.getProperties().getAllowPlayerEdits()) { add(new EditButtonAction()); add(new JSeparator()); add(new AddNewButtonAction()); add(new DuplicateButtonAction()); add(new JSeparator()); add(new ResetButtonAction()); add(new DeleteButtonAction()); add(new JSeparator()); add(new ExportMacroAction()); add(new JSeparator()); add(new RunMacroForEachSelectedTokenAction()); } else { add(new AddNewButtonAction()); add(new JSeparator()); add(new RunMacroForEachSelectedTokenAction()); } } private void addCommonActions() { if(TabletopTool.getPlayer().isGM() || button.getProperties().getAllowPlayerEdits()) { add(new EditButtonAction()); add(new AddNewButtonAction(I18N.getText("action.macro.addNewToSelected"))); add(new DuplicateButtonAction(I18N.getText("action.macro.duplicateOnSelected"))); add(new JSeparator()); add(new DeleteButtonAction(I18N.getText("action.macro.deleteFromCommon"))); add(new JSeparator()); add(new ExportMacroAction(I18N.getText("action.macro.exportCommon"))); add(new JSeparator()); add(new RunMacroForEachSelectedTokenAction()); } else { add(new AddNewButtonAction(I18N.getText("action.macro.addNewToSelected"))); add(new JSeparator()); add(new RunMacroForEachSelectedTokenAction()); } } private void addCampaignActions() { if(TabletopTool.getPlayer().isGM()) { add(new EditButtonAction()); add(new JSeparator()); add(new AddNewButtonAction()); add(new DuplicateButtonAction()); add(new JSeparator()); add(new ResetButtonAction()); add(new DeleteButtonAction()); add(new JSeparator()); add(new ExportMacroAction()); add(new JSeparator()); add(new RunMacroForEachSelectedTokenAction()); } else { add(new RunMacroForEachSelectedTokenAction()); } } private class AddNewButtonAction extends AbstractAction { public AddNewButtonAction() { putValue(Action.NAME, I18N.getText("action.macro.new")); } public AddNewButtonAction(String name) { putValue(Action.NAME, name); } @Override public void actionPerformed(ActionEvent event) { // TODO: refactor to put tab index from Tab enum if (panelClass.equals("GlobalPanel")) { new MacroButtonProperties(panelClass, MacroButtonPrefs.getNextIndex(), button.getProperties().getGroup()); } else if (panelClass.equals("CampaignPanel")) { new MacroButtonProperties(panelClass, TabletopTool.getCampaign().getMacroButtonNextIndex(), button.getProperties().getGroup()); } else if(panelClass.equals("SelectionPanel")) { if(TabletopTool.getFrame().getSelectionPanel().getCommonMacros().contains(button.getProperties())) { for(Token nextToken : TabletopTool.getFrame().getCurrentZoneRenderer().getSelectedTokensList()) { new MacroButtonProperties(nextToken, nextToken.getMacroNextIndex(), button.getProperties().getGroup()); } } else { new MacroButtonProperties(button.getToken(), button.getToken().getMacroNextIndex(), button.getProperties().getGroup()); } } else if (button.getToken()!= null){ new MacroButtonProperties(button.getToken(), button.getToken().getMacroNextIndex(), button.getProperties().getGroup()); } } } private class EditButtonAction extends AbstractAction { public EditButtonAction() { putValue(Action.NAME, I18N.getText("action.macro.edit")); } @Override public void actionPerformed(ActionEvent event) { new MacroButtonDialog().show(button); } } private class DeleteButtonAction extends AbstractAction { public DeleteButtonAction() { putValue(Action.NAME, I18N.getText("action.macro.delete")); } public DeleteButtonAction(String name) { putValue(Action.NAME, name); } @Override public void actionPerformed(ActionEvent event) { if(TabletopTool.confirm(I18N.getText("confirm.macro.delete", button.getProperties().getLabel()))) { // remove the hot key or the hot key will remain and you'll get an exception later // when you want to assign that hotkey to another button. button.clearHotkey(); if (panelClass.equals("GlobalPanel")) { MacroButtonPrefs.delete(button.getProperties()); } else if (panelClass.equals("CampaignPanel")) { TabletopTool.getCampaign().deleteMacroButton(button.getProperties()); } else if(panelClass.equals("SelectionPanel")) { if(TabletopTool.getFrame().getSelectionPanel().getCommonMacros().contains(button.getProperties())) { for(Token nextToken : TabletopTool.getFrame().getCurrentZoneRenderer().getSelectedTokensList()) { if(AppUtil.playerOwns(nextToken)) { List<MacroButtonProperties> workingMacros = new ArrayList<MacroButtonProperties>(); Boolean hashCodesMatch = false; Boolean allowDelete = false; for(MacroButtonProperties nextMacro : nextToken.getMacroList(true)) { hashCodesMatch = nextMacro.hashCodeForComparison() == button.getProperties().hashCodeForComparison(); allowDelete = TabletopTool.getPlayer().isGM() || (!TabletopTool.getPlayer().isGM() && nextMacro.getAllowPlayerEdits()); if(!hashCodesMatch || !allowDelete) { workingMacros.add(nextMacro); } } nextToken.replaceMacroList(workingMacros); } } } else { button.getToken().deleteMacroButtonProperty(button.getProperties()); } TabletopTool.getFrame().getSelectionPanel().reset(); } else if (button.getToken()!= null){ if(AppUtil.playerOwns(button.getToken())) { button.getToken().deleteMacroButtonProperty(button.getProperties()); } } } } } private class DuplicateButtonAction extends AbstractAction { public DuplicateButtonAction() { putValue(Action.NAME, I18N.getText("action.macro.duplicate")); } public DuplicateButtonAction(String name) { putValue(Action.NAME, name); } @Override public void actionPerformed(ActionEvent event) { if (panelClass.equals("GlobalPanel")) { new MacroButtonProperties(panelClass, MacroButtonPrefs.getNextIndex(), button.getProperties()); } else if (panelClass.equals("CampaignPanel")) { new MacroButtonProperties(panelClass, TabletopTool.getCampaign().getMacroButtonNextIndex(), button.getProperties()); } else if(panelClass.equals("SelectionPanel")) { if(TabletopTool.getFrame().getSelectionPanel().getCommonMacros().contains(button.getProperties())) { for(Token nextToken : TabletopTool.getFrame().getCurrentZoneRenderer().getSelectedTokensList()) { new MacroButtonProperties(nextToken, nextToken.getMacroNextIndex(), button.getProperties()); } } else { new MacroButtonProperties(button.getToken(), button.getToken().getMacroNextIndex(), button.getProperties()); } } else if (button.getToken() != null){ new MacroButtonProperties(button.getToken(), button.getToken().getMacroNextIndex(), button.getProperties()); } } } private class ResetButtonAction extends AbstractAction { public ResetButtonAction() { putValue(Action.NAME, I18N.getText("action.macro.reset")); } @Override public void actionPerformed(ActionEvent event) { if(TabletopTool.confirm(I18N.getText("confirm.macro.reset", button.getProperties().getLabel()))) { button.getProperties().reset(); button.getProperties().save(); } } } private class RunMacroForEachSelectedTokenAction extends AbstractAction { public RunMacroForEachSelectedTokenAction() { putValue(Action.NAME, I18N.getText("action.macro.runForEachSelected")); } @Override public void actionPerformed(ActionEvent event) { if (TabletopTool.getFrame().getCurrentZoneRenderer().getSelectedTokensList().size() > 0) { button.getProperties().executeMacro(TabletopTool.getFrame().getCurrentZoneRenderer().getSelectedTokensList()); } } } private class ExportMacroAction extends AbstractAction { private ExportMacroAction() { putValue(Action.NAME, I18N.getText("action.macro.export")); } private ExportMacroAction(String name) { putValue(Action.NAME, name); } @Override public void actionPerformed(ActionEvent event) { JFileChooser chooser = TabletopTool.getFrame().getSaveMacroFileChooser(); if (chooser.showSaveDialog(TabletopTool.getFrame()) != JFileChooser.APPROVE_OPTION) { return; } final File selectedFile = chooser.getSelectedFile(); EventQueue.invokeLater(new Runnable() { @Override public void run() { if (selectedFile.exists()) { if (selectedFile.getName().endsWith(".mtmacro")) { if (!TabletopTool.confirm(I18N.getText("confirm.macro.exportInto", button.getName()))) { return; } } else if (!TabletopTool.confirm(I18N.getText("confirm.macro.exportOverwrite"))) { return; } } try { if(panelClass.equals("SelectionPanel")) { if(TabletopTool.getFrame().getSelectionPanel().getCommonMacros().contains(button.getProperties())) { if(confirmCommonExport(button.getProperties())) { PersistenceUtil.saveMacro(button.getProperties(), selectedFile); } else { TabletopTool.showInformation(I18N.getText("msg.info.macro.exportCancel")); return; } } else { PersistenceUtil.saveMacro(button.getProperties(), selectedFile); } } PersistenceUtil.saveMacro(button.getProperties(), selectedFile); TabletopTool.showInformation(I18N.getText("msg.info.macro.exportSuccess")); } catch (IOException ioe) { ioe.printStackTrace(); TabletopTool.showError(I18N.getText("msg.error.macro.exportFail", ioe)); } } }); } } 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("msg.error.macro.exportFail", buttonMacro.getLabel(), comparisonResults)); } return failComparison; } }