diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index c2483cfe6e4..1ce84a67378 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -1197,6 +1197,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { DeckEditorPane deckEditorPane = (DeckEditorPane) window; if (deckEditorPane.getDeckEditorMode() == DeckEditorMode.LIMITED_BUILDING || deckEditorPane.getDeckEditorMode() == DeckEditorMode.SIDEBOARDING + || deckEditorPane.getDeckEditorMode() == DeckEditorMode.LIMITED_SIDEBOARD_BUILDING || deckEditorPane.getDeckEditorMode() == DeckEditorMode.VIEW_LIMITED_DECK) { deckEditorPane.removeFrame(); } @@ -1207,7 +1208,10 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { public void showDeckEditor(DeckEditorMode mode, Deck deck, UUID tableId, int time) { String name; - if (mode == DeckEditorMode.SIDEBOARDING || mode == DeckEditorMode.LIMITED_BUILDING || mode == DeckEditorMode.VIEW_LIMITED_DECK) { + if (mode == DeckEditorMode.SIDEBOARDING + || mode == DeckEditorMode.LIMITED_BUILDING + || mode == DeckEditorMode.LIMITED_SIDEBOARD_BUILDING + || mode == DeckEditorMode.VIEW_LIMITED_DECK) { name = "Deck Editor - " + tableId.toString(); } else { if (deck != null) { diff --git a/Mage.Client/src/main/java/mage/client/SessionHandler.java b/Mage.Client/src/main/java/mage/client/SessionHandler.java index 4e0b20dad49..1b9727ab57a 100644 --- a/Mage.Client/src/main/java/mage/client/SessionHandler.java +++ b/Mage.Client/src/main/java/mage/client/SessionHandler.java @@ -1,7 +1,9 @@ package mage.client; import mage.cards.decks.DeckCardLists; +import static mage.cards.decks.DeckFormats.XMAGE; import mage.client.chat.LocalCommands; +import mage.client.constants.Constants.DeckEditorMode; import mage.client.dialog.PreferencesDialog; import mage.constants.ManaType; import mage.constants.PlayerAction; @@ -16,6 +18,9 @@ import mage.remote.SessionImpl; import mage.view.*; import org.apache.log4j.Logger; +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; import java.util.*; /** @@ -191,7 +196,6 @@ public final class SessionHandler { logger.info(e); return null; } - } public static String getUserName() { @@ -230,8 +234,27 @@ public final class SessionHandler { return session.getTournamentTypes(); } - public static boolean submitDeck(UUID tableId, DeckCardLists deckCardLists) { - return session.submitDeck(tableId, deckCardLists); + private static void autoSaveLimitedDeck(DeckCardLists deckList) { + String autoSave = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_LIMITED_DECK_AUTO_SAVE, "true"); + if(autoSave.equals("true")){ + // Log the submitted deck in the log folder. + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); + String logFilename = sdf.format(new Date()) + "_limited" + ".dck"; + try { + XMAGE.getExporter().writeDeck(new File("gamelogs"), logFilename, deckList); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public static boolean submitDeck(DeckEditorMode mode, UUID tableId, DeckCardLists deckCardLists) { + boolean success = session.submitDeck(tableId, deckCardLists); + if(DeckEditorMode.LIMITED_BUILDING.equals(mode)) { + // AutoSaving is done after submitting, to not let the server wait. + autoSaveLimitedDeck(deckCardLists); + } + return success; } public static String[] getDeckTypes() { @@ -273,7 +296,7 @@ public final class SessionHandler { public static void sendCardMark(UUID draftId, UUID id) { session.sendCardMark(draftId, id); } - + public static void setBoosterLoaded(UUID draftId) { session.setBoosterLoaded(draftId); } diff --git a/Mage.Client/src/main/java/mage/client/constants/Constants.java b/Mage.Client/src/main/java/mage/client/constants/Constants.java index 9ca0b5597ee..afe9af5d03c 100644 --- a/Mage.Client/src/main/java/mage/client/constants/Constants.java +++ b/Mage.Client/src/main/java/mage/client/constants/Constants.java @@ -104,6 +104,7 @@ public final class Constants { FREE_BUILDING, LIMITED_BUILDING, + LIMITED_SIDEBOARD_BUILDING, SIDEBOARDING, VIEW_LIMITED_DECK } diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPane.java b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPane.java index 48a360f973c..5d769595dd0 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPane.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPane.java @@ -45,7 +45,9 @@ public class DeckEditorPane extends MagePane { } public void show(DeckEditorMode mode, Deck deck, String name, UUID tableId, int time) { - if (mode == DeckEditorMode.SIDEBOARDING || mode == DeckEditorMode.LIMITED_BUILDING) { + if (mode == DeckEditorMode.SIDEBOARDING + || mode == DeckEditorMode.LIMITED_BUILDING + || mode == DeckEditorMode.LIMITED_SIDEBOARD_BUILDING) { this.setTitle("Deck Editor - " + tableId.toString()); } else if (mode == DeckEditorMode.VIEW_LIMITED_DECK) { this.setTitle("Deck Editor - Current Deck"); diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java index 4414f5960aa..e81b6a8b9fd 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java @@ -2,6 +2,8 @@ package mage.client.deckeditor; import mage.cards.Card; import mage.cards.decks.*; +import static mage.cards.decks.DeckFormats.XMAGE; +import static mage.cards.decks.DeckFormats.XMAGE_INFO; import mage.cards.decks.importer.DeckImporter; import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; @@ -39,9 +41,6 @@ import java.util.List; import java.util.*; import java.util.concurrent.*; -import static mage.cards.decks.DeckFormats.XMAGE; -import static mage.cards.decks.DeckFormats.XMAGE_INFO; - /** * @author BetaSteward_at_googlemail.com, JayDi85, Elandril */ @@ -214,6 +213,7 @@ public class DeckEditorPanel extends javax.swing.JPanel { restoreDividerLocationsAndDeckAreaSettings(); switch (mode) { case LIMITED_BUILDING: + case LIMITED_SIDEBOARD_BUILDING: this.btnAddLand.setVisible(true); this.txtTimeRemaining.setVisible(true); this.btnLegality.setVisible(false); // legality check available only in free building mode @@ -1439,7 +1439,9 @@ public class DeckEditorPanel extends javax.swing.JPanel { }//GEN-LAST:event_btnLoadActionPerformed private void btnNewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNewActionPerformed - if (mode == DeckEditorMode.SIDEBOARDING || mode == DeckEditorMode.LIMITED_BUILDING) { + if (mode == DeckEditorMode.SIDEBOARDING + || mode == DeckEditorMode.LIMITED_BUILDING + || mode == DeckEditorMode.LIMITED_SIDEBOARD_BUILDING) { for (Card card : deck.getCards()) { deck.getSideboard().add(card); } @@ -1481,7 +1483,7 @@ public class DeckEditorPanel extends javax.swing.JPanel { updateDeckTask.cancel(true); } - if (SessionHandler.submitDeck(tableId, deck.getDeckCardLists())) { + if (SessionHandler.submitDeck(mode, tableId, deck.getDeckCardLists())) { removeDeckEditor(); } }//GEN-LAST:event_btnSubmitActionPerformed @@ -1497,7 +1499,7 @@ public class DeckEditorPanel extends javax.swing.JPanel { updateDeckTask.cancel(true); } - if (SessionHandler.submitDeck(tableId, deck.getDeckCardLists())) { + if (SessionHandler.submitDeck(mode, tableId, deck.getDeckCardLists())) { removeDeckEditor(); } return null; diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form index 33ccafcee8b..5117a5ea841 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form @@ -4,6 +4,9 @@ + + + @@ -42,7 +45,7 @@ - + @@ -97,8 +100,8 @@ - - + + @@ -140,6 +143,16 @@ + + + + + + + + + + @@ -4114,7 +4127,7 @@ - + @@ -4373,7 +4386,7 @@ - + @@ -4894,7 +4907,7 @@ - + @@ -6329,12 +6342,12 @@ - + - + diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java index e028de5745c..b0f47b6eae7 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java @@ -3,12 +3,15 @@ package mage.client.dialog; import mage.client.MageFrame; import mage.client.SessionHandler; import mage.client.components.KeyBindButton; +import static mage.client.constants.Constants.AUTO_TARGET_NON_FEEL_BAD; +import static mage.client.constants.Constants.BATTLEFIELD_FEEDBACK_COLORIZING_MODE_ENABLE_BY_MULTICOLOR; import mage.client.themes.ThemeType; import mage.client.util.CardLanguage; import mage.client.util.ClientDefaultSettings; import mage.client.util.GUISizeHelper; import mage.client.util.ImageHelper; import mage.client.util.gui.BufferedImageBuilder; +import static mage.constants.Constants.*; import mage.players.net.UserData; import mage.players.net.UserGroup; import mage.players.net.UserSkipPrioritySteps; @@ -31,10 +34,6 @@ import java.util.*; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; -import static mage.client.constants.Constants.AUTO_TARGET_NON_FEEL_BAD; -import static mage.client.constants.Constants.BATTLEFIELD_FEEDBACK_COLORIZING_MODE_ENABLE_BY_MULTICOLOR; -import static mage.constants.Constants.*; - /** * @author nantuko, JayDi85, leemi */ @@ -75,6 +74,7 @@ public class PreferencesDialog extends javax.swing.JDialog { public static final String KEY_GAME_LOG_SHOW_TURN_INFO = "gameLogShowTurnInfo"; public static final String KEY_GAME_LOG_AUTO_SAVE = "gameLogAutoSave"; public static final String KEY_DRAFT_LOG_AUTO_SAVE = "draftLogAutoSave"; + public static final String KEY_LIMITED_DECK_AUTO_SAVE = "draftLimitedAutoSave"; public static final String KEY_JSON_GAME_LOG_AUTO_SAVE = "gameLogJsonAutoSave"; public static final String KEY_CARD_IMAGES_USE_DEFAULT = "cardImagesUseDefault"; @@ -426,6 +426,7 @@ public class PreferencesDialog extends javax.swing.JDialog { cbGameLogShowTurnInfo = new javax.swing.JCheckBox(); cbGameLogAutoSave = new javax.swing.JCheckBox(); cbDraftLogAutoSave = new javax.swing.JCheckBox(); + cbLimitedDeckAutoSave = new javax.swing.JCheckBox(); cbGameJsonLogAutoSave = new javax.swing.JCheckBox(); main_card = new javax.swing.JPanel(); showCardName = new javax.swing.JCheckBox(); @@ -630,6 +631,7 @@ public class PreferencesDialog extends javax.swing.JDialog { setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("Preferences"); + setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); tabsPanel.setMinimumSize(new java.awt.Dimension(532, 451)); @@ -649,8 +651,14 @@ public class PreferencesDialog extends javax.swing.JDialog { cbDraftLogAutoSave.setSelected(true); cbDraftLogAutoSave.setText("Save draft logs (to \"../Mage.Client/gamelogs/\" directory)"); cbDraftLogAutoSave.setToolTipText("The logs of all your games will be saved to the mentioned folder if this option is switched on."); + cbDraftLogAutoSave.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); main_gamelog.add(cbDraftLogAutoSave); + cbLimitedDeckAutoSave.setSelected(true); + cbLimitedDeckAutoSave.setText("Save limited decks on submit (to \"../Mage.Client/gamelogs/\" directory)"); + cbLimitedDeckAutoSave.setToolTipText("A .dck file for each limited tournament will be saved to the mentioned folder if this option is switched on."); + main_gamelog.add(cbLimitedDeckAutoSave); + cbGameJsonLogAutoSave.setText("Save JSON game logs (to \"../Mage.Client/gamelogsJson/\" directory)"); cbGameJsonLogAutoSave.setToolTipText("The JSON logs of all your games will be saved to the mentioned folder if this option is switched on."); main_gamelog.add(cbGameJsonLogAutoSave); @@ -910,8 +918,8 @@ public class PreferencesDialog extends javax.swing.JDialog { .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(main_gamelog, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) - .add(main_battlefield, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) - .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .add(main_battlefield, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(20, 20, 20)) ); main_card.getAccessibleContext().setAccessibleName("Game panel"); @@ -1649,7 +1657,7 @@ public class PreferencesDialog extends javax.swing.JDialog { .add(jLabelEndOfTurn) .add(checkBoxEndTurnOthers)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED) - .add(phases_stopSettings, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 354, Short.MAX_VALUE) + .add(phases_stopSettings, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 321, Short.MAX_VALUE) .addContainerGap()) ); @@ -1874,7 +1882,7 @@ public class PreferencesDialog extends javax.swing.JDialog { .add(panelCardImages, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(panelBackgroundImages, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) - .addContainerGap(142, Short.MAX_VALUE)) + .addContainerGap(128, Short.MAX_VALUE)) ); tabsPanel.addTab("Images", tabImages); @@ -2450,7 +2458,7 @@ public class PreferencesDialog extends javax.swing.JDialog { tabAvatarsLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(tabAvatarsLayout.createSequentialGroup() .add(avatarPane, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 504, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) - .add(0, 4, Short.MAX_VALUE)) + .add(0, 52, Short.MAX_VALUE)) ); tabsPanel.addTab("Avatars", tabAvatars); @@ -2841,12 +2849,12 @@ public class PreferencesDialog extends javax.swing.JDialog { ); tabThemesLayout.setVerticalGroup( tabThemesLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) - .add(0, 623, Short.MAX_VALUE) + .add(0, 556, Short.MAX_VALUE) .add(tabThemesLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(tabThemesLayout.createSequentialGroup() .add(21, 21, 21) .add(themesCategory, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) - .addContainerGap(523, Short.MAX_VALUE))) + .addContainerGap(460, Short.MAX_VALUE))) ); tabsPanel.addTab("Themes", tabThemes); @@ -2889,7 +2897,7 @@ public class PreferencesDialog extends javax.swing.JDialog { layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() - .add(tabsPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 554, Short.MAX_VALUE) + .add(tabsPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 584, Short.MAX_VALUE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(saveButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 30, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) @@ -2918,6 +2926,7 @@ public class PreferencesDialog extends javax.swing.JDialog { save(prefs, dialog.cbGameLogShowTurnInfo, KEY_GAME_LOG_SHOW_TURN_INFO, "true", "false", UPDATE_CACHE_POLICY); save(prefs, dialog.cbGameLogAutoSave, KEY_GAME_LOG_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY); save(prefs, dialog.cbDraftLogAutoSave, KEY_DRAFT_LOG_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY); + save(prefs, dialog.cbLimitedDeckAutoSave, KEY_LIMITED_DECK_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY); save(prefs, dialog.cbGameJsonLogAutoSave, KEY_JSON_GAME_LOG_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY); String paramName = KEY_BATTLEFIELD_FEEDBACK_COLORIZING_MODE; @@ -3480,6 +3489,7 @@ public class PreferencesDialog extends javax.swing.JDialog { load(prefs, dialog.cbGameLogShowTurnInfo, KEY_GAME_LOG_SHOW_TURN_INFO, "true"); load(prefs, dialog.cbGameLogAutoSave, KEY_GAME_LOG_AUTO_SAVE, "true"); load(prefs, dialog.cbDraftLogAutoSave, KEY_DRAFT_LOG_AUTO_SAVE, "true"); + load(prefs, dialog.cbLimitedDeckAutoSave, KEY_LIMITED_DECK_AUTO_SAVE, "true"); load(prefs, dialog.cbGameJsonLogAutoSave, KEY_JSON_GAME_LOG_AUTO_SAVE, "true", "false"); String feedbackParam = ""; @@ -4116,6 +4126,7 @@ public class PreferencesDialog extends javax.swing.JDialog { private javax.swing.JCheckBox cbGameJsonLogAutoSave; private javax.swing.JCheckBox cbGameLogAutoSave; private javax.swing.JCheckBox cbGameLogShowTurnInfo; + private javax.swing.JCheckBox cbLimitedDeckAutoSave; private javax.swing.JComboBox cbNumberOfDownloadThreads; private javax.swing.JCheckBox cbPassPriorityActivation; private javax.swing.JCheckBox cbPassPriorityCast; diff --git a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java index 1b84aa1c7bb..83f750d74ba 100644 --- a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java +++ b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java @@ -369,7 +369,7 @@ public class CallbackClientImpl implements CallbackClient { DeckView deckView = message.getDeck(); Deck deck = DeckUtil.construct(deckView); if (message.getFlag()) { - construct(deck, message.getTableId(), message.getTime()); + construct_sideboard(deck, message.getTableId(), message.getTime()); } else { sideboard(deck, message.getTableId(), message.getTime()); } @@ -611,6 +611,10 @@ public class CallbackClientImpl implements CallbackClient { frame.showDeckEditor(DeckEditorMode.LIMITED_BUILDING, deck, tableId, time); } + protected void construct_sideboard(Deck deck, UUID tableId, int time) { + frame.showDeckEditor(DeckEditorMode.LIMITED_SIDEBOARD_BUILDING, deck, tableId, time); + } + protected void viewLimitedDeck(Deck deck, UUID tableId, int time) { frame.showDeckEditor(DeckEditorMode.VIEW_LIMITED_DECK, deck, tableId, time); } diff --git a/Mage/src/main/java/mage/cards/decks/exporter/DeckExporter.java b/Mage/src/main/java/mage/cards/decks/exporter/DeckExporter.java index d9a4b8ab40b..7fe35cbe1dd 100644 --- a/Mage/src/main/java/mage/cards/decks/exporter/DeckExporter.java +++ b/Mage/src/main/java/mage/cards/decks/exporter/DeckExporter.java @@ -15,6 +15,14 @@ public abstract class DeckExporter { DeckFormats.writeDeck(file, deck, this); } + public void writeDeck(File directory, String filename, DeckCardLists deck) throws IOException { + if (!directory.exists()) { + directory.mkdirs(); + } + String path = new File(directory, filename).getPath(); + DeckFormats.writeDeck(path, deck, this); + } + public void writeDeck(File file, DeckCardLists deck) throws IOException { DeckFormats.writeDeck(file, deck, this); }