Add FDeckViewer to display deck list when double-clicking

Improve support for opening modal dialog on top of another modal dialog
This commit is contained in:
drdev
2014-01-18 05:50:11 +00:00
parent d00da28a3c
commit 72fe5ad996
6 changed files with 164 additions and 77 deletions

1
.gitattributes vendored
View File

@@ -15245,6 +15245,7 @@ forge-gui/src/main/java/forge/gui/deckchooser/DeckgenUtil.java -text
forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBox.java -text forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBox.java -text
forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBoxEvent.java -text forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBoxEvent.java -text
forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java -text forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java -text
forge-gui/src/main/java/forge/gui/deckchooser/FDeckViewer.java -text
forge-gui/src/main/java/forge/gui/deckchooser/GenerateThemeDeck.java svneol=native#text/plain forge-gui/src/main/java/forge/gui/deckchooser/GenerateThemeDeck.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/deckchooser/IDecksComboBoxListener.java -text forge-gui/src/main/java/forge/gui/deckchooser/IDecksComboBoxListener.java -text
forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java -text forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java -text

View File

@@ -1,11 +1,8 @@
package forge.gui.deckchooser; package forge.gui.deckchooser;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map.Entry;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
@@ -13,7 +10,6 @@ import forge.Singletons;
import forge.card.CardDb; import forge.card.CardDb;
import forge.deck.CardPool; import forge.deck.CardPool;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckSection;
import forge.deck.generation.DeckGenerator2Color; import forge.deck.generation.DeckGenerator2Color;
import forge.deck.generation.DeckGenerator3Color; import forge.deck.generation.DeckGenerator3Color;
import forge.deck.generation.DeckGenerator5Color; import forge.deck.generation.DeckGenerator5Color;
@@ -195,58 +191,6 @@ public class DeckgenUtil {
deckManager.setSelectedIndex(MyRandom.getRandom().nextInt(size)); deckManager.setSelectedIndex(MyRandom.getRandom().nextInt(size));
} }
/** Shows decklist dialog for a given deck.
* @param lst0 {@link javax.swing.JList}
*/
public static void showDecklist(final Deck deck) {
if (deck == null) { return; }
// Dump into map and display.
final String nl = System.getProperty("line.separator");
final StringBuilder deckList = new StringBuilder();
final String dName = deck.getName();
deckList.append(dName == null ? "" : dName + nl + nl);
int nLines = 0;
for (DeckSection s : DeckSection.values()){
CardPool cp = deck.get(s);
if (cp == null || cp.isEmpty()) {
continue;
}
deckList.append(s.toString()).append(": ");
if (s.isSingleCard()) {
deckList.append(cp.get(0).getName()).append(nl);
nLines++;
}
else {
deckList.append(nl);
nLines++;
for (final Entry<PaperCard, Integer> ev : cp) {
deckList.append(ev.getValue()).append(" ").append(ev.getKey()).append(nl);
nLines++;
}
}
deckList.append(nl);
nLines++;
}
final StringBuilder msg = new StringBuilder();
if (nLines <= 32) {
msg.append(deckList.toString());
}
else {
msg.append("Decklist too long for dialog." + nl + nl);
}
msg.append("Copy Decklist to Clipboard?");
// Output
if (FOptionPane.showConfirmDialog(msg.toString(), "Decklist", "OK", "Cancel")) {
final StringSelection ss = new StringSelection(deckList.toString());
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
}
} // End showDecklist
/** /**
* Checks lengths of selected values for color lists * Checks lengths of selected values for color lists
* to see if a deck generator exists. Alert and visual reminder if fail. * to see if a deck generator exists. Alert and visual reminder if fail.

View File

@@ -50,7 +50,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
@Override @Override
public void run() { public void run() {
if (selectedDeckType != DeckType.COLOR_DECK && selectedDeckType != DeckType.THEME_DECK) { if (selectedDeckType != DeckType.COLOR_DECK && selectedDeckType != DeckType.THEME_DECK) {
DeckgenUtil.showDecklist(getDeck()); FDeckViewer.show(getDeck());
} }
} }
}); });

View File

@@ -0,0 +1,144 @@
package forge.gui.deckchooser;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.JLabel;
import forge.deck.CardPool;
import forge.deck.Deck;
import forge.deck.DeckSection;
import forge.gui.toolbox.FButton;
import forge.gui.toolbox.FOptionPane;
import forge.gui.toolbox.itemmanager.CardManager;
import forge.gui.toolbox.itemmanager.ItemManagerContainer;
import forge.gui.toolbox.itemmanager.views.ItemCellRenderer;
import forge.gui.toolbox.itemmanager.views.ItemColumn;
import forge.gui.toolbox.itemmanager.views.SColumnUtil;
import forge.gui.toolbox.itemmanager.views.ItemColumn.ColumnDef;
import forge.item.PaperCard;
import forge.view.FDialog;
@SuppressWarnings("serial")
public class FDeckViewer extends FDialog {
private final Deck deck;
private final List<DeckSection> sections = new ArrayList<DeckSection>();
private final CardManager cardManager;
private DeckSection currentSection;
private final FButton btnCopyToClipboard = new FButton("Copy to Clipboard");
private final FButton btnChangeSection = new FButton("Change Section");
private final FButton btnClose = new FButton("Close");
public static void show(final Deck deck) {
if (deck == null) { return; }
FDeckViewer deckViewer = new FDeckViewer(deck);
deckViewer.setVisible(true);
deckViewer.dispose();
}
private FDeckViewer(Deck deck0) {
this.deck = deck0;
this.setTitle(deck.getName());
this.cardManager = new CardManager(false);
this.cardManager.setPool(deck.getMain());
this.setDefaultFocus(this.cardManager.getTable().getComponent());
for (Entry<DeckSection, CardPool> entry : deck) {
this.sections.add(entry.getKey());
}
this.currentSection = DeckSection.Main;
updateCaption();
this.btnCopyToClipboard.setFocusable(false);
this.btnCopyToClipboard.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
FDeckViewer.this.copyToClipboard();
}
});
this.btnChangeSection.setFocusable(false);
if (this.sections.size() > 1) {
this.btnChangeSection.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
FDeckViewer.this.changeSection();
}
});
}
else {
this.btnChangeSection.setEnabled(false);
}
this.btnClose.setFocusable(false);
this.btnClose.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
FDeckViewer.this.setVisible(false);
}
});
final int width = 700;
final int height = 600;
this.setPreferredSize(new Dimension(width, height));
this.setSize(width, height);
this.add(new ItemManagerContainer(this.cardManager), "w 100%, pushy, growy, spanx 4, gapbottom 10px, wrap");
this.add(this.btnCopyToClipboard, "w 200px!, h 26px!, gapright 5px");
this.add(this.btnChangeSection, "w 200px!, h 26px!");
this.add(new JLabel(), "pushx, growx");
this.add(this.btnClose, "w 120px!, h 26px!");
Map<ColumnDef, ItemColumn> columns = SColumnUtil.getDeckDefaultColumns();
columns.get(ColumnDef.DECK_QUANTITY).setCellRenderer(new ItemCellRenderer()); //prevent displaying +/- buttons
this.cardManager.getTable().setup(columns);
}
private void changeSection() {
int index = sections.indexOf(currentSection);
index = (index + 1) % sections.size();
currentSection = sections.get(index);
this.cardManager.setPool(this.deck.get(currentSection));
updateCaption();
}
private void updateCaption() {
this.cardManager.setCaption(deck.getName() + " - " + currentSection.name());
}
private void copyToClipboard() {
final String nl = System.getProperty("line.separator");
final StringBuilder deckList = new StringBuilder();
final String dName = deck.getName();
deckList.append(dName == null ? "" : dName + nl + nl);
for (DeckSection s : DeckSection.values()){
CardPool cp = deck.get(s);
if (cp == null || cp.isEmpty()) {
continue;
}
deckList.append(s.toString()).append(": ");
if (s.isSingleCard()) {
deckList.append(cp.get(0).getName()).append(nl);
}
else {
deckList.append(nl);
for (final Entry<PaperCard, Integer> ev : cp) {
deckList.append(ev.getValue()).append(" ").append(ev.getKey()).append(nl);
}
}
deckList.append(nl);
}
final StringSelection ss = new StringSelection(deckList.toString());
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
FOptionPane.showMessageDialog("Deck list for '" + deck.getName() + "' copied to clipboard.");
}
}

View File

@@ -2,13 +2,10 @@ package forge.gui.home.gauntlet;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.swing.JList;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import forge.Command; import forge.Command;
@@ -19,7 +16,6 @@ import forge.game.player.RegisteredPlayer;
import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletData;
import forge.gauntlet.GauntletIO; import forge.gauntlet.GauntletIO;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
import forge.gui.deckchooser.DeckgenUtil;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
import forge.net.FServer; import forge.net.FServer;
import forge.net.Lobby; import forge.net.Lobby;
@@ -38,16 +34,6 @@ public enum CSubmenuGauntletContests implements ICDoc {
private final VSubmenuGauntletContests view = VSubmenuGauntletContests.SINGLETON_INSTANCE; private final VSubmenuGauntletContests view = VSubmenuGauntletContests.SINGLETON_INSTANCE;
private final MouseAdapter madDecklist = new MouseAdapter() {
@SuppressWarnings("unchecked")
@Override
public void mouseClicked(final MouseEvent e) {
final GauntletData gd = view.getGauntletLister().getSelectedGauntlet();
if (e.getClickCount() == 2)
DeckgenUtil.showDecklist( gd.getDecks().get(((JList<String>)e.getSource()).getSelectedIndex()) );
}
};
private final ActionListener actStartGame = new ActionListener() { private final ActionListener actStartGame = new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent arg0) { public void actionPerformed(ActionEvent arg0) {
@@ -71,7 +57,6 @@ public enum CSubmenuGauntletContests implements ICDoc {
@Override @Override
public void initialize() { public void initialize() {
view.getBtnStart().addActionListener(actStartGame); view.getBtnStart().addActionListener(actStartGame);
view.getLstDecks().addMouseListener(madDecklist);
view.getLstDecks().initialize(); view.getLstDecks().initialize();
updateData(); updateData();

View File

@@ -23,6 +23,7 @@ import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowEvent; import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener; import java.awt.event.WindowFocusListener;
import java.awt.geom.RoundRectangle2D; import java.awt.geom.RoundRectangle2D;
import java.util.Stack;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
@@ -147,18 +148,29 @@ public class FDialog extends SkinnedDialog implements ITitleBarOwner, KeyEventDi
if (this.isVisible() == visible) { return; } if (this.isVisible() == visible) { return; }
if (visible) { if (visible) {
setLocationRelativeTo(JOptionPane.getRootFrame()); if (openModals.isEmpty()) {
setLocationRelativeTo(JOptionPane.getRootFrame());
}
else {
setLocationRelativeTo(openModals.peek());
}
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this); //support handling keyboard shortcuts in dialog KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this); //support handling keyboard shortcuts in dialog
if (isModal()) { if (isModal()) {
backdropPanel.setVisible(true); if (openModals.isEmpty()) {
Singletons.getView().getNavigationBar().setMenuShortcutsEnabled(false); backdropPanel.setVisible(true);
Singletons.getView().getNavigationBar().setMenuShortcutsEnabled(false);
}
openModals.push(this);
} }
} }
else { else {
KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(this); KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(this);
if (isModal()) { if (isModal()) {
backdropPanel.setVisible(false); openModals.pop();
Singletons.getView().getNavigationBar().setMenuShortcutsEnabled(true); if (openModals.isEmpty()) {
backdropPanel.setVisible(false);
Singletons.getView().getNavigationBar().setMenuShortcutsEnabled(true);
}
} }
} }
super.setVisible(visible); super.setVisible(visible);
@@ -317,6 +329,7 @@ public class FDialog extends SkinnedDialog implements ITitleBarOwner, KeyEventDi
return getIconImages().isEmpty() ? null : getIconImages().get(0); return getIconImages().isEmpty() ? null : getIconImages().get(0);
} }
private static final Stack<FDialog> openModals = new Stack<FDialog>();
private static final BackdropPanel backdropPanel = new BackdropPanel(); private static final BackdropPanel backdropPanel = new BackdropPanel();
public static JPanel getBackdropPanel() { public static JPanel getBackdropPanel() {