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 @@
-
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;
}
}