From a592a44647c8f936b3718b0956eb725d6fc322bc Mon Sep 17 00:00:00 2001 From: drdev Date: Sat, 28 Dec 2013 20:23:41 +0000 Subject: [PATCH] Support input FOptionPane --- .../java/forge/gui/deckeditor/SEditorIO.java | 23 ++--- .../controllers/CEditorDraftingProcess.java | 18 +--- .../java/forge/gui/toolbox/FOptionPane.java | 97 ++++++++++++++++--- 3 files changed, 93 insertions(+), 45 deletions(-) diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/SEditorIO.java b/forge-gui/src/main/java/forge/gui/deckeditor/SEditorIO.java index 980a08e9395..cb1b7f32fb0 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/SEditorIO.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/SEditorIO.java @@ -1,7 +1,5 @@ package forge.gui.deckeditor; -import javax.swing.JOptionPane; - import org.apache.commons.lang3.StringUtils; import forge.Singletons; @@ -50,27 +48,20 @@ public class SEditorIO { } // Confirm if overwrite else if (controller.fileExists(name)) { - int confirmResult = JOptionPane.YES_OPTION; + boolean confirmResult = true; if ( !StringUtils.equals(name, controller.getModelName()) ) { // prompt only if name was changed - confirmResult = JOptionPane.showConfirmDialog(JOptionPane.getRootFrame(), + confirmResult = FOptionPane.showConfirmDialog( limitedDeckMode ? "Would you like to save changes to your deck?" : "There is already a deck named '" + name + "'. Overwrite?", - limitedDeckMode ? "Save changes?" : "Overwrite Deck?", - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE); + limitedDeckMode ? "Save changes?" : "Overwrite Deck?"); } - if (confirmResult == JOptionPane.YES_OPTION) { controller.save(); } + if (confirmResult) { controller.save(); } } // Confirm if a new deck will be created - else { - final int m = JOptionPane.showConfirmDialog(JOptionPane.getRootFrame(), - "This will create a new deck named '" + name + "'. Continue?", - "Create Deck?", - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE); - - if (m == JOptionPane.YES_OPTION) { controller.saveAs(name); } + else if (FOptionPane.showConfirmDialog("This will create a new deck named '" + + name + "'. Continue?", "Create Deck?")) { + controller.saveAs(name); } return true; diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java index be799bedafc..cf499c8e543 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java @@ -19,8 +19,6 @@ package forge.gui.deckeditor.controllers; import java.util.Map.Entry; -import javax.swing.JOptionPane; - import forge.Singletons; import forge.card.CardEdition; import forge.card.MagicColor; @@ -36,6 +34,7 @@ import forge.gui.deckeditor.views.VDeckgen; import forge.gui.framework.DragCell; import forge.gui.framework.FScreen; import forge.gui.home.sanctioned.CSubmenuDraft; +import forge.gui.toolbox.FOptionPane; import forge.gui.toolbox.itemmanager.CardManager; import forge.gui.toolbox.itemmanager.views.SColumnUtil; import forge.item.PaperCard; @@ -171,10 +170,7 @@ public class CEditorDraftingProcess extends ACEditorBase { *

*/ private void saveDraft() { - String s = JOptionPane.showInputDialog(JOptionPane.getRootFrame(), - "Save this draft as:", - "Save draft", - JOptionPane.QUESTION_MESSAGE); + String s = FOptionPane.showInputDialog("Save this draft as:", "Save Draft", FOptionPane.QUESTION_ICON); // Cancel button will be null; OK will return string. // Must check for null value first, then string length. @@ -187,14 +183,10 @@ public class CEditorDraftingProcess extends ACEditorBase { // Check for overwrite case for (DeckGroup d : Singletons.getModel().getDecks().getDraft()) { if (s.equalsIgnoreCase(d.getName())) { - final int m = JOptionPane.showConfirmDialog(JOptionPane.getRootFrame(), + if (!FOptionPane.showConfirmDialog( "There is already a deck named '" + s + "'. Overwrite?", - "Overwrite Deck?", - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE); - - // If no overwrite, recurse. - if (m == JOptionPane.NO_OPTION) { + "Overwrite Deck?", false)) { + // If no overwrite, recurse. saveDraft(); return; } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/FOptionPane.java b/forge-gui/src/main/java/forge/gui/toolbox/FOptionPane.java index 6c347456a85..5c2dd02ca8e 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/FOptionPane.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/FOptionPane.java @@ -1,5 +1,6 @@ package forge.gui.toolbox; +import java.awt.Component; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.event.ActionEvent; @@ -7,7 +8,6 @@ import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; -import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; @@ -56,27 +56,81 @@ public class FOptionPane extends FDialog { } public static int showOptionDialog(String message, String title, SkinImage icon, String[] options, int defaultOption) { - FTextArea txtMessage = new FTextArea(message); - FSkin.get(txtMessage).setFont(FSkin.getFont(14)); - txtMessage.setAutoSize(true); - Dimension parentSize = JOptionPane.getRootFrame().getSize(); - txtMessage.setMaximumSize(new Dimension(parentSize.width / 2, parentSize.height - 100)); - - FOptionPane optionPane = new FOptionPane(title, icon, txtMessage, options, defaultOption); + + final FOptionPane optionPane = new FOptionPane(message, title, icon, null, options, defaultOption); optionPane.setVisible(true); int dialogResult = optionPane.result; optionPane.dispose(); return dialogResult; } + public static String showInputDialog(String message, String title, SkinImage icon) { + return showInputDialog(message, title, icon, "", null); + } + + public static String showInputDialog(String message, String title, SkinImage icon, String initialInput) { + return showInputDialog(message, title, icon, initialInput, null); + } + + @SuppressWarnings("unchecked") + public static T showInputDialog(String message, String title, SkinImage icon, T initialInput, T[] inputOptions) { + final Component inputField; + FTextField txtInput = null; + FComboBox cbInput = null; + if (inputOptions == null) { + txtInput = new FTextField.Builder().text(initialInput.toString()).build(); + inputField = txtInput; + } + else { + cbInput = new FComboBox(inputOptions); + cbInput.setSelectedItem(initialInput); + inputField = cbInput; + } + + final FOptionPane optionPane = new FOptionPane(message, title, icon, inputField, new String[] {"OK", "Cancel"}, -1); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + inputField.requestFocusInWindow(); + } + }); + inputField.addKeyListener(new KeyAdapter() { //hook so pressing Enter on field accepts dialog + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + SwingUtilities.invokeLater(new Runnable() { //delay so enter can confirm input choice first + @Override + public void run() { + optionPane.result = 0; + optionPane.setVisible(false); + } + }); + } + } + }); + optionPane.setVisible(true); + int dialogResult = optionPane.result; + optionPane.dispose(); + if (dialogResult == 0) { + if (inputOptions == null) { + return (T)txtInput.getText(); + } + else { + return (T)cbInput.getSelectedItem(); + } + } + return null; + } + private int result = -1; //default result to -1, indicating dialog closed without choosing option - private FOptionPane(String title, SkinImage icon, JComponent comp, String[] options, int defaultOption) { + private FOptionPane(String message, String title, SkinImage icon, Component comp, String[] options, int defaultOption) { this.setTitle(title); - int padX = 10; - int gapBottom = 2 * padX; - int x = padX; + int padding = 10; + int x = padding; + int gapAboveButtons = padding * 3 / 2; + int gapBottom = comp == null ? gapAboveButtons: padding; if (icon != null) { FLabel lblIcon = new FLabel.Builder().icon(icon).build(); @@ -84,7 +138,18 @@ public class FOptionPane extends FDialog { this.add(lblIcon, "x " + (x - 3) + ", ay top, w " + labelWidth + ", h " + icon.getHeight() + ", gapbottom " + gapBottom); x += labelWidth; } - this.add(comp, "x " + x + ", wrap, gapbottom " + gapBottom); + if (message != null) { + FTextArea prompt = new FTextArea(message); + FSkin.get(prompt).setFont(FSkin.getFont(14)); + prompt.setAutoSize(true); + Dimension parentSize = JOptionPane.getRootFrame().getSize(); + prompt.setMaximumSize(new Dimension(parentSize.width / 2, parentSize.height - 100)); + this.add(prompt, "x " + x + ", ay top, wrap, gaptop 7, gapbottom " + gapBottom); + x = padding; + } + if (comp != null) { + this.add(comp, "x " + x + ", w 100%-" + (x + padding) + ", wrap, gapbottom " + gapAboveButtons); + } //determine size of buttons int optionCount = options.length; @@ -113,9 +178,9 @@ public class FOptionPane extends FDialog { //add buttons x = (width - totalButtonWidth) / 2; - if (x < padX) { - width = totalButtonWidth + 2 * padX; //increase width to make room for buttons - x = padX; + if (x < padding) { + width = totalButtonWidth + 2 * padding; //increase width to make room for buttons + x = padding; } for (int i = 0; i < optionCount; i++) { final int option = i;