/* * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ /* * DeckArea.java * * Created on Feb 18, 2010, 3:10:39 PM */ package mage.client.deckeditor; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.*; import mage.cards.Card; import mage.cards.decks.Deck; import mage.cards.decks.DeckCardLayout; import mage.client.cards.BigCard; import mage.client.cards.CardEventSource; import mage.client.cards.DragCardGrid; import mage.client.constants.Constants.DeckEditorMode; import mage.client.util.Event; import mage.client.util.GUISizeHelper; import mage.client.util.Listener; import mage.view.CardView; import mage.view.CardsView; /** * * @author BetaSteward_at_googlemail.com */ public class DeckArea extends javax.swing.JPanel { private final CardEventSource maindeckVirtualEvent = new CardEventSource(); private final CardEventSource sideboardVirtualEvent = new CardEventSource(); private final Set<UUID> hiddenCards = new HashSet<>(); private Deck lastDeck = new Deck(); private BigCard lastBigCard = null; private int dividerLocationNormal = 0; private int dividerLocationLimited = 0; private static final boolean isLimitedBuildingOrientation = false; public DeckCardLayout getCardLayout() { return deckList.getCardLayout(); } public DeckCardLayout getSideboardLayout() { return sideboardList.getCardLayout(); } public static class Settings { public DragCardGrid.Settings maindeckSettings; public DragCardGrid.Settings sideboardSetings; public int dividerLocationLimited; public int dividerLocationNormal; private final static Pattern parser = Pattern.compile("([^|]*)\\|([^|]*)\\|([^|]*)\\|([^|]*)"); public static Settings parse(String s) { Matcher m = parser.matcher(s); if (m.find()) { Settings settings = new Settings(); settings.maindeckSettings = DragCardGrid.Settings.parse(m.group(1)); settings.sideboardSetings = DragCardGrid.Settings.parse(m.group(2)); settings.dividerLocationNormal = Integer.parseInt(m.group(3)); settings.dividerLocationLimited = Integer.parseInt(m.group(4)); return settings; } else { return null; } } @Override public String toString() { return maindeckSettings.toString() + '|' + sideboardSetings.toString() + '|' + dividerLocationNormal + '|' + dividerLocationLimited; } } /** * Creates new form DeckArea */ public DeckArea() { initComponents(); //deckAreaSplitPane.setOpaque(false); //deckList.setOpaque(false); //sideboardList.setOpaque(false); deckList.setRole(DragCardGrid.Role.MAINDECK); sideboardList.setRole(DragCardGrid.Role.SIDEBOARD); // When a selection happens in one pane, deselect the selection in the other deckList.addDragCardGridListener(new DragCardGrid.DragCardGridListener() { @Override public void cardsSelected() { sideboardList.deselectAll(); } @Override public void hideCards(Collection<CardView> cards) { // Add to hidden and move to sideboard for (CardView card : cards) { hiddenCards.add(card.getId()); maindeckVirtualEvent.removeSpecificCard(card, "remove-specific-card"); sideboardVirtualEvent.addSpecificCard(card, "add-specific-card"); } loadDeck(lastDeck, lastBigCard); } @Override public void showAll() { hiddenCards.clear(); loadDeck(lastDeck, lastBigCard); } @Override public void duplicateCards(Collection<CardView> cards) { sideboardList.deselectAll(); for (CardView card : cards) { CardView newCard = new CardView(card); deckList.addCardView(newCard, true); } } @Override public void invertCardSelection(Collection<CardView> cards) { // Invert Selection for (CardView card : cards) { card.setSelected(!card.isSelected()); } } }); sideboardList.addDragCardGridListener(new DragCardGrid.DragCardGridListener() { @Override public void cardsSelected() { deckList.deselectAll(); } @Override public void hideCards(Collection<CardView> cards) { // Just add to hidden, already in sideboard for (CardView card : cards) { hiddenCards.add(card.getId()); } loadDeck(lastDeck, lastBigCard); } @Override public void showAll() { hiddenCards.clear(); loadDeck(lastDeck, lastBigCard); } @Override public void duplicateCards(Collection<CardView> cards) { deckList.deselectAll(); for (CardView card : cards) { CardView newCard = new CardView(card); sideboardList.addCardView(newCard, true); } } @Override public void invertCardSelection(Collection<CardView> cards) { // Invert Selection for (CardView card : cards) { card.setSelected(!card.isSelected()); } } }); } public Settings saveSettings() { Settings settings = new Settings(); settings.maindeckSettings = deckList.saveSettings(); settings.sideboardSetings = sideboardList.saveSettings(); if (isLimitedBuildingOrientation) { dividerLocationLimited = deckAreaSplitPane.getDividerLocation(); } else { dividerLocationNormal = deckAreaSplitPane.getDividerLocation(); } settings.dividerLocationLimited = dividerLocationLimited; settings.dividerLocationNormal = dividerLocationNormal; return settings; } public void loadSettings(Settings s) { if (s != null) { deckList.loadSettings(s.maindeckSettings); sideboardList.loadSettings(s.sideboardSetings); dividerLocationLimited = s.dividerLocationLimited; dividerLocationNormal = s.dividerLocationNormal; if (isLimitedBuildingOrientation) { if (dividerLocationLimited != 0) { deckAreaSplitPane.setDividerLocation(s.dividerLocationLimited); } } else if (dividerLocationNormal != 0) { deckAreaSplitPane.setDividerLocation(s.dividerLocationNormal); } } } public void cleanUp() { deckList.cleanUp(); sideboardList.cleanUp(); } public void changeGUISize() { setGUISize(); deckList.changeGUISize(); sideboardList.changeGUISize(); deckAreaSplitPane.setDividerSize(GUISizeHelper.dividerBarSize); } private void setGUISize() { } public void setOrientation(boolean limitedBuildingOrientation) { if (limitedBuildingOrientation) { deckAreaSplitPane.setOrientation(JSplitPane.VERTICAL_SPLIT); if (dividerLocationLimited != 0) { deckAreaSplitPane.setDividerLocation(dividerLocationLimited); } } else { deckAreaSplitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT); if (dividerLocationNormal != 0) { deckAreaSplitPane.setDividerLocation(dividerLocationNormal); } } } public void showSideboard(boolean show) { this.sideboardList.setVisible(show); } public void setDeckEditorMode(DeckEditorMode mode) { this.deckList.setDeckEditorMode(mode); this.sideboardList.setDeckEditorMode(mode); } private Set<Card> filterHidden(Set<Card> cards) { Set<Card> newSet = new LinkedHashSet<>(); for (Card card : cards) { if (!hiddenCards.contains(card.getId())) { newSet.add(card); } } return newSet; } public void loadDeck(Deck deck, BigCard bigCard) { loadDeck(deck, false, bigCard); } public void loadDeck(Deck deck, boolean useLayout, BigCard bigCard) { lastDeck = deck; lastBigCard = bigCard; deckList.setCards( new CardsView(filterHidden(lastDeck.getCards())), useLayout ? deck.getCardsLayout() : null, lastBigCard); if (sideboardList.isVisible()) { sideboardList.setCards( new CardsView(filterHidden(lastDeck.getSideboard())), useLayout ? deck.getSideboardLayout() : null, lastBigCard); } } public void addDeckEventListener(Listener<Event> listener) { deckList.addCardEventListener(listener); maindeckVirtualEvent.addListener(listener); } public void clearDeckEventListeners() { deckList.clearCardEventListeners(); } public void addSideboardEventListener(Listener<Event> listener) { sideboardList.addCardEventListener(listener); sideboardVirtualEvent.addListener(listener); } public void clearSideboardEventListeners() { sideboardList.clearCardEventListeners(); } /** * 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") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { deckAreaSplitPane = new javax.swing.JSplitPane(); deckList = new mage.client.cards.DragCardGrid(); sideboardList = new mage.client.cards.DragCardGrid(); deckAreaSplitPane.setBorder(null); deckAreaSplitPane.setResizeWeight(0.6); deckAreaSplitPane.setLeftComponent(deckList); deckAreaSplitPane.setRightComponent(sideboardList); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(deckAreaSplitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 918, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(deckAreaSplitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE) ); }// </editor-fold>//GEN-END:initComponents public DragCardGrid getDeckList() { return deckList; } public DragCardGrid getSideboardList() { return sideboardList; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JSplitPane deckAreaSplitPane; private mage.client.cards.DragCardGrid deckList; private mage.client.cards.DragCardGrid sideboardList; // End of variables declaration//GEN-END:variables }