package org.magic.gui.components; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.image.BufferedImage; import java.text.DateFormat; import java.util.List; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingWorker; import org.jdesktop.beansbinding.AutoBinding; import org.jdesktop.beansbinding.AutoBinding.UpdateStrategy; import org.jdesktop.beansbinding.BeanProperty; import org.jdesktop.beansbinding.BindingGroup; import org.jdesktop.beansbinding.Bindings; import org.magic.api.beans.MagicCard; import org.magic.api.beans.MagicDeck; import org.magic.api.beans.MagicFormat.FORMATS; import org.magic.api.interfaces.MTGPictureProvider; import org.magic.gui.components.editor.JTagsPanel; import org.magic.services.MTGControler; import org.magic.services.MTGDeckManager; import org.magic.services.threads.ThreadManager; import org.magic.tools.ImageTools; import org.magic.tools.UITools; public class DeckDetailsPanel extends JComponent { /** * */ private static final long serialVersionUID = 1L; private transient BindingGroup mBindingGroup; private MagicDeck magicDeck = new MagicDeck(); private JTextField nameJTextField; private JTextArea textArea; private ManaPanel manaPanel; private JPanel panelLegalities; private JProgressBar nbCardsProgress; private JLabel lbstd; private JLabel lbmnd; private JLabel lbvin; private JLabel lbcmd; private JLabel lbLeg; private JProgressBar nbSideProgress; private JPanel panel; private JTagsPanel tagsPanel; private JLabel lblDate; private JLabel lblDateInformation; public DeckDetailsPanel(MagicDeck newMagicDeck) { this(); setMagicDeck(newMagicDeck); } public DeckDetailsPanel() { GridBagLayout gridBagLayout = new GridBagLayout(); gridBagLayout.columnWidths = new int[] { 0, 140, 0, 0, 0 }; gridBagLayout.rowHeights = new int[] { 28, 30, 35, 0, 132, 31, 0, 0, 0, 0 }; gridBagLayout.columnWeights = new double[] { 0.0, 0.0, 1.0, 0.0, 1.0E-4 }; gridBagLayout.rowWeights = new double[] { 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0E-4 }; setLayout(gridBagLayout); add(new JLabel(MTGControler.getInstance().getLangService().getCapitalize("DECK_NAME") + " :"), UITools.createGridBagConstraints(null, null, 1, 0)); nameJTextField = new JTextField(); add(nameJTextField, UITools.createGridBagConstraints(null, GridBagConstraints.HORIZONTAL, 2, 0)); add(new JLabel(MTGControler.getInstance().getLangService().getCapitalize("CARD_LEGALITIES") + " :"), UITools.createGridBagConstraints(null, null, 1, 1)); panelLegalities = new JPanel(); FlowLayout flowLayout = (FlowLayout) panelLegalities.getLayout(); flowLayout.setHgap(10); flowLayout.setAlignment(FlowLayout.LEFT); add(panelLegalities, UITools.createGridBagConstraints(null, GridBagConstraints.BOTH, 2, 1)); add(new JLabel(MTGControler.getInstance().getLangService().getCapitalize("CARD_COLOR") + " :"), UITools.createGridBagConstraints(null, null, 1, 2)); manaPanel = new ManaPanel(); add(manaPanel, UITools.createGridBagConstraints(null, GridBagConstraints.BOTH, 2, 2)); lblDate = new JLabel(MTGControler.getInstance().getLangService().getCapitalize("DATE") + " :"); add(lblDate, UITools.createGridBagConstraints(null, null, 1, 3)); lblDateInformation = new JLabel(""); add(lblDateInformation, UITools.createGridBagConstraints(GridBagConstraints.WEST, null, 2, 3)); add(new JLabel(MTGControler.getInstance().getLangService().getCapitalize("DESCRIPTION") + " :"), UITools.createGridBagConstraints(null, null, 1, 4)); textArea = new JTextArea(); textArea.setLineWrap(true); textArea.setWrapStyleWord(true); add(new JLabel(MTGControler.getInstance().getLangService().getCapitalize("QTY") + " :"), UITools.createGridBagConstraints(null, null, 1, 5)); nbCardsProgress = new JProgressBar(); nbCardsProgress.setStringPainted(true); add(nbCardsProgress, UITools.createGridBagConstraints(null, GridBagConstraints.HORIZONTAL, 2, 5)); lbstd = new JLabel(" STD "); lbstd.setOpaque(true); lbstd.setBackground(Color.GREEN); lbmnd = new JLabel(" MDN "); lbmnd.setOpaque(true); lbmnd.setBackground(Color.GREEN); lbvin = new JLabel(" VIN "); lbvin.setOpaque(true); lbvin.setBackground(Color.GREEN); lbcmd = new JLabel(" CMD "); lbcmd.setOpaque(true); lbcmd.setBackground(Color.GREEN); lbLeg = new JLabel(" LEG "); lbLeg.setOpaque(true); lbLeg.setBackground(Color.GREEN); panelLegalities.add(lbvin); panelLegalities.add(lbLeg); panelLegalities.add(lbstd); panelLegalities.add(lbmnd); panelLegalities.add(lbcmd); add(new JLabel(MTGControler.getInstance().getLangService().getCapitalize("SIDEBOARD") + " :"), UITools.createGridBagConstraints(null, null, 1, 6)); nbSideProgress = new JProgressBar(); nbSideProgress.setMaximum(15); nbSideProgress.setStringPainted(true); add(nbSideProgress, UITools.createGridBagConstraints(null, GridBagConstraints.HORIZONTAL, 2, 6)); add(new JScrollPane(textArea), UITools.createGridBagConstraints(null, GridBagConstraints.BOTH, 2, 4)); add(new JLabel(MTGControler.getInstance().getLangService().getCapitalize("TAGS") + " :"), UITools.createGridBagConstraints(null, GridBagConstraints.BOTH, 1, 7)); tagsPanel = new JTagsPanel(); add(tagsPanel, UITools.createGridBagConstraints(GridBagConstraints.WEST, GridBagConstraints.VERTICAL, 2, 7)); panel = new JPanel(); add(panel, UITools.createGridBagConstraints(null, GridBagConstraints.BOTH, 2, 8)); if (magicDeck != null) { mBindingGroup = initDataBindings(); } } public MagicDeck getMagicDeck() { return magicDeck; } public void setMagicDeck(MagicDeck newMagicDeck) { setMagicDeck(newMagicDeck, true); } public void setLegalities() { if (!MTGDeckManager.isLegal(magicDeck,FORMATS.STANDARD)) lbstd.setBackground(Color.RED); else lbstd.setBackground(Color.GREEN); if (!MTGDeckManager.isLegal(magicDeck,FORMATS.MODERN)) lbmnd.setBackground(Color.RED); else lbmnd.setBackground(Color.GREEN); if (!MTGDeckManager.isLegal(magicDeck,FORMATS.LEGACY)) lbLeg.setBackground(Color.RED); else lbLeg.setBackground(Color.GREEN); if (!MTGDeckManager.isLegal(magicDeck,FORMATS.VINTAGE)) lbvin.setBackground(Color.RED); else lbvin.setBackground(Color.GREEN); if (!MTGDeckManager.isLegal(magicDeck,FORMATS.COMMANDER)) lbcmd.setBackground(Color.RED); else lbcmd.setBackground(Color.GREEN); } public void setMagicDeck(MagicDeck newMagicDeck, boolean update) { magicDeck = newMagicDeck; if (update) { if (mBindingGroup != null) { mBindingGroup.unbind(); mBindingGroup = null; } if (magicDeck != null) { mBindingGroup = initDataBindings(); } } } public void updatePicture() { if(magicDeck==null || magicDeck.getMain().isEmpty()) return; panel.removeAll(); SwingWorker<Void, BufferedImage> sw = new SwingWorker<>() { @Override protected Void doInBackground() throws Exception { for (int i = 0; i < 4; i++) { BufferedImage im = MTGControler.getInstance().getEnabled(MTGPictureProvider.class).extractPicture((MagicCard) magicDeck.getMain().keySet().toArray()[i]); publish(im); } return null; } @Override protected void process(List<BufferedImage> chunks) { panel.add(new JLabel(new ImageIcon(ImageTools.resize(chunks.get(0), 150, 220)))); } @Override protected void done() { panel.revalidate(); panel.repaint(); } }; ThreadManager.getInstance().runInEdt(sw,"extract deck pictures"); } protected BindingGroup initDataBindings() { BeanProperty<MagicDeck, String> nameProperty = BeanProperty.create("name"); BeanProperty<JTextField, String> textProperty1 = BeanProperty.create("text"); AutoBinding<MagicDeck, String, JTextField, String> autoBinding1 = Bindings .createAutoBinding(UpdateStrategy.READ_WRITE, magicDeck, nameProperty, nameJTextField, textProperty1); autoBinding1.bind(); // BeanProperty<MagicDeck, Integer> nbCardsProperty = BeanProperty.create("nbCards"); BeanProperty<JProgressBar, Integer> textProperty4 = BeanProperty.create("value"); AutoBinding<MagicDeck, Integer, JProgressBar, Integer> autoBinding2 = Bindings .createAutoBinding(UpdateStrategy.READ, magicDeck, nbCardsProperty, nbCardsProgress, textProperty4); autoBinding2.bind(); nbCardsProgress.setString("" + magicDeck.getNbCards()); nbSideProgress.setValue(magicDeck.getSideAsList().size()); setLegalities(); // BeanProperty<MagicDeck, String> descriptionProperty = BeanProperty.create("description"); BeanProperty<JTextArea, String> textProperty2 = BeanProperty.create("text"); AutoBinding<MagicDeck, String, JTextArea, String> autoBinding3 = Bindings .createAutoBinding(UpdateStrategy.READ_WRITE, magicDeck, descriptionProperty, textArea, textProperty2); autoBinding3.bind(); // BeanProperty<MagicDeck, String> colorIdentityProperty = BeanProperty.create("colors"); BeanProperty<ManaPanel, String> manaCostProperty3 = BeanProperty.create("manaCost"); AutoBinding<MagicDeck, String, ManaPanel, String> autoBinding4 = Bindings.createAutoBinding(UpdateStrategy.READ, magicDeck, colorIdentityProperty, manaPanel, manaCostProperty3); autoBinding4.bind(); // BindingGroup bindingGroup = new BindingGroup(); bindingGroup.addBinding(autoBinding1); bindingGroup.addBinding(autoBinding2); bindingGroup.addBinding(autoBinding3); bindingGroup.addBinding(autoBinding4); if (magicDeck != null && magicDeck.getDateCreation() != null) { DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, MTGControler.getInstance().getLocale()); lblDateInformation.setText(df.format(magicDeck.getDateCreation())); } tagsPanel.clean(); if (magicDeck != null) tagsPanel.bind(magicDeck.getTags()); return bindingGroup; } }