diff --git a/Mage.Client/src/main/java/mage/client/dialog/PickCheckBoxDialog.form b/Mage.Client/src/main/java/mage/client/dialog/PickCheckBoxDialog.form
new file mode 100644
index 0000000000..de1e7b9612
--- /dev/null
+++ b/Mage.Client/src/main/java/mage/client/dialog/PickCheckBoxDialog.form
@@ -0,0 +1,223 @@
+
+
+
diff --git a/Mage.Client/src/main/java/mage/client/dialog/PickCheckBoxDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PickCheckBoxDialog.java
new file mode 100644
index 0000000000..a9d86c2044
--- /dev/null
+++ b/Mage.Client/src/main/java/mage/client/dialog/PickCheckBoxDialog.java
@@ -0,0 +1,594 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package mage.client.dialog;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.*;
+import javax.swing.AbstractAction;
+import javax.swing.ActionMap;
+import javax.swing.DefaultListModel;
+import javax.swing.InputMap;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JLayeredPane;
+import javax.swing.KeyStroke;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import mage.choices.Choice;
+import mage.client.MageFrame;
+import mage.client.util.SettingsManager;
+import mage.client.util.gui.GuiDisplayUtil;
+import mage.client.util.gui.MageDialogState;
+
+/**
+ *
+ * @author JayDi85
+ * @author Salco
+ */
+
+public class PickCheckBoxDialog extends MageDialog {
+
+ Choice choice;
+ ArrayList allItems = new ArrayList<>();
+ DefaultListModel dataModel = new DefaultListModel();
+ CheckBoxList.CheckBoxListModel m_dataModel;
+
+ CheckBoxList tList;
+
+ final private static String HTML_TEMPLATE = "%s
";
+
+ private void setFocus(CheckBoxList obj){
+
+ if (!(obj instanceof java.awt.Component)) {
+ throw new IllegalArgumentException("Must be a java.awt.Component!");
+ }
+ this.scrollList.setViewportView((java.awt.Component)obj);
+ }
+ private javax.swing.JList get_a_Jlist_from_ScrollListView(){
+ return ((javax.swing.JList)this.scrollList.getViewport().getView());
+ }
+
+ private void restoreData(Object dataFrom){
+ this.allItems.forEach((item) -> {
+ ((CheckBoxList.CheckBoxListModel)dataFrom).addElement(item.getObjectValue());
+ });
+ }
+
+ public void showDialog(Choice choice) {
+ showDialog(choice, null, null, null);
+ }
+
+ public void showDialog(Choice choice, String startSelectionValue) {
+ showDialog(choice, null, null, startSelectionValue);
+ }
+
+ public void showDialog(Choice choice, UUID objectId, MageDialogState mageDialogState) {
+ showDialog(choice, objectId, mageDialogState, null);
+ }
+
+ public void showDialog(Choice choice, UUID objectId, MageDialogState mageDialogState, String startSelectionValue) {
+ this.choice = choice;
+ KeyValueItem tempKeyValue;
+ int indexInTList;
+
+ setLabelText(this.labelMessage, choice.getMessage());
+ setLabelText(this.labelSubMessage, choice.getSubMessage());
+
+ btCancel.setEnabled(!choice.isRequired());
+
+ // 2 modes: string or key-values
+ // sore data in allItems for inremental filtering
+ // http://logicbig.com/tutorials/core-java-tutorial/swing/list-filter/
+ this.allItems.clear();
+ if (choice.isKeyChoice()){
+ for (Map.Entry entry: choice.getKeyChoices().entrySet()) {
+ if(tList != null){
+ indexInTList = m_dataModel.indexOf(entry.getKey());
+ tempKeyValue=new KeyValueItem(entry.getKey(), entry.getValue(),(CheckBoxList.CheckBoxListItem) this.tList.getModel().getElementAt(indexInTList));
+ }
+ else{
+ tempKeyValue=new KeyValueItem(entry.getKey(), entry.getValue());
+ }
+ this.allItems.add(tempKeyValue);
+ }
+ } else {
+ for (String value: choice.getChoices()){
+ if(tList != null){
+ indexInTList = m_dataModel.indexOf(value);
+ tempKeyValue=new KeyValueItem(value, value,(CheckBoxList.CheckBoxListItem) tList.getModel().getElementAt(indexInTList));
+ }
+ else{
+ tempKeyValue=new KeyValueItem(value, value);
+ }
+ this.allItems.add(tempKeyValue);
+ }
+ }
+
+ // sorting
+ if(choice.isSortEnabled()){
+ Collections.sort(this.allItems, new Comparator() {
+ @Override
+ public int compare(KeyValueItem o1, KeyValueItem o2) {
+ Integer n1 = choice.getSortData().get(o1.getKey());
+ Integer n2 = choice.getSortData().get(o2.getKey());
+ return n1.compareTo(n2);
+ }
+ });
+ }
+
+ // search
+ if(choice.isSearchEnabled())
+ {
+ panelSearch.setVisible(true);
+ this.editSearch.setText(choice.getSearchText());
+ }else{
+ panelSearch.setVisible(false);
+ this.editSearch.setText("");
+ }
+
+ // listeners for inremental filtering
+ editSearch.getDocument().addDocumentListener(new DocumentListener() {
+ @Override
+ public void insertUpdate(DocumentEvent e) {
+ choice.setSearchText(editSearch.getText());
+ loadData();
+ }
+
+ @Override
+ public void removeUpdate(DocumentEvent e) {
+ choice.setSearchText(editSearch.getText());
+ loadData();
+ }
+
+ @Override
+ public void changedUpdate(DocumentEvent e) {
+ choice.setSearchText(editSearch.getText());
+ loadData();
+ }
+ });
+
+ // listeners for select up and down without edit focus lost
+ editSearch.addKeyListener(new KeyListener() {
+ @Override
+ public void keyTyped(KeyEvent e) {
+ //System.out.println("types");
+ }
+
+ @Override
+ public void keyPressed(KeyEvent e) {
+ if(e.getKeyCode() == KeyEvent.VK_UP){
+ doPrevSelect();
+ }else if(e.getKeyCode() == KeyEvent.VK_DOWN){
+ doNextSelect();
+ }
+ }
+
+ @Override
+ public void keyReleased(KeyEvent e) {
+ //System.out.println("released");
+ }
+ });
+
+ // listeners double click choose
+ listChoices.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ if(e.getClickCount() == 2){
+ doChoose();
+ }
+ }
+ });
+
+ // listeners for ESC close
+ if(!choice.isRequired()){
+ String cancelName = "cancel";
+ InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
+ inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), cancelName);
+ ActionMap actionMap = getRootPane().getActionMap();
+ actionMap.put(cancelName, new AbstractAction() {
+ public void actionPerformed(ActionEvent e) {
+ doCancel();
+ }
+ });
+ }
+
+ // window settings
+ if (this.isModal()){
+ MageFrame.getDesktop().add(this, JLayeredPane.MODAL_LAYER);
+ }else{
+ MageFrame.getDesktop().add(this, JLayeredPane.PALETTE_LAYER);
+ }
+ if (mageDialogState != null) {
+ mageDialogState.setStateToDialog(this);
+
+ } else {
+ Point centered = SettingsManager.instance.getComponentPosition(getWidth(), getHeight());
+ this.setLocation(centered.x, centered.y);
+ GuiDisplayUtil.keepComponentInsideScreen(centered.x, centered.y, this);
+ }
+
+ // final load
+ loadData();
+
+ // start selection
+ if((startSelectionValue != null)){
+ javax.swing.JList currentlistChoices;// = new javax.swing.JList();
+ currentlistChoices=this.get_a_Jlist_from_ScrollListView();
+ /*currentlistChoices = this.listChoices;*/
+ int selectIndex = -1;
+ for(int i = 0; i < this.listChoices.getModel().getSize(); i++){
+ //KeyValueItem listItem = (KeyValueItem)currentlistChoices.getModel().getElementAt(i);
+ String elementOfList = currentlistChoices.getModel().getElementAt(i).toString();
+ if (elementOfList.equals(startSelectionValue)){
+ selectIndex = i;
+ break;
+ }
+ }
+
+ if(selectIndex >= 0){
+ // currentlistChoices=this.get_a_Jlist_from_ScrollListView();
+ /*currentlistChoices = this.listChoices;*/
+ currentlistChoices.setSelectedIndex(selectIndex);
+ currentlistChoices.ensureIndexIsVisible(selectIndex);
+ }
+ }
+
+ this.setVisible(true);
+ }
+
+ public void setWindowSize(int width, int heigth){
+ this.setSize(new Dimension(width, heigth));
+ }
+
+ private void loadData(){
+ // load data to datamodel after filter or on startup
+ String filter = choice.getSearchText();
+ if (filter == null){ filter = ""; }
+ filter = filter.toLowerCase();
+
+ this.dataModel.clear();
+ this.m_dataModel.clear();
+ for(KeyValueItem item: this.allItems){
+ if(!choice.isSearchEnabled() || item.Value.toLowerCase().contains(filter)){
+ this.dataModel.addElement(item);
+ this.m_dataModel.addElement(item.getObjectValue());
+ }
+ }
+ }
+
+ private void setLabelText(JLabel label, String text){
+ if ((text != null) && !text.equals("")){
+ label.setText(String.format(HTML_TEMPLATE, text));
+ label.setVisible(true);
+ }else{
+ label.setText("");
+ label.setVisible(false);
+ }
+ }
+
+ private void doNextSelect(){
+ int newSel = this.listChoices.getSelectedIndex() + 1;
+ int maxSel = this.listChoices.getModel().getSize() - 1;
+ if(newSel <= maxSel){
+ this.listChoices.setSelectedIndex(newSel);
+ this.listChoices.ensureIndexIsVisible(newSel);
+ }
+ }
+
+ private void doPrevSelect(){
+ int newSel = this.listChoices.getSelectedIndex() - 1;
+ if(newSel >= 0){
+ this.listChoices.setSelectedIndex(newSel);
+ this.listChoices.ensureIndexIsVisible(newSel);
+ }
+ }
+
+ private void doChoose(){
+ if((tList != null)||(setChoice())){
+ this.m_dataModel.clear();
+ restoreData(this.m_dataModel);
+ this.hideDialog();
+ }
+ }
+
+ private void doCancel(){
+ this.listChoices.clearSelection();
+ this.choice.clearChoice();
+ hideDialog();
+ }
+
+ /**
+ * Creates new form PickChoiceDialog
+ * @param list
+ */
+ public PickCheckBoxDialog(CheckBoxList list) {
+ initComponents();
+ tList=list;
+
+ this.listChoices.setModel(dataModel);
+ this.setModal(true);
+
+ if(tList != null)
+ {
+ this.listChoices.setVisible(false);
+
+ m_dataModel= ( CheckBoxList.CheckBoxListModel )tList.getModel();
+ tList.setSelectionForeground(Color.BLUE);
+
+ if(this.tList instanceof javax.swing.JList){
+ setFocus(tList);
+ }
+
+ }
+ }
+ /**
+ * Creates new form PickChoiceDialog
+ */
+ public PickCheckBoxDialog() {
+ this(null);
+ }
+
+ public boolean setChoice() {
+ KeyValueItem item = (KeyValueItem)this.listChoices.getSelectedValue();
+
+ // auto select one item (after incemental filtering)
+ if((item == null) && (this.listChoices.getModel().getSize() == 1)){
+ this.listChoices.setSelectedIndex(0);
+ item = (KeyValueItem)this.listChoices.getSelectedValue();
+ }
+
+ if(item != null){
+ if(choice.isKeyChoice()){
+ choice.setChoiceByKey(item.getKey());
+ }else{
+ choice.setChoice(item.getKey());
+ }
+ return true;
+ }else{
+ choice.clearChoice();
+ return false;
+ }
+ }
+
+ class KeyValueItem
+ {
+ private final String Key;
+ private final String Value;
+ private final CheckBoxList.CheckBoxListItem objectValue;
+
+ public KeyValueItem(String value) {
+ this(value,null,null);
+ }
+ public KeyValueItem(String value, String label) {
+ this(value,label,null);
+ }
+ public KeyValueItem(String value, String label,CheckBoxList.CheckBoxListItem object) {
+ this.Key = value;
+ this.Value = label;
+ this.objectValue = object;
+ }
+
+ public String getKey() {
+ return this.Key;
+ }
+
+ public String getValue() {
+ return this.Value;
+ }
+
+ public Object getObjectValue(){
+ return (CheckBoxList.CheckBoxListItem)this.objectValue;
+ }
+
+ @Override
+ public String toString() {
+ return this.Value;
+ }
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
+ */
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ panelHeader = new javax.swing.JPanel();
+ labelMessage = new javax.swing.JLabel();
+ labelSubMessage = new javax.swing.JLabel();
+ panelSearch = new javax.swing.JPanel();
+ labelSearch = new javax.swing.JLabel();
+ editSearch = new javax.swing.JTextField();
+ scrollList = new javax.swing.JScrollPane();
+ listChoices = new javax.swing.JList();
+ panelCommands = new javax.swing.JPanel();
+ btOK = new javax.swing.JButton();
+ btCancel = new javax.swing.JButton();
+ btClear = new javax.swing.JButton();
+
+ labelMessage.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
+ labelMessage.setText("example long message example long message example long message example long message example long message
");
+
+ labelSubMessage.setFont(labelSubMessage.getFont().deriveFont((labelSubMessage.getFont().getStyle() | java.awt.Font.ITALIC) | java.awt.Font.BOLD));
+ labelSubMessage.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
+ labelSubMessage.setText("example long message example long
");
+
+ javax.swing.GroupLayout panelHeaderLayout = new javax.swing.GroupLayout(panelHeader);
+ panelHeader.setLayout(panelHeaderLayout);
+ panelHeaderLayout.setHorizontalGroup(
+ panelHeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelHeaderLayout.createSequentialGroup()
+ .addGroup(panelHeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(labelMessage, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
+ .addComponent(labelSubMessage, javax.swing.GroupLayout.Alignment.TRAILING))
+ .addGap(0, 0, 0))
+ );
+ panelHeaderLayout.setVerticalGroup(
+ panelHeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelHeaderLayout.createSequentialGroup()
+ .addGap(0, 0, Short.MAX_VALUE)
+ .addComponent(labelMessage)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(labelSubMessage, javax.swing.GroupLayout.DEFAULT_SIZE, 30, Short.MAX_VALUE))
+ );
+
+ labelSearch.setText("Search:");
+
+ editSearch.setText("sample search text");
+
+ javax.swing.GroupLayout panelSearchLayout = new javax.swing.GroupLayout(panelSearch);
+ panelSearch.setLayout(panelSearchLayout);
+ panelSearchLayout.setHorizontalGroup(
+ panelSearchLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelSearchLayout.createSequentialGroup()
+ .addGap(0, 0, 0)
+ .addComponent(labelSearch)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(editSearch)
+ .addGap(0, 0, 0))
+ );
+ panelSearchLayout.setVerticalGroup(
+ panelSearchLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelSearchLayout.createSequentialGroup()
+ .addGap(3, 3, 3)
+ .addGroup(panelSearchLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(labelSearch)
+ .addComponent(editSearch, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGap(3, 3, 3))
+ );
+
+ listChoices.setModel(new javax.swing.AbstractListModel() {
+ String[] strings = { "item1", "item2", "item3" };
+ public int getSize() { return strings.length; }
+ public Object getElementAt(int i) { return strings[i]; }
+ });
+ scrollList.setViewportView(listChoices);
+
+ btOK.setText("Choose");
+ btOK.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ btOKActionPerformed(evt);
+ }
+ });
+
+ btCancel.setText("Cancel");
+ btCancel.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ btCancelActionPerformed(evt);
+ }
+ });
+
+ btClear.setText("Clear");
+ btClear.setMinimumSize(new java.awt.Dimension(30, 25));
+ btClear.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ btClearActionPerformed(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(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(btClear, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(btOK)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(btCancel, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ );
+ panelCommandsLayout.setVerticalGroup(
+ panelCommandsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelCommandsLayout.createSequentialGroup()
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGroup(panelCommandsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(btCancel)
+ .addComponent(btOK)
+ .addComponent(btClear, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addContainerGap())
+ );
+
+ getRootPane().setDefaultButton(btOK);
+ getRootPane().setDefaultButton(btOK);
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+ getContentPane().setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(scrollList, javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(panelCommands, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(panelHeader, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(panelSearch, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addContainerGap())
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(panelHeader, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(panelSearch, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(scrollList, javax.swing.GroupLayout.DEFAULT_SIZE, 240, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(panelCommands, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addContainerGap())
+ );
+
+ pack();
+ }// //GEN-END:initComponents
+
+ private void btOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btOKActionPerformed
+ doChoose();
+ }//GEN-LAST:event_btOKActionPerformed
+
+ private void btCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btCancelActionPerformed
+ doCancel();
+ }//GEN-LAST:event_btCancelActionPerformed
+
+ /**
+ * Closes the dialog
+ */
+ private void closeDialog(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_closeDialog
+ doCancel();
+ }//GEN-LAST:event_closeDialog
+
+ private void btClearActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btClearActionPerformed
+ // TODO add your handling code here:
+ this.tList.uncheckAll();
+ //this.tList.repaint();
+ scrollList.repaint();
+ }//GEN-LAST:event_btClearActionPerformed
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton btCancel;
+ private javax.swing.JButton btClear;
+ private javax.swing.JButton btOK;
+ private javax.swing.JTextField editSearch;
+ private javax.swing.JLabel labelMessage;
+ private javax.swing.JLabel labelSearch;
+ private javax.swing.JLabel labelSubMessage;
+ private javax.swing.JList listChoices;
+ private javax.swing.JPanel panelCommands;
+ private javax.swing.JPanel panelHeader;
+ private javax.swing.JPanel panelSearch;
+ private javax.swing.JScrollPane scrollList;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/Mage.Client/src/main/java/mage/client/dialog/PickChoiceDialog.form b/Mage.Client/src/main/java/mage/client/dialog/PickChoiceDialog.form
index de1e7b9612..8f4d4356cd 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/PickChoiceDialog.form
+++ b/Mage.Client/src/main/java/mage/client/dialog/PickChoiceDialog.form
@@ -39,7 +39,7 @@
-
+
@@ -55,8 +55,8 @@
-
-
+
+
@@ -65,10 +65,10 @@
-
+
-
-
+
+
@@ -158,14 +158,12 @@
-
-
-
-
-
-
-
+
+
+
+
+
@@ -176,7 +174,6 @@
-
@@ -203,21 +200,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/Mage.Client/src/main/java/mage/client/dialog/PickChoiceDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PickChoiceDialog.java
index add88fddba..9a73c93a9b 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/PickChoiceDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/PickChoiceDialog.java
@@ -5,7 +5,6 @@
*/
package mage.client.dialog;
-import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.ActionEvent;
@@ -33,7 +32,6 @@ import mage.client.util.gui.MageDialogState;
/**
*
* @author JayDi85
- * @author Salco
*/
public class PickChoiceDialog extends MageDialog {
@@ -41,29 +39,9 @@ public class PickChoiceDialog extends MageDialog {
Choice choice;
ArrayList allItems = new ArrayList<>();
DefaultListModel dataModel = new DefaultListModel();
- CheckBoxList.CheckBoxListModel m_dataModel;
-
- CheckBoxList tList;
final private static String HTML_TEMPLATE = "%s
";
- private void setFocus(CheckBoxList obj){
-
- if (!(obj instanceof java.awt.Component)) {
- throw new IllegalArgumentException("Must be a java.awt.Component!");
- }
- this.scrollList.setViewportView((java.awt.Component)obj);
- }
- private javax.swing.JList get_a_Jlist_from_ScrollListView(){
- return ((javax.swing.JList)this.scrollList.getViewport().getView());
- }
-
- private void restoreData(Object dataFrom){
- this.allItems.forEach((item) -> {
- ((CheckBoxList.CheckBoxListModel)dataFrom).addElement(item.getObjectValue());
- });
- }
-
public void showDialog(Choice choice) {
showDialog(choice, null, null, null);
}
@@ -78,9 +56,7 @@ public class PickChoiceDialog extends MageDialog {
public void showDialog(Choice choice, UUID objectId, MageDialogState mageDialogState, String startSelectionValue) {
this.choice = choice;
- KeyValueItem tempKeyValue;
- int indexInTList;
-
+
setLabelText(this.labelMessage, choice.getMessage());
setLabelText(this.labelSubMessage, choice.getSubMessage());
@@ -92,25 +68,11 @@ public class PickChoiceDialog extends MageDialog {
this.allItems.clear();
if (choice.isKeyChoice()){
for (Map.Entry entry: choice.getKeyChoices().entrySet()) {
- if(tList != null){
- indexInTList = m_dataModel.indexOf(entry.getKey());
- tempKeyValue=new KeyValueItem(entry.getKey(), entry.getValue(),(CheckBoxList.CheckBoxListItem) this.tList.getModel().getElementAt(indexInTList));
- }
- else{
- tempKeyValue=new KeyValueItem(entry.getKey(), entry.getValue());
- }
- this.allItems.add(tempKeyValue);
+ this.allItems.add(new KeyValueItem(entry.getKey(), entry.getValue()));
}
} else {
for (String value: choice.getChoices()){
- if(tList != null){
- indexInTList = m_dataModel.indexOf(value);
- tempKeyValue=new KeyValueItem(value, value,(CheckBoxList.CheckBoxListItem) tList.getModel().getElementAt(indexInTList));
- }
- else{
- tempKeyValue=new KeyValueItem(value, value);
- }
- this.allItems.add(tempKeyValue);
+ this.allItems.add(new KeyValueItem(value, value));
}
}
@@ -119,8 +81,8 @@ public class PickChoiceDialog extends MageDialog {
Collections.sort(this.allItems, new Comparator() {
@Override
public int compare(KeyValueItem o1, KeyValueItem o2) {
- Integer n1 = choice.getSortData().get(o1.getKey());
- Integer n2 = choice.getSortData().get(o2.getKey());
+ Integer n1 = choice.getSortData().get(o1.Key);
+ Integer n2 = choice.getSortData().get(o2.Key);
return n1.compareTo(n2);
}
});
@@ -222,24 +184,18 @@ public class PickChoiceDialog extends MageDialog {
// start selection
if((startSelectionValue != null)){
- javax.swing.JList currentlistChoices;// = new javax.swing.JList();
- currentlistChoices=this.get_a_Jlist_from_ScrollListView();
- /*currentlistChoices = this.listChoices;*/
int selectIndex = -1;
for(int i = 0; i < this.listChoices.getModel().getSize(); i++){
- //KeyValueItem listItem = (KeyValueItem)currentlistChoices.getModel().getElementAt(i);
- String elementOfList = currentlistChoices.getModel().getElementAt(i).toString();
- if (elementOfList.equals(startSelectionValue)){
+ KeyValueItem listItem = (KeyValueItem)this.listChoices.getModel().getElementAt(i);
+ if (listItem.Key.equals(startSelectionValue)){
selectIndex = i;
break;
}
}
if(selectIndex >= 0){
- // currentlistChoices=this.get_a_Jlist_from_ScrollListView();
- /*currentlistChoices = this.listChoices;*/
- currentlistChoices.setSelectedIndex(selectIndex);
- currentlistChoices.ensureIndexIsVisible(selectIndex);
+ this.listChoices.setSelectedIndex(selectIndex);
+ this.listChoices.ensureIndexIsVisible(selectIndex);
}
}
@@ -252,16 +208,14 @@ public class PickChoiceDialog extends MageDialog {
private void loadData(){
// load data to datamodel after filter or on startup
- String filter = choice.getSearchText();
+ String filter = choice.getSearchText();
if (filter == null){ filter = ""; }
- filter = filter.toLowerCase();
+ filter = filter.toLowerCase(Locale.ENGLISH);
this.dataModel.clear();
- this.m_dataModel.clear();
for(KeyValueItem item: this.allItems){
- if(!choice.isSearchEnabled() || item.Value.toLowerCase().contains(filter)){
+ if(!choice.isSearchEnabled() || item.Value.toLowerCase(Locale.ENGLISH).contains(filter)){
this.dataModel.addElement(item);
- this.m_dataModel.addElement(item.getObjectValue());
}
}
}
@@ -294,9 +248,7 @@ public class PickChoiceDialog extends MageDialog {
}
private void doChoose(){
- if((tList != null)||(setChoice())){
- this.m_dataModel.clear();
- restoreData(this.m_dataModel);
+ if(setChoice()){
this.hideDialog();
}
}
@@ -307,35 +259,13 @@ public class PickChoiceDialog extends MageDialog {
hideDialog();
}
- /**
- * Creates new form PickChoiceDialog
- * @param list
- */
- public PickChoiceDialog(CheckBoxList list) {
- initComponents();
- tList=list;
-
- this.listChoices.setModel(dataModel);
- this.setModal(true);
-
- if(tList != null)
- {
- this.listChoices.setVisible(false);
-
- m_dataModel= ( CheckBoxList.CheckBoxListModel )tList.getModel();
- tList.setSelectionForeground(Color.BLUE);
-
- if(this.tList instanceof javax.swing.JList){
- setFocus(tList);
- }
-
- }
- }
/**
* Creates new form PickChoiceDialog
*/
public PickChoiceDialog() {
- this(null);
+ initComponents();
+ this.listChoices.setModel(dataModel);
+ this.setModal(true);
}
public boolean setChoice() {
@@ -364,31 +294,19 @@ public class PickChoiceDialog extends MageDialog {
{
private final String Key;
private final String Value;
- private final CheckBoxList.CheckBoxListItem objectValue;
-
- public KeyValueItem(String value) {
- this(value,null,null);
- }
- public KeyValueItem(String value, String label) {
- this(value,label,null);
- }
- public KeyValueItem(String value, String label,CheckBoxList.CheckBoxListItem object) {
+
+ public KeyValueItem(String value, String label) {
this.Key = value;
this.Value = label;
- this.objectValue = object;
}
public String getKey() {
return this.Key;
- }
+ }
public String getValue() {
return this.Value;
}
-
- public Object getObjectValue(){
- return (CheckBoxList.CheckBoxListItem)this.objectValue;
- }
@Override
public String toString() {
@@ -416,7 +334,6 @@ public class PickChoiceDialog extends MageDialog {
panelCommands = new javax.swing.JPanel();
btOK = new javax.swing.JButton();
btCancel = new javax.swing.JButton();
- btClear = new javax.swing.JButton();
labelMessage.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
labelMessage.setText("example long message example long message example long message example long message example long message
");
@@ -431,17 +348,17 @@ public class PickChoiceDialog extends MageDialog {
panelHeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelHeaderLayout.createSequentialGroup()
.addGroup(panelHeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(labelMessage, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
- .addComponent(labelSubMessage, javax.swing.GroupLayout.Alignment.TRAILING))
+ .addComponent(labelMessage, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 210, Short.MAX_VALUE)
+ .addComponent(labelSubMessage, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 210, Short.MAX_VALUE))
.addGap(0, 0, 0))
);
panelHeaderLayout.setVerticalGroup(
panelHeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelHeaderLayout.createSequentialGroup()
- .addGap(0, 0, Short.MAX_VALUE)
+ .addGap(0, 0, 0)
.addComponent(labelMessage)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(labelSubMessage, javax.swing.GroupLayout.DEFAULT_SIZE, 30, Short.MAX_VALUE))
+ .addGap(0, 0, 0)
+ .addComponent(labelSubMessage))
);
labelSearch.setText("Search:");
@@ -490,39 +407,30 @@ public class PickChoiceDialog extends MageDialog {
}
});
- btClear.setText("Clear");
- btClear.setMinimumSize(new java.awt.Dimension(30, 25));
- btClear.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- btClearActionPerformed(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(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addComponent(btClear, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btOK)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(btCancel, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addComponent(btCancel, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addContainerGap())
);
+
+ panelCommandsLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {btCancel, btOK});
+
panelCommandsLayout.setVerticalGroup(
panelCommandsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelCommandsLayout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(panelCommandsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(btCancel)
- .addComponent(btOK)
- .addComponent(btClear, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addComponent(btOK))
.addContainerGap())
);
- getRootPane().setDefaultButton(btOK);
getRootPane().setDefaultButton(btOK);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
@@ -546,7 +454,7 @@ public class PickChoiceDialog extends MageDialog {
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(panelSearch, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(scrollList, javax.swing.GroupLayout.DEFAULT_SIZE, 240, Short.MAX_VALUE)
+ .addComponent(scrollList, javax.swing.GroupLayout.DEFAULT_SIZE, 246, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(panelCommands, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
@@ -570,16 +478,8 @@ public class PickChoiceDialog extends MageDialog {
doCancel();
}//GEN-LAST:event_closeDialog
- private void btClearActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btClearActionPerformed
- // TODO add your handling code here:
- this.tList.uncheckAll();
- //this.tList.repaint();
- scrollList.repaint();
- }//GEN-LAST:event_btClearActionPerformed
-
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btCancel;
- private javax.swing.JButton btClear;
private javax.swing.JButton btOK;
private javax.swing.JTextField editSearch;
private javax.swing.JLabel labelMessage;
@@ -591,4 +491,4 @@ public class PickChoiceDialog extends MageDialog {
private javax.swing.JPanel panelSearch;
private javax.swing.JScrollPane scrollList;
// End of variables declaration//GEN-END:variables
-}
+}
\ No newline at end of file