From dc0da80d82a2bda02ac1bcc3afda966ef67bdb4a Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Fri, 22 Mar 2019 20:14:24 +0400 Subject: [PATCH] * UI: added deck export to clipboard (#4243); --- .../client/deckeditor/DeckEditorPanel.java | 3 +- .../deckeditor/DeckExportClipboardDialog.form | 160 ++++++++++++ .../deckeditor/DeckExportClipboardDialog.java | 236 ++++++++++++++++++ .../deckeditor/DeckImportClipboardDialog.form | 5 +- 4 files changed, 399 insertions(+), 5 deletions(-) create mode 100644 Mage.Client/src/main/java/mage/client/deckeditor/DeckExportClipboardDialog.form create mode 100644 Mage.Client/src/main/java/mage/client/deckeditor/DeckExportClipboardDialog.java 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 118ebee9864..357ecda0c6b 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java @@ -782,7 +782,8 @@ public class DeckEditorPanel extends javax.swing.JPanel { } private void exportToClipboard(java.awt.event.ActionEvent evt) { - // TODO + final DeckExportClipboardDialog dialog = new DeckExportClipboardDialog(); + dialog.showDialog(deck); } private void processAndShowImportErrors(StringBuilder errorMessages) { diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckExportClipboardDialog.form b/Mage.Client/src/main/java/mage/client/deckeditor/DeckExportClipboardDialog.form new file mode 100644 index 00000000000..08b2a175b5b --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckExportClipboardDialog.form @@ -0,0 +1,160 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckExportClipboardDialog.java b/Mage.Client/src/main/java/mage/client/deckeditor/DeckExportClipboardDialog.java new file mode 100644 index 00000000000..3374395ce2c --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckExportClipboardDialog.java @@ -0,0 +1,236 @@ +package mage.client.deckeditor; + +import mage.cards.decks.Deck; +import mage.cards.decks.DeckFormats; +import mage.cards.decks.exporter.DeckExporter; +import mage.client.MageFrame; +import mage.client.dialog.MageDialog; + +import javax.swing.*; +import java.awt.*; +import java.awt.datatransfer.StringSelection; +import java.awt.event.KeyEvent; +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; + +/** + * @author JayDi85 + */ +public class DeckExportClipboardDialog extends MageDialog { + + private Deck deck; + private ArrayList formats = new ArrayList<>(); + + public DeckExportClipboardDialog() { + initComponents(); + } + + public void showDialog(Deck deck) { + this.deck = deck; + + // formats combobox + formats.clear(); + comboFormats.removeAllItems(); + for (DeckFormats df : DeckFormats.values()) { + formats.add(df); + comboFormats.addItem(df.getExporter().getDescription()); + } + if (comboFormats.getItemCount() > 0) { + comboFormats.setSelectedIndex(0); + } + + onRefreshData(); + + this.setModal(true); + this.setResizable(true); + getRootPane().setDefaultButton(buttonOK); + + this.makeWindowCentered(); + + // windows settings + if (this.isModal()) { + MageFrame.getDesktop().add(this, JLayeredPane.MODAL_LAYER); + } else { + MageFrame.getDesktop().add(this, JLayeredPane.PALETTE_LAYER); + } + + // Close on "ESC" + registerKeyboardAction(e -> onCancel(), KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + + this.setVisible(true); + } + + private void setClipboardStringData(String text) { + try { + StringSelection data = new StringSelection(text); + Toolkit.getDefaultToolkit().getSystemClipboard().setContents(data, data); + } catch (HeadlessException e) { + //e.printStackTrace(); + } + } + + private void onOK() { + onCopyToClipboard(); + this.removeDialog(); + } + + private void onCancel() { + this.removeDialog(); + } + + private void onRefreshData() { + int formatIndex = comboFormats.getSelectedIndex(); + if (formatIndex < 0 || formatIndex >= formats.size()) { + return; + } + + DeckExporter exporter = formats.get(formatIndex).getExporter(); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + exporter.writeDeck(baos, deck.getDeckCardLists()); + editData.setText(baos.toString()); + editData.setCaretPosition(0); + } + + private void onCopyToClipboard() { + setClipboardStringData(editData.getText()); + } + + /** + * 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() { + + panelData = new javax.swing.JScrollPane(); + editData = new javax.swing.JEditorPane(); + labelData = new javax.swing.JLabel(); + panelCommands = new javax.swing.JPanel(); + buttonOK = new javax.swing.JButton(); + buttonCancel = new javax.swing.JButton(); + buttonCopy = new javax.swing.JButton(); + comboFormats = new javax.swing.JComboBox<>(); + + setTitle("Export to clipboard"); + setMinimumSize(new java.awt.Dimension(400, 400)); + + panelData.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); + panelData.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); + panelData.setViewportView(editData); + + labelData.setText("Choose deck format:"); + + buttonOK.setText("Copy"); + buttonOK.setToolTipText("Import deck from current text"); + buttonOK.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonOKActionPerformed(evt); + } + }); + + buttonCancel.setText("Close"); + buttonCancel.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonCancelActionPerformed(evt); + } + }); + + buttonCopy.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/copy_24.png"))); // NOI18N + buttonCopy.setToolTipText("Copy current text to clipboard"); + buttonCopy.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonCopyActionPerformed(evt); + } + }); + + javax.swing.GroupLayout panelCommandsLayout = new javax.swing.GroupLayout(panelCommands); + panelCommands.setLayout(panelCommandsLayout); + panelCommandsLayout.setHorizontalGroup( + panelCommandsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelCommandsLayout.createSequentialGroup() + .addComponent(buttonCopy, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonOK, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(buttonCancel, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)) + ); + 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.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelCommandsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(buttonCancel, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(buttonOK, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(buttonCopy, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))) + ); + + comboFormats.setModel(new javax.swing.DefaultComboBoxModel<>(new String[]{"Item 1", "Item 2", "Item 3", "Item 4"})); + comboFormats.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + comboFormatsItemStateChanged(evt); + } + }); + + 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(panelCommands, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(panelData, javax.swing.GroupLayout.DEFAULT_SIZE, 364, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(labelData) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(comboFormats, 0, 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() + .addGap(8, 8, 8) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(labelData) + .addComponent(comboFormats, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(10, 10, 10) + .addComponent(panelData, javax.swing.GroupLayout.DEFAULT_SIZE, 520, 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 buttonCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCancelActionPerformed + onCancel(); + }//GEN-LAST:event_buttonCancelActionPerformed + + private void buttonOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonOKActionPerformed + onOK(); + }//GEN-LAST:event_buttonOKActionPerformed + + private void buttonCopyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCopyActionPerformed + onCopyToClipboard(); + }//GEN-LAST:event_buttonCopyActionPerformed + + private void comboFormatsItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_comboFormatsItemStateChanged + onRefreshData(); + }//GEN-LAST:event_comboFormatsItemStateChanged + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton buttonCancel; + private javax.swing.JButton buttonCopy; + private javax.swing.JButton buttonOK; + private javax.swing.JComboBox comboFormats; + private javax.swing.JEditorPane editData; + private javax.swing.JLabel labelData; + private javax.swing.JPanel panelCommands; + private javax.swing.JScrollPane panelData; + // End of variables declaration//GEN-END:variables +} diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckImportClipboardDialog.form b/Mage.Client/src/main/java/mage/client/deckeditor/DeckImportClipboardDialog.form index f86a4e1b6bd..bb988c16943 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckImportClipboardDialog.form +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckImportClipboardDialog.form @@ -28,10 +28,7 @@ - - - - +