diff --git a/Mage.Client/src/main/java/mage/client/dialog/PickMultiNumberDialog.form b/Mage.Client/src/main/java/mage/client/dialog/PickMultiNumberDialog.form index a0252c10eb3..e378abbf8d6 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PickMultiNumberDialog.form +++ b/Mage.Client/src/main/java/mage/client/dialog/PickMultiNumberDialog.form @@ -1,6 +1,6 @@ -
+ @@ -14,71 +14,17 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - + + + + + @@ -87,17 +33,104 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Mage.Client/src/main/java/mage/client/dialog/PickMultiNumberDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PickMultiNumberDialog.java index 0988125a6d3..27a0052a81a 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PickMultiNumberDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/PickMultiNumberDialog.java @@ -19,6 +19,8 @@ import java.util.stream.Collectors; */ public class PickMultiNumberDialog extends MageDialog { + private boolean cancel; + private List labelList = null; private List spinnerList = null; @@ -28,10 +30,12 @@ public class PickMultiNumberDialog extends MageDialog { } public void showDialog(List messages, int min, int max, Map options) { - this.header.setText((String) options.get("header")); - this.header.setHorizontalAlignment(SwingConstants.CENTER); + this.header.setText("" + ManaSymbols.replaceSymbolsWithHTML((String) options.get("header"), ManaSymbols.Type.DIALOG)); this.setTitle((String) options.get("title")); + boolean canCancel = options.get("canCancel") != null && (boolean) options.get("canCancel"); + btnCancel.setVisible(canCancel); + if (labelList != null) { for (JLabel label : labelList) { jPanel1.remove(label); @@ -79,7 +83,7 @@ public class PickMultiNumberDialog extends MageDialog { } } else { // text mode - label.setText("" + input); + label.setText("" + ManaSymbols.replaceSymbolsWithHTML(input, ManaSymbols.Type.DIALOG)); } labelC.weightx = 0.5; @@ -89,7 +93,7 @@ public class PickMultiNumberDialog extends MageDialog { labelList.add(label); JSpinner spinner = new JSpinner(); - spinner.setModel(new SpinnerNumberModel(messages.get(i).min, messages.get(i).min, messages.get(i).max, 1)); + spinner.setModel(new SpinnerNumberModel(messages.get(i).defaultValue, messages.get(i).min, messages.get(i).max, 1)); spinnerC.weightx = 0.5; spinnerC.gridx = 1; spinnerC.gridy = i; @@ -101,7 +105,6 @@ public class PickMultiNumberDialog extends MageDialog { spinnerList.add(spinner); } this.counterText.setText("0 out of 0"); - this.counterText.setHorizontalAlignment(SwingConstants.CENTER); updateControls(min, max, messages); @@ -124,7 +127,7 @@ public class PickMultiNumberDialog extends MageDialog { counterText.setText(totalChosenAmount + " out of " + max); chooseEnabled &= totalChosenAmount >= min && totalChosenAmount <= max; - chooseButton.setEnabled(chooseEnabled); + btnOk.setEnabled(chooseEnabled); } public String getMultiAmount() { @@ -134,6 +137,10 @@ public class PickMultiNumberDialog extends MageDialog { .map(String::valueOf) .collect(Collectors.joining(" ")); } + + public boolean isCancel() { + return cancel; + } /** * This method is called from within the constructor to initialize the form. @@ -144,82 +151,103 @@ public class PickMultiNumberDialog extends MageDialog { // //GEN-BEGIN:initComponents private void initComponents() { - chooseButton = new javax.swing.JButton(); - header = new javax.swing.JLabel(); - counterText = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane(); jPanel1 = new javax.swing.JPanel(); + panelCommands = new javax.swing.JPanel(); + btnOk = new javax.swing.JButton(); + btnCancel = new javax.swing.JButton(); + panelHeader = new javax.swing.JPanel(); + header = new javax.swing.JLabel(); + counterText = new javax.swing.JLabel(); - chooseButton.setText("Choose"); - chooseButton.setEnabled(false); - chooseButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - chooseButtonActionPerformed(evt); - } - }); - - header.setText("Header"); - - counterText.setText("Counter"); + getContentPane().setLayout(new java.awt.BorderLayout()); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 413, Short.MAX_VALUE) + .addGap(0, 598, Short.MAX_VALUE) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 273, Short.MAX_VALUE) + .addGap(0, 828, Short.MAX_VALUE) ); jScrollPane1.setViewportView(jPanel1); - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); - getContentPane().setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(12, 12, 12) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(header, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(counterText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - .addGroup(layout.createSequentialGroup() - .addGap(184, 184, 184) - .addComponent(chooseButton) - .addGap(0, 172, Short.MAX_VALUE)) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(jScrollPane1))) + getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER); + + btnOk.setText("Choose"); + btnOk.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnOkActionPerformed(evt); + } + }); + + btnCancel.setText("Cancel"); + btnCancel.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnCancelActionPerformed(evt); + } + }); + + javax.swing.GroupLayout panelCommandsLayout = new javax.swing.GroupLayout(panelCommands); + panelCommands.setLayout(panelCommandsLayout); + panelCommandsLayout.setHorizontalGroup( + panelCommandsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelCommandsLayout.createSequentialGroup() + .addContainerGap(257, Short.MAX_VALUE) + .addComponent(btnOk) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(btnCancel) .addContainerGap()) ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + panelCommandsLayout.setVerticalGroup( + panelCommandsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelCommandsLayout.createSequentialGroup() .addContainerGap() - .addComponent(header) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(counterText) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 276, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(chooseButton) + .addGroup(panelCommandsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(btnOk) + .addComponent(btnCancel)) .addContainerGap()) ); + + getRootPane().setDefaultButton(btnOk); + + getContentPane().add(panelCommands, java.awt.BorderLayout.SOUTH); + + panelHeader.setLayout(new java.awt.BorderLayout()); + + header.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + header.setText("Header 12312321312312"); + panelHeader.add(header, java.awt.BorderLayout.NORTH); + + counterText.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + counterText.setText("Counter 213123 213 213123213 123 123213123123123"); + panelHeader.add(counterText, java.awt.BorderLayout.SOUTH); + + getContentPane().add(panelHeader, java.awt.BorderLayout.NORTH); }// //GEN-END:initComponents - private void chooseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chooseButtonActionPerformed + private void btnOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOkActionPerformed + this.cancel = false; this.hideDialog(); - }//GEN-LAST:event_chooseButtonActionPerformed + }//GEN-LAST:event_btnOkActionPerformed + + private void btnCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelActionPerformed + this.cancel = true; + this.hideDialog(); + }//GEN-LAST:event_btnCancelActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JButton chooseButton; + private javax.swing.JButton btnCancel; + private javax.swing.JButton btnOk; private javax.swing.JLabel counterText; private javax.swing.JLabel header; private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JPanel panelCommands; + private javax.swing.JPanel panelHeader; // End of variables declaration//GEN-END:variables } diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java index 539126254ca..eb809d80c14 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -1785,7 +1785,11 @@ public final class GamePanel extends javax.swing.JPanel { DialogManager.getManager(gameId).fadeOut(); pickMultiNumber.showDialog(messages, min, max, lastGameData.options); - SessionHandler.sendPlayerString(gameId, pickMultiNumber.getMultiAmount()); + if (pickMultiNumber.isCancel()) { + SessionHandler.sendPlayerBoolean(gameId, false); + } else { + SessionHandler.sendPlayerString(gameId, pickMultiNumber.getMultiAmount()); + } } public void getChoice(int messageId, GameView gameView, Map options, Choice choice, UUID objectId) { diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index 9d34a804835..d5866a4ac33 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -2154,6 +2154,9 @@ public class HumanPlayer extends PlayerImpl { Map options = new HashMap<>(2); options.put("title", type.getTitle()); options.put("header", type.getHeader()); + if (type.isCanCancel()) { + options.put("canCancel", true); + } game.fireGetMultiAmountEvent(playerId, messages, min, max, options); } waitForResponse(game); @@ -2169,11 +2172,17 @@ public class HumanPlayer extends PlayerImpl { logger.error(String.format("GUI return wrong MultiAmountType values: %d %d %d - %s", needCount, min, max, response.getString())); game.informPlayer(this, "Error, you must enter correct values."); } + } else if (type.isCanCancel() && response.getBoolean() != null) { + answer = null; + break; } } if (answer != null) { return answer; + } else if (type.isCanCancel()) { + // cancel + return null; } else { // something wrong, e.g. player disconnected return defaultList; diff --git a/Mage/src/main/java/mage/constants/MultiAmountType.java b/Mage/src/main/java/mage/constants/MultiAmountType.java index 34d6e9e8100..a911deacd81 100644 --- a/Mage/src/main/java/mage/constants/MultiAmountType.java +++ b/Mage/src/main/java/mage/constants/MultiAmountType.java @@ -13,14 +13,21 @@ public enum MultiAmountType { MANA("Add mana", "Distribute mana among colors"), DAMAGE("Assign damage", "Assign damage among targets"), P1P1("Add +1/+1 counters", "Distribute +1/+1 counters among creatures"), - COUNTERS("Choose counters", "Move counters"); + COUNTERS("Choose counters", "Move counters"), + CHEAT_LANDS("Choose lands", "Add lands to your battlefield", true); private final String title; private final String header; + private final boolean canCancel; // choice dialog will return null instead default values MultiAmountType(String title, String header) { + this(title, header, false); + } + + MultiAmountType(String title, String header, boolean canCancel) { this.title = title; this.header = header; + this.canCancel = canCancel; } public String getTitle() { @@ -31,9 +38,13 @@ public enum MultiAmountType { return header; } + public boolean isCanCancel() { + return canCancel; + } + public static List prepareDefaltValues(List constraints, int min, int max) { // default values must be assigned from first to last by minimum values - List res = constraints.stream().map(m -> m.min > Integer.MIN_VALUE ? m.min : (0 < max ? 0 : max)) + List res = constraints.stream().map(m -> m.defaultValue > Integer.MIN_VALUE ? m.defaultValue : Math.min(0, max)) .collect(Collectors.toList()); if (res.isEmpty()) { return res; diff --git a/Mage/src/main/java/mage/util/MultiAmountMessage.java b/Mage/src/main/java/mage/util/MultiAmountMessage.java index c9e607777dc..569a31e731e 100644 --- a/Mage/src/main/java/mage/util/MultiAmountMessage.java +++ b/Mage/src/main/java/mage/util/MultiAmountMessage.java @@ -8,10 +8,16 @@ public class MultiAmountMessage implements Serializable { public String message; public int min; public int max; + public int defaultValue; public MultiAmountMessage(String message, int min, int max) { + this(message, min, max, min); + } + + public MultiAmountMessage(String message, int min, int max, int defaultValue) { this.message = message; this.min = min; this.max = max; + this.defaultValue = defaultValue; } }