	private void initGUI() {
		setLayout(new BorderLayout(0, 0));
		Player p = new Player();

		JPanel panneauHaut = new JPanel();
		JButton btnUpdate;
		HandPanel thumbnail;
		JPanel panelBottom;
		JTextField txtSearch;
		JComboBox<String> cboAttributs;
		JTabbedPane tabbedPane;
		ButtonGroup groupsFilterResult;
		AbstractBuzyIndicatorComponent buzyLabel = AbstractBuzyIndicatorComponent.createProgressComponent();
		deckmodel = new DeckCardsTableModel(DeckCardsTableModel.TYPE.DECK);
		deckSidemodel = new DeckCardsTableModel(DeckCardsTableModel.TYPE.SIDE);
		deckDetailsPanel = new DeckDetailsPanel();
		panelBottom = new JPanel();
		thumbnail = new HandPanel();
		FlowLayout flowLayout = (FlowLayout) panneauHaut.getLayout();
		cboAttributs = UITools.createCombobox(MTGControler.getInstance().getEnabled(MTGCardsProvider.class).getQueryableAttributs());
		txtSearch = UITools.createSearchField();

		lblCards = new JLabel();
		JButton btnNewDeck = new JButton(MTGConstants.ICON_NEW);
		JButton btnOpen = new JButton(MTGConstants.ICON_OPEN);
		btnUpdate = new JButton();
		JButton btnSave = new JButton(MTGConstants.ICON_SAVE);
		JButton btnImport = new JButton(MTGConstants.ICON_IMPORT);
		btnExports = new JButton();
		stockPanel = new DeckStockComparatorPanel();
		AbstractBuzyIndicatorComponent buzy = AbstractBuzyIndicatorComponent.createLabelComponent();
		JPanel panneauBas = new JPanel();
		tabbedPane = new JTabbedPane(JTabbedPane.TOP);
		JSplitPane panneauDeck = new JSplitPane();
		magicCardDetailPanel = new MagicCardDetailPanel();
		cardDrawProbaPanel = new DrawProbabilityPanel();
		JXTable tableDeck = new JXTable();
		JXTable tableSide = new JXTable();
		final JTabbedPane tabbedDeckSide = new JTabbedPane(JTabbedPane.RIGHT);
		JPanel panelInfoDeck = new JPanel();
		cmcChartPanel = new CmcChartPanel();
		manaRepartitionPanel = new ManaRepartitionPanel();
		typeRepartitionPanel = new TypeRepartitionPanel();
		rarityRepartitionPanel = new RarityRepartitionPanel();
		drawProbabilityPanel = new DrawProbabilityPanel();
		JPanel randomHandPanel = new JPanel();
		JPanel statPanel = new JPanel();
		deckPricePanel = new DeckPricePanel();
		JPanel panel = new JPanel();
		JButton btnDrawAHand = new JButton(MTGControler.getInstance().getLangService().getCapitalize("DRAW_HAND"));
		JPanel panneauResultFilter = new JPanel();
		JToggleButton tglbtnStd = new JToggleButton("STD");
		JToggleButton tglbtnMdn = new JToggleButton("MDN");
		JToggleButton tglbtnLeg = new JToggleButton("LEG");
		JToggleButton tglbtnVin = new JToggleButton("VIN");
		JToggleButton tglbtnCmd = new JToggleButton("CMD");

		JPanel panneauGauche = new JPanel();
		listResult = new JList<>(new DefaultListModel<MagicCard>());
		groupsFilterResult = new ButtonGroup() {
			private static final long serialVersionUID = 1L;

			@Override
			public void setSelected(ButtonModel model, boolean selected) {
				if (selected) {
					super.setSelected(model, selected);
				} else {
					clearSelection();
				}
			}
		};

		thumbnail.setThumbnailSize(new Dimension(223, 311));
		thumbnail.enableDragging(false);
		thumbnail.setMaxCardsRow(4);
		flowLayout.setAlignment(FlowLayout.LEFT);
		txtSearch.setBackground(Color.WHITE);
		txtSearch.setColumns(25);
		btnNewDeck.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("CREATE_NEW_DECK"));
		btnOpen.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("OPEN_DECK"));
		btnUpdate.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("UPDATE_DECK"));
		btnUpdate.setIcon(MTGConstants.ICON_REFRESH);
		btnSave.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("SAVE_DECK"));
		btnExports.setEnabled(false);
		btnExports.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("EXPORT_AS"));
		btnExports.setIcon(MTGConstants.ICON_EXPORT);
		panneauDeck.setDividerLocation(0.5);
		panneauDeck.setResizeWeight(0.5);
		panneauDeck.setOrientation(JSplitPane.VERTICAL_SPLIT);
		magicCardDetailPanel.enableThumbnail(true);
		panelBottom.setLayout(new BorderLayout(0, 0));
		panelInfoDeck.setLayout(new BorderLayout(0, 0));
		randomHandPanel.setLayout(new BorderLayout(0, 0));
		statPanel.setLayout(new GridLayout(3, 2, 0, 0));
		btnImport.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("DECK_IMPORT_AS"));
		panneauGauche.setLayout(new BorderLayout(0, 0));
		listResult.setCellRenderer(new MagicCardListRenderer());
		listResult.setMinimumSize(new Dimension(100, 0));
		listResult.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		tglbtnStd.setActionCommand("Standard");
		tglbtnMdn.setActionCommand("Modern");
		tglbtnLeg.setActionCommand("Legacy");
		tglbtnVin.setActionCommand("Vintage");
		tglbtnCmd.setActionCommand("Commander");

		add(panneauHaut, BorderLayout.NORTH);
		panneauHaut.add(cboAttributs);
		panneauHaut.add(txtSearch);
		panneauHaut.add(buzy);
		panneauHaut.add(lblCards);
		panneauHaut.add(btnNewDeck);
		panneauHaut.add(btnOpen);
		panneauHaut.add(btnUpdate);
		panneauHaut.add(btnSave);
		panneauHaut.add(btnImport);
		panneauHaut.add(btnExports);
		panneauHaut.add(buzyLabel);
		add(panneauBas, BorderLayout.SOUTH);
		add(tabbedPane, BorderLayout.CENTER);
		panelBottom.add(magicCardDetailPanel);
		panneauDeck.setRightComponent(panelBottom);
		panelBottom.add(cardDrawProbaPanel, BorderLayout.EAST);
		panneauDeck.setLeftComponent(tabbedDeckSide);
		tabbedDeckSide.addTab("Main", MTGConstants.ICON_TAB_DECK, new JScrollPane(tableDeck), null);
		tabbedDeckSide.addTab("SideBoard", MTGConstants.ICON_TAB_DECK, new JScrollPane(tableSide), null);

		tabbedPane.addTab(MTGControler.getInstance().getLangService().getCapitalize("DECK"), MTGConstants.ICON_TAB_DECK,panneauDeck, null);
		tabbedPane.addTab(MTGControler.getInstance().getLangService().getCapitalize("INFORMATIONS"),MTGConstants.ICON_TAB_DETAILS, panelInfoDeck, null);
		tabbedPane.addTab(MTGControler.getInstance().getLangService().getCapitalize("STATS"),MTGConstants.ICON_TAB_ANALYSE, statPanel, null);
		tabbedPane.addTab(MTGControler.getInstance().getLangService().getCapitalize("SAMPLE_HAND"),MTGConstants.ICON_TAB_THUMBNAIL, randomHandPanel, null);
		tabbedPane.addTab(MTGControler.getInstance().getLangService().getCapitalize("STOCK_MODULE"),MTGConstants.ICON_TAB_STOCK, stockPanel, null);

		panelInfoDeck.add(deckDetailsPanel, BorderLayout.NORTH);
		randomHandPanel.add(thumbnail, BorderLayout.CENTER);
		statPanel.add(manaRepartitionPanel);
		statPanel.add(typeRepartitionPanel);
		statPanel.add(rarityRepartitionPanel);
		statPanel.add(cmcChartPanel);
		statPanel.add(drawProbabilityPanel);
		statPanel.add(deckPricePanel);
		randomHandPanel.add(panel, BorderLayout.NORTH);
		panel.add(btnDrawAHand);
		add(panneauGauche, BorderLayout.WEST);
		panneauResultFilter.add(tglbtnStd);
		panneauResultFilter.add(tglbtnMdn);
		panneauResultFilter.add(tglbtnLeg);
		panneauResultFilter.add(tglbtnVin);
		panneauResultFilter.add(tglbtnCmd);
		groupsFilterResult.add(tglbtnStd);
		groupsFilterResult.add(tglbtnMdn);
		groupsFilterResult.add(tglbtnLeg);
		groupsFilterResult.add(tglbtnVin);
		groupsFilterResult.add(tglbtnCmd);
		panneauGauche.add(new JScrollPane(listResult));
		panneauGauche.add(panneauResultFilter, BorderLayout.NORTH);

		initTables(tableDeck,MAIN,deckmodel);
		initTables(tableSide,SIDE,deckSidemodel);
		deckDetailsPanel.setMagicDeck(deck);

//////////////////////////////////////////////////////////////////ACTIONS
		btnNewDeck.addActionListener(newDeckEvent -> {
			MagicDeck newDeck = new MagicDeck();
			setDeck(newDeck);
		});

		btnOpen.addActionListener(openEvent -> {
			try {
				JDeckChooserDialog choose = new JDeckChooserDialog();
				choose.setVisible(true);
				deck = choose.getSelectedDeck();
				if (deck != null) {
					deckDetailsPanel.setMagicDeck(deck);
					deckmodel.init(deck);
					deckSidemodel.init(deck);
					setDeck(deck);
					updatePanels();
				}
			} catch (Exception ex) {
				logger.error(ex);
				MTGControler.getInstance().notify(ex);
			}

		});

		btnUpdate.addActionListener(updateEvent ->  {
			Map<MagicCard, Integer> updateM = new HashMap<>();
			Map<MagicCard, Integer> updateS = new HashMap<>();
			btnUpdate.setEnabled(false);
			buzyLabel.start(deck.getMap().size() + deck.getMapSideBoard().size());
			SwingWorker<Void, MagicCard> sw = new SwingWorker<>()
					{
						@Override
						protected void done() {
							buzyLabel.end();
							btnUpdate.setEnabled(true);

							deck.getMap().clear();
							deck.setMapDeck(updateM);

							deck.getMapSideBoard().clear();
							deck.setMapSideBoard(updateS);

							updatePanels();

							btnUpdate.setEnabled(true);
							buzyLabel.end();
							MTGControler.getInstance()
									.notify(new MTGNotification(MTGControler.getInstance().getLangService().getCapitalize(FINISHED),
											MTGControler.getInstance().getLangService().getCapitalize(UPDATED_DECK),
											MESSAGE_TYPE.INFO));
						}

						@Override
						protected void process(List<MagicCard> chunks) {
							buzyLabel.progressSmooth(chunks.size());
						}

						@Override
						protected Void doInBackground() throws Exception {
							for (MagicCard mc : deck.getMap().keySet()) {
								try {
									updateM.put(MTGControler.getInstance().getEnabled(MTGCardsProvider.class).searchCardByName(mc.getName(), mc.getCurrentSet(), true).get(0),deck.getMap().get(mc));
									publish(mc);
								} catch (Exception e) {
									logger.error("error update " + mc,e);
								}
							}
							for (MagicCard mc : deck.getMapSideBoard().keySet()) {
								try {
									updateS.put(MTGControler.getInstance().getEnabled(MTGCardsProvider.class).searchCardByName(mc.getName(), mc.getCurrentSet(), true).get(0),deck.getMapSideBoard().get(mc));
									publish(mc);
								} catch (Exception e) {
									logger.error("error update " + mc,e);

								}
							}
							return null;
						}

					};
			ThreadManager.getInstance().runInEdt(sw,"updating "+deck);
		});

		btnSave.addActionListener(e -> {
			try {
				logger.debug("saving " + deck);
				String name = JOptionPane.showInputDialog(MTGControler.getInstance().getLangService().getCapitalize("DECK_NAME") + " ?", deck);

				if(name!=null && !name.isEmpty())
				{
					deck.setName(name);
					deckManager.saveDeck(deck);
					p.setDeck(deck);
				}
			} catch (Exception ex) {
				logger.error("error saving", ex);
				MTGControler.getInstance().notify(ex);
			}

		});

	btnDrawAHand.addActionListener(ae -> {
			thumbnail.removeAll();
			p.setDeck(deck);
			p.mixHandAndLibrary();
			p.shuffleLibrary();
			p.drawCard(7);
			thumbnail.initThumbnails(p.getHand().getCards(), false, false);

		});

		listResult.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent ev) {

				if (ev.getClickCount() == 1 && !ev.isConsumed()) {
					ev.consume();
					MagicCard mc = listResult.getSelectedValue();
					magicCardDetailPanel.setMagicCard(mc);

				}

				if (ev.getClickCount() == 2 && !ev.isConsumed()) {
					ev.consume();

					MagicCard mc = listResult.getSelectedValue();

					if (getSelectedMap().get(mc) != null) {
						getSelectedMap().put(mc, deck.getMap().get(mc) + 1);
					} else {
						getSelectedMap().put(mc, 1);
					}
					deckmodel.init(deck);
					deckSidemodel.init(deck);
				}
			}
		});

		tabbedDeckSide.addChangeListener(e -> selectedIndex = tabbedDeckSide.getSelectedIndex());

		btnImport.addActionListener(ae -> {
			JPopupMenu menu = new JPopupMenu();
			for (final MTGCardsExport exp : MTGControler.getInstance().listEnabled(MTGCardsExport.class)) {
				if (exp.getMods() == MODS.BOTH || exp.getMods() == MODS.IMPORT) {

					JMenuItem it = new JMenuItem(exp.getName(),exp.getIcon());
					it.addActionListener(itEvent -> {
						JFileChooser jf = new JFileChooser(MTGConstants.DATA_DIR);
						jf.setFileFilter(new FileFilter() {
							@Override
							public String getDescription() {
								return exp.getName();
							}

							@Override
							public boolean accept(File f) {
								return (f.isDirectory() || f.getName().endsWith(exp.getFileExtension()));
							}
						});

						int res = -1;
						f = new File("");

						if (!exp.needDialogGUI()) {
							res = jf.showOpenDialog(null);
							f = jf.getSelectedFile();
						}
						else {
							try {
								setDeck(exp.importDeck(null));
								updatePanels();
							} catch (IOException e1) {
								logger.error(e1);
							}

						}

						if (res == JFileChooser.APPROVE_OPTION)
						{
							buzyLabel.start();
							DeckImportWorker importWork = new DeckImportWorker(exp, buzyLabel, f) {
								@Override
								protected void done() {
									super.done();
									try {
										setDeck(get());
										updatePanels();
									} catch (Exception e) {
										logger.error(e);
									}
								}
							};
							ThreadManager.getInstance().runInEdt(importWork,"Deck imports from "+f);
						}
					});

					menu.add(it);

				}
			}

			Component b = (Component) ae.getSource();
			Point point = b.getLocationOnScreen();
			menu.show(b, 0, 0);
			menu.setLocation(point.x, point.y + b.getHeight());

		});

		btnExports.addActionListener(exportsAction -> {
			JPopupMenu menu = new JPopupMenu();

			for (final MTGCardsExport exp : MTGControler.getInstance().listEnabled(MTGCardsExport.class)) {
				if (exp.getMods() == MODS.BOTH || exp.getMods() == MODS.EXPORT) {
					JMenuItem it = new JMenuItem(exp.getName(),exp.getIcon());
					it.addActionListener(pluginExportEvent -> {
						JFileChooser jf = new JFileChooser(".");
						jf.setSelectedFile(new File(deck + exp.getFileExtension()));
						int result=jf.showSaveDialog(null);
						exportedFile = jf.getSelectedFile();
						if (result == JFileChooser.APPROVE_OPTION)
						{
							buzyLabel.start(deck.getAsList().size());
							ThreadManager.getInstance().runInEdt(new CardExportWorker(exp, deck, buzyLabel, exportedFile), "export "+ deck +" to " + exp);
						}

					});
					menu.add(it);
				}
			}

			Component b = (Component) exportsAction.getSource();
			Point point = b.getLocationOnScreen();
			menu.show(b, 0, 0);
			menu.setLocation(point.x, point.y + b.getHeight());

		});

		txtSearch.addActionListener(aeSearch -> {

			resultListModel.clear();

			if (txtSearch.getText().isEmpty())
				return;

			AbstractObservableWorker<List<MagicCard>,MagicCard,MTGCardsProvider> sw = new AbstractObservableWorker<>(buzy,MTGControler.getInstance().getEnabled(MTGCardsProvider.class))
			{
				@Override
				protected List<MagicCard> doInBackground() throws Exception {
					return plug.searchCardByCriteria(cboAttributs.getSelectedItem().toString(), txtSearch.getText(), null, false);
				}

				@Override
				protected void process(List<MagicCard> chunks) {
					super.process(chunks);
					MagicFormat form = new MagicFormat();
					for (MagicCard m : chunks) {
						if (groupsFilterResult.getSelection() != null) {
							form.setFormat(groupsFilterResult.getSelection().getActionCommand());
							if (m.getLegalities().contains(form))
								resultListModel.addElement(m);
						} else {
							resultListModel.addElement(m);
						}
					}
				}
				@Override
				protected void done() {
					super.done();
					lblCards.setText(resultListModel.size() + " " + MTGControler.getInstance().getLangService().get("RESULTS"));
					listResult.setModel(resultListModel);
					listResult.updateUI();
				}
			};

			ThreadManager.getInstance().runInEdt(sw,"search cards for deck");

		});
	}

	private void initGUI() {
		setLayout(new BorderLayout(0, 0));
		Player p = new Player();

		JPanel panneauHaut = new JPanel();
		JButton btnUpdate;
		HandPanel thumbnail;
		JPanel panelBottom;
		JTextField txtSearch;
		JComboBox<String> cboAttributs;
		JTabbedPane tabbedPane;
		ButtonGroup groupsFilterResult;
		AbstractBuzyIndicatorComponent buzyLabel = AbstractBuzyIndicatorComponent.createProgressComponent();
		deckmodel = new DeckCardsTableModel(DeckCardsTableModel.TYPE.DECK);
		deckSidemodel = new DeckCardsTableModel(DeckCardsTableModel.TYPE.SIDE);
		deckDetailsPanel = new DeckDetailsPanel();
		panelBottom = new JPanel();
		thumbnail = new HandPanel();
		FlowLayout flowLayout = (FlowLayout) panneauHaut.getLayout();
		cboAttributs = UITools.createCombobox(MTGControler.getInstance().getEnabled(MTGCardsProvider.class).getQueryableAttributs());
		txtSearch = UITools.createSearchField();

		lblCards = new JLabel();
		JButton btnNewDeck = new JButton(MTGConstants.ICON_NEW);
		JButton btnOpen = new JButton(MTGConstants.ICON_OPEN);
		btnUpdate = new JButton();
		JButton btnSave = new JButton(MTGConstants.ICON_SAVE);
		JButton btnImport = new JButton(MTGConstants.ICON_IMPORT);
		btnExports = new JButton();
		stockPanel = new DeckStockComparatorPanel();
		AbstractBuzyIndicatorComponent buzy = AbstractBuzyIndicatorComponent.createLabelComponent();
		JPanel panneauBas = new JPanel();
		tabbedPane = new JTabbedPane(JTabbedPane.TOP);
		JSplitPane panneauDeck = new JSplitPane();
		magicCardDetailPanel = new MagicCardDetailPanel();
		cardDrawProbaPanel = new DrawProbabilityPanel();
		JXTable tableDeck = new JXTable();
		JXTable tableSide = new JXTable();
		final JTabbedPane tabbedDeckSide = new JTabbedPane(JTabbedPane.RIGHT);
		JPanel panelInfoDeck = new JPanel();
		cmcChartPanel = new CmcChartPanel();
		manaRepartitionPanel = new ManaRepartitionPanel();
		typeRepartitionPanel = new TypeRepartitionPanel();
		rarityRepartitionPanel = new RarityRepartitionPanel();
		drawProbabilityPanel = new DrawProbabilityPanel();
		JPanel randomHandPanel = new JPanel();
		JPanel statPanel = new JPanel();
		deckPricePanel = new DeckPricePanel();
		JPanel panel = new JPanel();
		JButton btnDrawAHand = new JButton(MTGControler.getInstance().getLangService().getCapitalize("DRAW_HAND"));
		JPanel panneauResultFilter = new JPanel();
		JToggleButton tglbtnStd = new JToggleButton("STD");
		JToggleButton tglbtnMdn = new JToggleButton("MDN");
		JToggleButton tglbtnLeg = new JToggleButton("LEG");
		JToggleButton tglbtnVin = new JToggleButton("VIN");
		JToggleButton tglbtnCmd = new JToggleButton("CMD");

		JPanel panneauGauche = new JPanel();
		listResult = new JList<>(new DefaultListModel<MagicCard>());
		groupsFilterResult = new ButtonGroup() {
			private static final long serialVersionUID = 1L;

			@Override
			public void setSelected(ButtonModel model, boolean selected) {
				if (selected) {
					super.setSelected(model, selected);
				} else {
					clearSelection();
				}
			}
		};

		thumbnail.setThumbnailSize(new Dimension(223, 311));
		thumbnail.enableDragging(false);
		thumbnail.setMaxCardsRow(4);
		flowLayout.setAlignment(FlowLayout.LEFT);
		txtSearch.setBackground(Color.WHITE);
		txtSearch.setColumns(25);
		btnNewDeck.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("CREATE_NEW_DECK"));
		btnOpen.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("OPEN_DECK"));
		btnUpdate.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("UPDATE_DECK"));
		btnUpdate.setIcon(MTGConstants.ICON_REFRESH);
		btnSave.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("SAVE_DECK"));
		btnExports.setEnabled(false);
		btnExports.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("EXPORT_AS"));
		btnExports.setIcon(MTGConstants.ICON_EXPORT);
		panneauDeck.setDividerLocation(0.5);
		panneauDeck.setResizeWeight(0.5);
		panneauDeck.setOrientation(JSplitPane.VERTICAL_SPLIT);
		magicCardDetailPanel.enableThumbnail(true);
		panelBottom.setLayout(new BorderLayout(0, 0));
		panelInfoDeck.setLayout(new BorderLayout(0, 0));
		randomHandPanel.setLayout(new BorderLayout(0, 0));
		statPanel.setLayout(new GridLayout(3, 2, 0, 0));
		btnImport.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("DECK_IMPORT_AS"));
		panneauGauche.setLayout(new BorderLayout(0, 0));
		listResult.setCellRenderer(new MagicCardListRenderer());
		listResult.setMinimumSize(new Dimension(100, 0));
		listResult.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		tglbtnStd.setActionCommand("Standard");
		tglbtnMdn.setActionCommand("Modern");
		tglbtnLeg.setActionCommand("Legacy");
		tglbtnVin.setActionCommand("Vintage");
		tglbtnCmd.setActionCommand("Commander");

		add(panneauHaut, BorderLayout.NORTH);
		panneauHaut.add(cboAttributs);
		panneauHaut.add(txtSearch);
		panneauHaut.add(buzy);
		panneauHaut.add(lblCards);
		panneauHaut.add(btnNewDeck);
		panneauHaut.add(btnOpen);
		panneauHaut.add(btnUpdate);
		panneauHaut.add(btnSave);
		panneauHaut.add(btnImport);
		panneauHaut.add(btnExports);
		panneauHaut.add(buzyLabel);
		add(panneauBas, BorderLayout.SOUTH);
		add(tabbedPane, BorderLayout.CENTER);
		panelBottom.add(magicCardDetailPanel);
		panneauDeck.setRightComponent(panelBottom);
		panelBottom.add(cardDrawProbaPanel, BorderLayout.EAST);
		panneauDeck.setLeftComponent(tabbedDeckSide);
		tabbedDeckSide.addTab("Main", MTGConstants.ICON_TAB_DECK, new JScrollPane(tableDeck), null);
		tabbedDeckSide.addTab("SideBoard", MTGConstants.ICON_TAB_DECK, new JScrollPane(tableSide), null);

		tabbedPane.addTab(MTGControler.getInstance().getLangService().getCapitalize("DECK"), MTGConstants.ICON_TAB_DECK,panneauDeck, null);
		tabbedPane.addTab(MTGControler.getInstance().getLangService().getCapitalize("INFORMATIONS"),MTGConstants.ICON_TAB_DETAILS, panelInfoDeck, null);
		tabbedPane.addTab(MTGControler.getInstance().getLangService().getCapitalize("STATS"),MTGConstants.ICON_TAB_ANALYSE, statPanel, null);
		tabbedPane.addTab(MTGControler.getInstance().getLangService().getCapitalize("SAMPLE_HAND"),MTGConstants.ICON_TAB_THUMBNAIL, randomHandPanel, null);
		tabbedPane.addTab(MTGControler.getInstance().getLangService().getCapitalize("STOCK_MODULE"),MTGConstants.ICON_TAB_STOCK, stockPanel, null);

		panelInfoDeck.add(deckDetailsPanel, BorderLayout.NORTH);
		randomHandPanel.add(thumbnail, BorderLayout.CENTER);
		statPanel.add(manaRepartitionPanel);
		statPanel.add(typeRepartitionPanel);
		statPanel.add(rarityRepartitionPanel);
		statPanel.add(cmcChartPanel);
		statPanel.add(drawProbabilityPanel);
		statPanel.add(deckPricePanel);
		randomHandPanel.add(panel, BorderLayout.NORTH);
		panel.add(btnDrawAHand);
		add(panneauGauche, BorderLayout.WEST);
		panneauResultFilter.add(tglbtnStd);
		panneauResultFilter.add(tglbtnMdn);
		panneauResultFilter.add(tglbtnLeg);
		panneauResultFilter.add(tglbtnVin);
		panneauResultFilter.add(tglbtnCmd);
		groupsFilterResult.add(tglbtnStd);
		groupsFilterResult.add(tglbtnMdn);
		groupsFilterResult.add(tglbtnLeg);
		groupsFilterResult.add(tglbtnVin);
		groupsFilterResult.add(tglbtnCmd);
		panneauGauche.add(new JScrollPane(listResult));
		panneauGauche.add(panneauResultFilter, BorderLayout.NORTH);

		initTables(tableDeck,MAIN,deckmodel);
		initTables(tableSide,SIDE,deckSidemodel);
		deckDetailsPanel.setMagicDeck(deck);

//////////////////////////////////////////////////////////////////ACTIONS
		btnNewDeck.addActionListener(newDeckEvent -> {
			MagicDeck newDeck = new MagicDeck();
			setDeck(newDeck);
		});

		btnOpen.addActionListener(openEvent -> {
			try {
				JDeckChooserDialog choose = new JDeckChooserDialog();
				choose.setVisible(true);
				deck = choose.getSelectedDeck();
				if (deck != null) {
					deckDetailsPanel.setMagicDeck(deck);
					deckmodel.init(deck);
					deckSidemodel.init(deck);
					setDeck(deck);
					updatePanels();
				}
			} catch (Exception ex) {
				logger.error(ex);
				MTGControler.getInstance().notify(ex);
			}

		});

		btnUpdate.addActionListener(updateEvent ->  {
			Map<MagicCard, Integer> updateM = new HashMap<>();
			Map<MagicCard, Integer> updateS = new HashMap<>();
			btnUpdate.setEnabled(false);
			buzyLabel.start(deck.getMap().size() + deck.getMapSideBoard().size());
			SwingWorker<Void, MagicCard> sw = new SwingWorker<Void, MagicCard>()
					{
						@Override
						protected void done() {
							buzyLabel.end();
							btnUpdate.setEnabled(true);

							deck.getMap().clear();
							deck.setMapDeck(updateM);

							deck.getMapSideBoard().clear();
							deck.setMapSideBoard(updateS);

							updatePanels();

							btnUpdate.setEnabled(true);
							buzyLabel.end();
							MTGControler.getInstance()
									.notify(new MTGNotification(MTGControler.getInstance().getLangService().getCapitalize(FINISHED),
											MTGControler.getInstance().getLangService().getCapitalize(UPDATED_DECK),
											MESSAGE_TYPE.INFO));
						}

						@Override
						protected void process(List<MagicCard> chunks) {
							buzyLabel.progressSmooth(chunks.size());
						}

						@Override
						protected Void doInBackground() throws Exception {
							for (MagicCard mc : deck.getMap().keySet()) {
								try {
									updateM.put(MTGControler.getInstance().getEnabled(MTGCardsProvider.class).searchCardByName(mc.getName(), mc.getCurrentSet(), true).get(0),deck.getMap().get(mc));
									publish(mc);
								} catch (Exception e) {
									logger.error("error update " + mc,e);
								}
							}
							for (MagicCard mc : deck.getMapSideBoard().keySet()) {
								try {
									updateS.put(MTGControler.getInstance().getEnabled(MTGCardsProvider.class).searchCardByName(mc.getName(), mc.getCurrentSet(), true).get(0),deck.getMapSideBoard().get(mc));
									publish(mc);
								} catch (Exception e) {
									logger.error("error update " + mc,e);

								}
							}
							return null;
						}

					};
			ThreadManager.getInstance().runInEdt(sw,"updating "+deck);
		});

		btnSave.addActionListener(e -> {
			try {
				logger.debug("saving " + deck);
				String name = JOptionPane.showInputDialog(MTGControler.getInstance().getLangService().getCapitalize("DECK_NAME") + " ?", deck);

				if(name!=null && !name.isEmpty())
				{
					deck.setName(name);
					deckManager.saveDeck(deck);
					p.setDeck(deck);
				}
			} catch (Exception ex) {
				logger.error("error saving", ex);
				MTGControler.getInstance().notify(ex);
			}

		});

	btnDrawAHand.addActionListener(ae -> {
			thumbnail.removeAll();
			p.setDeck(deck);
			p.mixHandAndLibrary();
			p.shuffleLibrary();
			p.drawCard(7);
			thumbnail.initThumbnails(p.getHand().getCards(), false, false);

		});

		listResult.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent ev) {

				if (ev.getClickCount() == 1 && !ev.isConsumed()) {
					ev.consume();
					MagicCard mc = listResult.getSelectedValue();
					magicCardDetailPanel.setMagicCard(mc);

				}

				if (ev.getClickCount() == 2 && !ev.isConsumed()) {
					ev.consume();

					MagicCard mc = listResult.getSelectedValue();

					if (getSelectedMap().get(mc) != null) {
						getSelectedMap().put(mc, deck.getMap().get(mc) + 1);
					} else {
						getSelectedMap().put(mc, 1);
					}
					deckmodel.init(deck);
					deckSidemodel.init(deck);
				}
			}
		});

		tabbedDeckSide.addChangeListener(e -> selectedIndex = tabbedDeckSide.getSelectedIndex());

		btnImport.addActionListener(ae -> {
			JPopupMenu menu = new JPopupMenu();
			for (final MTGCardsExport exp : MTGControler.getInstance().listEnabled(MTGCardsExport.class)) {
				if (exp.getMods() == MODS.BOTH || exp.getMods() == MODS.IMPORT) {

					JMenuItem it = new JMenuItem(exp.getName(),exp.getIcon());
					it.addActionListener(itEvent -> {
						JFileChooser jf = new JFileChooser(MTGConstants.DATA_DIR);
						jf.setFileFilter(new FileFilter() {
							@Override
							public String getDescription() {
								return exp.getName();
							}

							@Override
							public boolean accept(File f) {
								return (f.isDirectory() || f.getName().endsWith(exp.getFileExtension()));
							}
						});

						int res = -1;
						f = new File("");

						if (!exp.needDialogGUI()) {
							res = jf.showOpenDialog(null);
							f = jf.getSelectedFile();
						}
						else {
							try {
								setDeck(exp.importDeck(null));
								updatePanels();
							} catch (IOException e1) {
								logger.error(e1);
							}

						}

						if (res == JFileChooser.APPROVE_OPTION)
						{
							buzyLabel.start();
							DeckImportWorker importWork = new DeckImportWorker(exp, buzyLabel, f) {
								@Override
								protected void done() {
									super.done();
									try {
										setDeck(get());
										updatePanels();
									} catch (Exception e) {
										logger.error(e);
									}
								}
							};
							ThreadManager.getInstance().runInEdt(importWork,"Deck imports from "+f);
						}
					});

					menu.add(it);

				}
			}

			Component b = (Component) ae.getSource();
			Point point = b.getLocationOnScreen();
			menu.show(b, 0, 0);
			menu.setLocation(point.x, point.y + b.getHeight());

		});

		btnExports.addActionListener(exportsAction -> {
			JPopupMenu menu = new JPopupMenu();

			for (final MTGCardsExport exp : MTGControler.getInstance().listEnabled(MTGCardsExport.class)) {
				if (exp.getMods() == MODS.BOTH || exp.getMods() == MODS.EXPORT) {
					JMenuItem it = new JMenuItem(exp.getName(),exp.getIcon());
					it.addActionListener(pluginExportEvent -> {
						JFileChooser jf = new JFileChooser(".");
						jf.setSelectedFile(new File(deck + exp.getFileExtension()));
						int result=jf.showSaveDialog(null);
						exportedFile = jf.getSelectedFile();
						if (result == JFileChooser.APPROVE_OPTION)
						{
							buzyLabel.start(deck.getAsList().size());
							ThreadManager.getInstance().runInEdt(new CardExportWorker(exp, deck, buzyLabel, exportedFile), "export "+ deck +" to " + exp);
						}

					});
					menu.add(it);
				}
			}

			Component b = (Component) exportsAction.getSource();
			Point point = b.getLocationOnScreen();
			menu.show(b, 0, 0);
			menu.setLocation(point.x, point.y + b.getHeight());

		});

		txtSearch.addActionListener(aeSearch -> {

			resultListModel.clear();

			if (txtSearch.getText().isEmpty())
				return;

			AbstractObservableWorker<List<MagicCard>,MagicCard,MTGCardsProvider> sw = new AbstractObservableWorker<List<MagicCard>,MagicCard,MTGCardsProvider>(buzy,MTGControler.getInstance().getEnabled(MTGCardsProvider.class))
			{
				@Override
				protected List<MagicCard> doInBackground() throws Exception {
					return plug.searchCardByCriteria(cboAttributs.getSelectedItem().toString(), txtSearch.getText(), null, false);
				}

				@Override
				protected void process(List<MagicCard> chunks) {
					super.process(chunks);
					MagicFormat form = new MagicFormat();
					for (MagicCard m : chunks) {
						if (groupsFilterResult.getSelection() != null) {
							form.setFormat(groupsFilterResult.getSelection().getActionCommand());
							if (m.getLegalities().contains(form))
								resultListModel.addElement(m);
						} else {
							resultListModel.addElement(m);
						}
					}
				}

				@Override
				protected void done() {
					super.done();
					lblCards.setText(resultListModel.size() + " " + MTGControler.getInstance().getLangService().get("RESULTS"));
					listResult.setModel(resultListModel);
					listResult.updateUI();
				}
			};

			ThreadManager.getInstance().runInEdt(sw,"search cards for deck");

		});
	}

Replace Generic With Diamond SwingWorker<Void,MagicCard> with SwingWorker<> in method private initGUI() : void from class org.magic.gui.components.ConstructPanel


	public void updatePicture() {

		if(magicDeck==null || magicDeck.getMap().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.getMap().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");

	}

	public void updatePicture() {

		if(magicDeck==null || magicDeck.getMap().isEmpty())
				return;

		panel.removeAll();
		SwingWorker<Void, BufferedImage> sw = new SwingWorker<Void, BufferedImage>()
		{

			@Override
			protected Void doInBackground() throws Exception {
				for (int i = 0; i < 4; i++) {
					BufferedImage im = MTGControler.getInstance().getEnabled(MTGPictureProvider.class).extractPicture((MagicCard) magicDeck.getMap().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");

	}

Replace Generic With Diamond SwingWorker<Void,BufferedImage> with SwingWorker<> in method public updatePicture() : void from class org.magic.gui.components.DeckDetailsPanel


	public DeckPricePanel() {
		setLayout(new BorderLayout(0, 0));

		JButton btnCheckPrice = new JButton(MTGConstants.ICON_EURO);
		JPanel panel = new JPanel();

		add(panel, BorderLayout.NORTH);

		cboPricers = UITools.createCombobox(MTGPricesProvider.class,false);
		panel.add(cboPricers);

		btnCheckPrice.addActionListener(ae -> {
			model.clear();
			SwingWorker<Void, MagicPrice> sw = new SwingWorker<>() {
				@Override
				protected void done() {
					lblPrice.setText(String.valueOf(total) + " " + MTGControler.getInstance().getCurrencyService().getCurrentCurrency().getCurrencyCode());
					deck.setAveragePrice(total);
				}

				@Override
				protected void process(List<MagicPrice> p) {
					model.addItems(p);

				}

				@Override
				protected Void doInBackground(){
					for (MagicCard c : deck.getMap().keySet()) {
						try {
							List<MagicPrice> prices = ((MTGPricesProvider)cboPricers.getSelectedItem()).getPrice(c.getCurrentSet(), c);
							MagicPrice p = null;
							if (!prices.isEmpty()) {
								Collections.sort(prices, new MagicPricesComparator());
								p = prices.get(0);
								p.setValue(p.getValue() * deck.getMap().get(c));
								p.setSite(c.getName() + "(x" + deck.getMap().get(c) + ")");
							} else {
								p = new MagicPrice();
								p.setValue(0.0);
								p.setSite(c.getName() + "(x" + deck.getMap().get(c) + ") - "+ MTGControler.getInstance().getLangService().get("NOT_FOUND"));
							}

							publish(p);
							total += p.getValue();

						} catch (Exception e) {
							logger.error("error in " + c, e);
						}

					}
					return null;
				}
			};
			ThreadManager.getInstance().runInEdt(sw, "loading deck price");

		});
		panel.add(btnCheckPrice);

		lblPrice = new JLabel();
		panel.add(lblPrice);
		lblPrice.setFont(MTGControler.getInstance().getFont().deriveFont( Font.BOLD, 13));

		model = new CardsPriceTableModel();
		tablePrice = new JXTable(model);
		tablePrice.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent ev) {
				if (ev.getClickCount() == 2 && !ev.isConsumed()) {
					ev.consume();
					try {
						String url = tablePrice.getValueAt(tablePrice.getSelectedRow(), CardsPriceTableModel.COLUMUM_URL)
								.toString();
						Desktop.getDesktop().browse(new URI(url));
					} catch (Exception e) {
						logger.error(e);
					}

				}

			}
		});

		add(new JScrollPane(tablePrice), BorderLayout.CENTER);
	}

	public DeckPricePanel() {
		setLayout(new BorderLayout(0, 0));

		JButton btnCheckPrice = new JButton(MTGConstants.ICON_EURO);
		JPanel panel = new JPanel();

		add(panel, BorderLayout.NORTH);

		cboPricers = UITools.createCombobox(MTGPricesProvider.class,false);
		panel.add(cboPricers);

		btnCheckPrice.addActionListener(ae -> {
			model.clear();
			SwingWorker<Void, MagicPrice> sw = new SwingWorker<Void, MagicPrice>() {
				@Override
				protected void done() {
					lblPrice.setText(String.valueOf(total) + " " + MTGControler.getInstance().getCurrencyService().getCurrentCurrency().getCurrencyCode());
					deck.setAveragePrice(total);
				}

				@Override
				protected void process(List<MagicPrice> p) {
					model.addItems(p);

				}

				@Override
				protected Void doInBackground(){
					for (MagicCard c : deck.getMap().keySet()) {
						try {
							List<MagicPrice> prices = ((MTGPricesProvider)cboPricers.getSelectedItem()).getPrice(c.getCurrentSet(), c);
							MagicPrice p = null;
							if (!prices.isEmpty()) {
								Collections.sort(prices, new MagicPricesComparator());
								p = prices.get(0);
								p.setValue(p.getValue() * deck.getMap().get(c));
								p.setSite(c.getName() + "(x" + deck.getMap().get(c) + ")");
							} else {
								p = new MagicPrice();
								p.setValue(0.0);
								p.setSite(c.getName() + "(x" + deck.getMap().get(c) + ") - "+ MTGControler.getInstance().getLangService().get("NOT_FOUND"));
							}

							publish(p);
							total += p.getValue();

						} catch (Exception e) {
							logger.error("error in " + c, e);
						}

					}
					return null;
				}
			};
			ThreadManager.getInstance().runInEdt(sw, "loading deck price");

		});
		panel.add(btnCheckPrice);

		lblPrice = new JLabel();
		panel.add(lblPrice);
		lblPrice.setFont(MTGControler.getInstance().getFont().deriveFont( Font.BOLD, 13));

		model = new CardsPriceTableModel();
		tablePrice = new JXTable(model);
		tablePrice.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent ev) {
				if (ev.getClickCount() == 2 && !ev.isConsumed()) {
					ev.consume();
					try {
						String url = tablePrice.getValueAt(tablePrice.getSelectedRow(), CardsPriceTableModel.COLUMUM_URL)
								.toString();
						Desktop.getDesktop().browse(new URI(url));
					} catch (Exception e) {
						logger.error(e);
					}

				}

			}
		});

		add(new JScrollPane(tablePrice), BorderLayout.CENTER);
	}

Replace Generic With Diamond SwingWorker<Void,MagicPrice> with SwingWorker<> in method public DeckPricePanel() from class org.magic.gui.components.DeckPricePanel


		private void loadCollection() {
			SwingWorker<List<MyNode>, Void> worker = new SwingWorker<>() {
				@Override
				protected List<MyNode> doInBackground() throws Exception {

					List<MyNode> children = new ArrayList<>();
					for (MagicCollection c : MTGControler.getInstance().getEnabled(MTGDao.class).listCollections()) {
						MyNode n = new MyNode(c);
						children.add(n);
					}
					return children;
				}

				@Override
				protected void done() {
					try {
						setChildren(get());
						model.nodeStructureChanged(MyNode.this);
					} catch (Exception e) {
						logger.error(e);
					}
					super.done();
				}
			};
			ThreadManager.getInstance().runInEdt(worker, "tree expand collection");

		}

		private void loadCollection() {
			SwingWorker<List<MyNode>, Void> worker = new SwingWorker<List<MyNode>, Void>() {
				@Override
				protected List<MyNode> doInBackground() throws Exception {

					List<MyNode> children = new ArrayList<>();
					for (MagicCollection c : MTGControler.getInstance().getEnabled(MTGDao.class).listCollections()) {
						MyNode n = new MyNode(c);
						children.add(n);
					}
					return children;
				}

				@Override
				protected void done() {
					try {
						setChildren(get());
						model.nodeStructureChanged(MyNode.this);
					} catch (Exception e) {
						logger.error(e);
					}
					super.done();
				}
			};
			ThreadManager.getInstance().runInEdt(worker, "tree expand collection");

		}

Replace Generic With Diamond SwingWorker<List<MyNode>,Void> with SwingWorker<> in method private loadCollection() : void from class org.magic.gui.components.LazyLoadingTree.MyNode


		private void loadCardsFromEdition(final MagicCollection col, final MagicEdition ed) {

			SwingWorker<List<MyNode>, Void> worker = new SwingWorker<>() {
				@Override
				protected List<MyNode> doInBackground() {
					logger.trace("loading cards from " + col + "/" + ed);

					List<MyNode> children = new ArrayList<>();
					try {
						List<MagicCard> res = MTGControler.getInstance().getEnabled(MTGDao.class).listCardsFromCollection(col,ed);
						Collections.sort(res, new CardsEditionSorter());

						for (MagicCard card : res) {
							MyNode n = new MyNode(card);
							children.add(n);
						}
					} catch (SQLException e) {
						logger.error("unknow edition " + ed.getId());
					}
					return children;
				}

				@Override
				protected void done() {
					try {
						logger.trace("loading cards from " + col + "/" + ed + " done");
						setChildren(get());
						model.nodeStructureChanged(MyNode.this);
					} catch (Exception e) {
						logger.error("error loading tree",e);
					}
					super.done();
				}
			};
			ThreadManager.getInstance().runInEdt(worker, "tree expand edition");

		}

		private void loadCardsFromEdition(final MagicCollection col, final MagicEdition ed) {

			SwingWorker<List<MyNode>, Void> worker = new SwingWorker<List<MyNode>, Void>() {
				@Override
				protected List<MyNode> doInBackground() {
					logger.trace("loading cards from " + col + "/" + ed);

					List<MyNode> children = new ArrayList<>();
					try {
						List<MagicCard> res = MTGControler.getInstance().getEnabled(MTGDao.class).listCardsFromCollection(col,ed);
						Collections.sort(res, new CardsEditionSorter());

						for (MagicCard card : res) {
							MyNode n = new MyNode(card);
							children.add(n);
						}
					} catch (SQLException e) {
						logger.error("unknow edition " + ed.getId());
					}
					return children;
				}

				@Override
				protected void done() {
					try {
						logger.trace("loading cards from " + col + "/" + ed + " done");
						setChildren(get());
						model.nodeStructureChanged(MyNode.this);
					} catch (Exception e) {
						logger.error("error loading tree",e);
					}
					super.done();
				}
			};
			ThreadManager.getInstance().runInEdt(worker, "tree expand edition");

		}

Replace Generic With Diamond SwingWorker<List<MyNode>,Void> with SwingWorker<> in method private loadCardsFromEdition(col MagicCollection, ed MagicEdition) : void from class org.magic.gui.components.LazyLoadingTree.MyNode


		private void loadEditionFromCollection(final MagicCollection c) {

			SwingWorker<List<MyNode>, Void> worker = new SwingWorker<>() {
				@Override
				protected List<MyNode> doInBackground() throws Exception {
					logger.debug("loading editions from " + c);
					List<MyNode> children = new ArrayList<>();
					for (String ed : MTGControler.getInstance().getEnabled(MTGDao.class).listEditionsIDFromCollection(c)) {
						MyNode n = new MyNode(MTGControler.getInstance().getEnabled(MTGCardsProvider.class).getSetById(ed));
						children.add(n);
					}
					Collections.sort(children);
					return children;
				}

				@Override
				protected void done() {
					try {
						logger.debug("loading editions from " + c + " done");
						setChildren(get());
						model.nodeStructureChanged(MyNode.this);
					} catch (Exception e) {
						logger.error(e);
					}
					super.done();
				}
			};
			ThreadManager.getInstance().runInEdt(worker, "tree init editions");

		}

		private void loadEditionFromCollection(final MagicCollection c) {

			SwingWorker<List<MyNode>, Void> worker = new SwingWorker<List<MyNode>, Void>() {
				@Override
				protected List<MyNode> doInBackground() throws Exception {
					logger.debug("loading editions from " + c);
					List<MyNode> children = new ArrayList<>();
					for (String ed : MTGControler.getInstance().getEnabled(MTGDao.class).listEditionsIDFromCollection(c)) {
						MyNode n = new MyNode(MTGControler.getInstance().getEnabled(MTGCardsProvider.class).getSetById(ed));
						children.add(n);
					}
					Collections.sort(children);
					return children;
				}

				@Override
				protected void done() {
					try {
						logger.debug("loading editions from " + c + " done");
						setChildren(get());
						model.nodeStructureChanged(MyNode.this);
					} catch (Exception e) {
						logger.error(e);
					}
					super.done();
				}
			};
			ThreadManager.getInstance().runInEdt(worker, "tree init editions");

		}

Replace Generic With Diamond SwingWorker<List<MyNode>,Void> with SwingWorker<> in method private loadEditionFromCollection(c MagicCollection) : void from class org.magic.gui.components.LazyLoadingTree.MyNode


	protected void open() {
		deck = new MagicDeck();

		deck.setDescription("Sealed from " + model.getSealedPack());
		deck.setName("sealed from " + model.getSealedPack().toList().size() + " boosters");

		panelOpenedBooster.clear();
		panelDeck.removeAll();
		panelDeck.revalidate();
		panelDeck.repaint();

		lblLoading.start();
		list = new ArrayList<>();
		SwingWorker<Void, Booster> sw = new SwingWorker<>()
		{

			@Override
			protected void process(List<Booster> chunks) {

				chunks.forEach(e->{
					column++;
					for(MagicCard mc : e.getCards()) {
						list.add(mc);
						DisplayableCard c = createCard(mc);
						panelOpenedBooster.addComponent(c, column);
					}

				});

			}

			@Override
			protected void done() {
				lblLoading.end();
				panelOpenedBooster.setList(list);
				refreshStats();
			}

			@Override
			protected Void doInBackground() throws Exception {
				column=0;
				for (Entry<MagicEdition, Integer> ed : model.getSealedPack().getEntries()) {
					try {
						for (int i = 0; i < ed.getValue(); i++) {
							Booster b = MTGControler.getInstance().getEnabled(MTGCardsProvider.class).generateBooster(ed.getKey());
							publish(b);
						}
					} catch (IOException e) {
						logger.error(e);
						lblLoading.end();
					}

				}
				return null;
			}

		};

		ThreadManager.getInstance().runInEdt(sw,"opening boosters");
	}

	protected void open() {
		deck = new MagicDeck();

		deck.setDescription("Sealed from " + model.getSealedPack());
		deck.setName("sealed from " + model.getSealedPack().toList().size() + " boosters");

		panelOpenedBooster.clear();
		panelDeck.removeAll();
		panelDeck.revalidate();
		panelDeck.repaint();

		lblLoading.start();
		list = new ArrayList<>();
		SwingWorker<Void, Booster> sw = new SwingWorker<Void,Booster>()
		{

			@Override
			protected void process(List<Booster> chunks) {

				chunks.forEach(e->{
					column++;
					for(MagicCard mc : e.getCards()) {
						list.add(mc);
						DisplayableCard c = createCard(mc);
						panelOpenedBooster.addComponent(c, column);
					}

				});

			}

			@Override
			protected void done() {
				lblLoading.end();
				panelOpenedBooster.setList(list);
				refreshStats();
			}

			@Override
			protected Void doInBackground() throws Exception {
				column=0;
				for (Entry<MagicEdition, Integer> ed : model.getSealedPack().getEntries()) {
					try {
						for (int i = 0; i < ed.getValue(); i++) {
							Booster b = MTGControler.getInstance().getEnabled(MTGCardsProvider.class).generateBooster(ed.getKey());
							publish(b);
						}
					} catch (IOException e) {
						logger.error(e);
						lblLoading.end();
					}

				}
				return null;
			}

		};

		ThreadManager.getInstance().runInEdt(sw,"opening boosters");
	}

Replace Generic With Diamond SwingWorker<Void,Booster> with SwingWorker<> in method protected open() : void from class org.magic.gui.components.SealedPanel


	public DeckSnifferDialog() {

		importedDeck = new MagicDeck();
		setSize(new Dimension(500, 300));
		setTitle(MTGControler.getInstance().getLangService().getCapitalize("DECKS_IMPORTER"));
		setIconImage(MTGConstants.ICON_DECK.getImage());
		setModal(true);
		getContentPane().setLayout(new BorderLayout(0, 0));

		table = new JXTable();
		model = new DeckSnifferTableModel();
		table.setModel(model);
		getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);

		JPanel panel = new JPanel();
		getContentPane().add(panel, BorderLayout.NORTH);

		selectedSniffer = MTGControler.getInstance().listEnabled(MTGDeckSniffer.class).get(0);
		panel.setLayout(new BorderLayout(0, 0));

		panel.add(lblLoad, BorderLayout.CENTER);

		panelChoose = new JPanel();
		panel.add(panelChoose, BorderLayout.WEST);
				cboSniffers =UITools.createCombobox(MTGDeckSniffer.class,false);
				panelChoose.add(cboSniffers);

				btnConnect = new JButton(MTGControler.getInstance().getLangService().getCapitalize("CONNECT"));
				panelChoose.add(btnConnect);

						cboFormats = new JComboBox<>();
						panelChoose.add(cboFormats);
						cboFormats.addActionListener(e -> {
							try {
								lblLoad.start();
								selectedSniffer.setProperty("FORMAT", cboFormats.getSelectedItem());
								model.init(selectedSniffer.getDeckList());
								model.fireTableDataChanged();
								lblLoad.end();
							} catch (Exception e1) {
								lblLoad.end();
								logger.error("error change cboFormat", e1);
							}
						});

				btnConnect.addActionListener(e -> ThreadManager.getInstance().executeThread(() -> {
					try {
						lblLoad.start();
						selectedSniffer.connect();
						cboFormats.removeAllItems();

						for (String s : selectedSniffer.listFilter())
							cboFormats.addItem(s);

						lblLoad.end();

					} catch (Exception e1) {
						lblLoad.end();
						MTGControler.getInstance().notify(e1);
					}
				}, "Connection to " + selectedSniffer));

						cboSniffers.addActionListener(e -> selectedSniffer = (MTGDeckSniffer) cboSniffers.getSelectedItem());

		JPanel panelButton = new JPanel();
		getContentPane().add(panelButton, BorderLayout.SOUTH);

		JButton btnClose = new JButton(MTGConstants.ICON_CANCEL);
		btnClose.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("CANCEL"));

		btnClose.addActionListener(e -> dispose());
		panelButton.add(btnClose);

		setLocationRelativeTo(null);

		table.getColumnModel().getColumn(1).setCellRenderer(new ManaCellRenderer());

		btnImport = new JButton(MTGConstants.ICON_CHECK);
		btnImport.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("IMPORT"));

		panelButton.add(btnImport);

		btnImport.addActionListener(e ->{

			AbstractObservableWorker<MagicDeck, MagicCard, MTGDeckSniffer> sw = new AbstractObservableWorker<>(lblLoad,selectedSniffer) {

				@Override
				protected void process(List<MagicCard> chunks) {
					buzy.progressSmooth(chunks.size());
					buzy.setText(chunks.toString());
				}

				@Override
				protected MagicDeck doInBackground() throws Exception {
					return plug.getDeck((RetrievableDeck)UITools.getTableSelection(table, 0));
				}

				@Override
				protected void done() {
					super.done();

					importedDeck = getResult();
					btnImport.setEnabled(true);
					dispose();
				}

				@Override
				protected void error(Exception e) {
					MTGControler.getInstance().notify(e);
				}

			};

		ThreadManager.getInstance().runInEdt(sw, "Import deck");

		});

	}

	public DeckSnifferDialog() {

		importedDeck = new MagicDeck();
		setSize(new Dimension(500, 300));
		setTitle(MTGControler.getInstance().getLangService().getCapitalize("DECKS_IMPORTER"));
		setIconImage(MTGConstants.ICON_DECK.getImage());
		setModal(true);
		getContentPane().setLayout(new BorderLayout(0, 0));

		table = new JXTable();
		model = new DeckSnifferTableModel();
		table.setModel(model);
		getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);

		JPanel panel = new JPanel();
		getContentPane().add(panel, BorderLayout.NORTH);

		selectedSniffer = MTGControler.getInstance().listEnabled(MTGDeckSniffer.class).get(0);
		panel.setLayout(new BorderLayout(0, 0));

		panel.add(lblLoad, BorderLayout.CENTER);

		panelChoose = new JPanel();
		panel.add(panelChoose, BorderLayout.WEST);
				cboSniffers =UITools.createCombobox(MTGDeckSniffer.class,false);
				panelChoose.add(cboSniffers);

				btnConnect = new JButton(MTGControler.getInstance().getLangService().getCapitalize("CONNECT"));
				panelChoose.add(btnConnect);

						cboFormats = new JComboBox<>();
						panelChoose.add(cboFormats);
						cboFormats.addActionListener(e -> {
							try {
								lblLoad.start();
								selectedSniffer.setProperty("FORMAT", cboFormats.getSelectedItem());
								model.init(selectedSniffer.getDeckList());
								model.fireTableDataChanged();
								lblLoad.end();
							} catch (Exception e1) {
								lblLoad.end();
								logger.error("error change cboFormat", e1);
							}
						});

				btnConnect.addActionListener(e -> ThreadManager.getInstance().executeThread(() -> {
					try {
						lblLoad.start();
						selectedSniffer.connect();
						cboFormats.removeAllItems();

						for (String s : selectedSniffer.listFilter())
							cboFormats.addItem(s);

						lblLoad.end();

					} catch (Exception e1) {
						lblLoad.end();
						MTGControler.getInstance().notify(e1);
					}
				}, "Connection to " + selectedSniffer));

						cboSniffers.addActionListener(e -> selectedSniffer = (MTGDeckSniffer) cboSniffers.getSelectedItem());

		JPanel panelButton = new JPanel();
		getContentPane().add(panelButton, BorderLayout.SOUTH);

		JButton btnClose = new JButton(MTGConstants.ICON_CANCEL);
		btnClose.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("CANCEL"));

		btnClose.addActionListener(e -> dispose());
		panelButton.add(btnClose);

		setLocationRelativeTo(null);

		table.getColumnModel().getColumn(1).setCellRenderer(new ManaCellRenderer());

		btnImport = new JButton(MTGConstants.ICON_CHECK);
		btnImport.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("IMPORT"));

		panelButton.add(btnImport);

		btnImport.addActionListener(e ->{

			AbstractObservableWorker<MagicDeck, MagicCard, MTGDeckSniffer> sw = new AbstractObservableWorker<MagicDeck, MagicCard, MTGDeckSniffer>(lblLoad,selectedSniffer) {

				@Override
				protected void process(List<MagicCard> chunks) {
					buzy.progressSmooth(chunks.size());
					buzy.setText(chunks.toString());
				}

				@Override
				protected MagicDeck doInBackground() throws Exception {
					return plug.getDeck((RetrievableDeck)UITools.getTableSelection(table, 0));
				}

				@Override
				protected void done() {
					super.done();

					importedDeck = getResult();
					btnImport.setEnabled(true);
					dispose();
				}

				@Override
				protected void error(Exception e) {
					MTGControler.getInstance().notify(e);
				}

			};

		ThreadManager.getInstance().runInEdt(sw, "Import deck");

		});

	}

Replace Generic With Diamond AbstractObservableWorker<MagicDeck,MagicCard,MTGDeckSniffer> with AbstractObservableWorker<> in method public DeckSnifferDialog() from class org.magic.gui.components.dialog.DeckSnifferDialog


	public JDeckChooserDialog() {
		setTitle(MTGControler.getInstance().getLangService().getCapitalize("OPEN_DECK"));
		setIconImage(MTGConstants.ICON_DECK.getImage());
		setSize(950, 600);

		model = new DefaultTreeModel(root);
		manager = new MTGDeckManager();
		DeckSelectionTableModel decksModel = new DeckSelectionTableModel();
		manager.addObserver((o,d)->decksModel.addItem((MagicDeck)d));

		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosed(WindowEvent e) {
				selectedDeck = null;
			}

			@Override
			public void windowClosing(WindowEvent e) {
				selectedDeck = null;
			}
		});

		SwingWorker<List<MagicDeck>, Void> sw = new SwingWorker<>()
				{

					@Override
					protected List<MagicDeck> doInBackground() throws Exception {
						return manager.listDecks();
					}
					@Override
					protected void done() {
						table.packAll();
					}
				};

		ThreadManager.getInstance().runInEdt(sw,"loading decks");

		table = new JXTable(decksModel);
		UITools.initTableFilter(table);

		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent event) {

				if(UITools.getTableSelections(table, 0).isEmpty())
					return;

				selectedDeck = UITools.getTableSelection(table, 0);
				initTree();
				tagsPanel.clean();
				tagsPanel.addTags(selectedDeck.getTags());
				cmcChartPanel.init(selectedDeck.getAsList());
				cmcChartPanel.revalidate();
				cmcChartPanel.repaint();

				if (event.getClickCount() == 2) {
					dispose();
				}

			}

		});

		getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);

		JPanel panelBas = new JPanel();
		getContentPane().add(panelBas, BorderLayout.SOUTH);

		JButton btnSelect = new JButton(MTGConstants.ICON_OPEN);
		btnSelect.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("OPEN"));
		btnSelect.addActionListener(e -> {
			if (selectedDeck == null)
				MTGControler.getInstance().notify(new NullPointerException(MTGControler.getInstance().getLangService().getCapitalize("CHOOSE_DECK")));
			else
				dispose();
		});
		panelBas.add(btnSelect);

		JButton btnCancel = new JButton(MTGConstants.ICON_CANCEL);
		btnCancel.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("CANCEL"));
		btnCancel.addActionListener(e -> {
			selectedDeck = null;
			dispose();
		});

		panelBas.add(btnCancel);

		JButton btnDelete = new JButton(MTGConstants.ICON_DELETE);
		btnDelete.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("DELETE"));
		btnDelete.addActionListener(e -> {

			if(selectedDeck==null)
				return;

			int res = JOptionPane.showConfirmDialog(null,
					MTGControler.getInstance().getLangService().getCapitalize("CONFIRM_DELETE", selectedDeck.getName()),
					MTGControler.getInstance().getLangService().getCapitalize("CONFIRMATION") + " ?",
					JOptionPane.YES_NO_OPTION);

			if (res == JOptionPane.YES_OPTION) {
				try {
					manager.remove(selectedDeck);
					((DeckSelectionTableModel) table.getModel()).removeItem(selectedDeck);
				} catch (IOException e1) {
					MTGControler.getInstance().notify(e1);
				}
			}
		});

		panelBas.add(btnDelete);

		JSplitPane panelRight = new JSplitPane();
		panelRight.setOrientation(JSplitPane.VERTICAL_SPLIT);
		getContentPane().add(panelRight, BorderLayout.EAST);

		cmcChartPanel = new CmcChartPanel();
		cmcChartPanel.setPreferredSize(new Dimension(250, 150));
		panelRight.setBottomComponent(cmcChartPanel);
		root = new DefaultMutableTreeNode("Cards");
		// add the child nodes to the root node
		root.add(creatureNode);
		root.add(artifactsNode);
		root.add(planeswalkerNode);
		root.add(landsNode);
		root.add(spellsNode);
		root.add(sideNode);
		model = new DefaultTreeModel(root);

		panelRight.setDividerLocation(300);

		JPanel panelTree = new JPanel();
		panelTree.setLayout(new BorderLayout(0, 0));
		panelRight.setTopComponent(panelTree);
		tree = new JTree();
		tree.setModel(model);

		panelTree.add(new JScrollPane(tree));
		tagsPanel = new JTagsPanel();
		tagsPanel.setFontSize(11);
		tagsPanel.setColors(Color.DARK_GRAY, Color.WHITE);
		tagsPanel.setEditable(false);
		panelTree.add(tagsPanel, BorderLayout.SOUTH);

		table.getColumnModel().getColumn(1).setCellRenderer(new ManaCellRenderer());
		table.packAll();
		setLocationRelativeTo(null);
		setModal(true);
	}

	public JDeckChooserDialog() {
		setTitle(MTGControler.getInstance().getLangService().getCapitalize("OPEN_DECK"));
		setIconImage(MTGConstants.ICON_DECK.getImage());
		setSize(950, 600);

		model = new DefaultTreeModel(root);
		manager = new MTGDeckManager();
		DeckSelectionTableModel decksModel = new DeckSelectionTableModel();
		manager.addObserver((o,d)->decksModel.addItem((MagicDeck)d));

		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosed(WindowEvent e) {
				selectedDeck = null;
			}

			@Override
			public void windowClosing(WindowEvent e) {
				selectedDeck = null;
			}
		});

		SwingWorker<List<MagicDeck>, Void> sw = new SwingWorker<List<MagicDeck>, Void>()
				{

					@Override
					protected List<MagicDeck> doInBackground() throws Exception {
						return manager.listDecks();
					}
					@Override
					protected void done() {
						table.packAll();
					}
				};

		ThreadManager.getInstance().runInEdt(sw,"loading decks");

		table = new JXTable(decksModel);
		UITools.initTableFilter(table);

		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent event) {

				if(UITools.getTableSelections(table, 0).isEmpty())
					return;

				selectedDeck = UITools.getTableSelection(table, 0);
				initTree();
				tagsPanel.clean();
				tagsPanel.addTags(selectedDeck.getTags());
				cmcChartPanel.init(selectedDeck.getAsList());
				cmcChartPanel.revalidate();
				cmcChartPanel.repaint();

				if (event.getClickCount() == 2) {
					dispose();
				}

			}

		});

		getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);

		JPanel panelBas = new JPanel();
		getContentPane().add(panelBas, BorderLayout.SOUTH);

		JButton btnSelect = new JButton(MTGConstants.ICON_OPEN);
		btnSelect.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("OPEN"));
		btnSelect.addActionListener(e -> {
			if (selectedDeck == null)
				MTGControler.getInstance().notify(new NullPointerException(MTGControler.getInstance().getLangService().getCapitalize("CHOOSE_DECK")));
			else
				dispose();
		});
		panelBas.add(btnSelect);

		JButton btnCancel = new JButton(MTGConstants.ICON_CANCEL);
		btnCancel.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("CANCEL"));
		btnCancel.addActionListener(e -> {
			selectedDeck = null;
			dispose();
		});

		panelBas.add(btnCancel);

		JButton btnDelete = new JButton(MTGConstants.ICON_DELETE);
		btnDelete.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("DELETE"));
		btnDelete.addActionListener(e -> {

			if(selectedDeck==null)
				return;

			int res = JOptionPane.showConfirmDialog(null,
					MTGControler.getInstance().getLangService().getCapitalize("CONFIRM_DELETE", selectedDeck.getName()),
					MTGControler.getInstance().getLangService().getCapitalize("CONFIRMATION") + " ?",
					JOptionPane.YES_NO_OPTION);

			if (res == JOptionPane.YES_OPTION) {
				try {
					manager.remove(selectedDeck);
					((DeckSelectionTableModel) table.getModel()).removeItem(selectedDeck);
				} catch (IOException e1) {
					MTGControler.getInstance().notify(e1);
				}
			}
		});

		panelBas.add(btnDelete);

		JSplitPane panelRight = new JSplitPane();
		panelRight.setOrientation(JSplitPane.VERTICAL_SPLIT);
		getContentPane().add(panelRight, BorderLayout.EAST);

		cmcChartPanel = new CmcChartPanel();
		cmcChartPanel.setPreferredSize(new Dimension(250, 150));
		panelRight.setBottomComponent(cmcChartPanel);
		root = new DefaultMutableTreeNode("Cards");
		// add the child nodes to the root node
		root.add(creatureNode);
		root.add(artifactsNode);
		root.add(planeswalkerNode);
		root.add(landsNode);
		root.add(spellsNode);
		root.add(sideNode);
		model = new DefaultTreeModel(root);

		panelRight.setDividerLocation(300);

		JPanel panelTree = new JPanel();
		panelTree.setLayout(new BorderLayout(0, 0));
		panelRight.setTopComponent(panelTree);
		tree = new JTree();
		tree.setModel(model);

		panelTree.add(new JScrollPane(tree));
		tagsPanel = new JTagsPanel();
		tagsPanel.setFontSize(11);
		tagsPanel.setColors(Color.DARK_GRAY, Color.WHITE);
		tagsPanel.setEditable(false);
		panelTree.add(tagsPanel, BorderLayout.SOUTH);

		table.getColumnModel().getColumn(1).setCellRenderer(new ManaCellRenderer());
		table.packAll();
		setLocationRelativeTo(null);
		setModal(true);
	}

Replace Generic With Diamond SwingWorker<List<MagicDeck>,Void> with SwingWorker<> in method public JDeckChooserDialog() from class org.magic.gui.components.dialog.JDeckChooserDialog


	public MassMoverDialog(MagicCollection col, MagicEdition ed) {
		setSize(new Dimension(640, 370));
		setTitle(MTGControler.getInstance().getLangService().getCapitalize("MASS_MOVEMENTS") + " : " + col);
		setIconImage(MTGConstants.ICON_TAB_IMPORT_EXPORT.getImage());
		setModal(true);
		getContentPane().setLayout(new BorderLayout(0, 0));
		setLocationRelativeTo(null);

		cboCollections = UITools.createComboboxCollection();
		dao = MTGControler.getInstance().getEnabled(MTGDao.class);

		this.toSaveCol = col;
		this.toSaveEd = ed;

		JPanel panel = new JPanel();
		getContentPane().add(panel, BorderLayout.SOUTH);

		btnMove = new JButton(MTGControler.getInstance().getLangService().getCapitalize("MOVE_TO"));

		panel.add(btnMove);
		panel.add(cboCollections);
		panel.add(lblWaiting);

		model = new MagicCardTableModel();
		try {
			if (ed == null)
				model.init(dao.listCardsFromCollection(col));
			else
				model.init(dao.listCardsFromCollection(col, ed));
		} catch (SQLException e) {
			logger.error(e);
		}

		tableCards = new JXTable(model);
		tableCards.getColumnModel().getColumn(2).setCellRenderer(new ManaCellRenderer());
		tableCards.getColumnModel().getColumn(6).setCellRenderer(new MagicEditionsComboBoxCellRenderer(false));
		getContentPane().add(new JScrollPane(tableCards), BorderLayout.CENTER);

		UITools.initTableFilter(tableCards);

		btnMove.addActionListener(e -> {
			btnMove.setEnabled(false);

			SwingWorker<Void, MagicCard> sw = new SwingWorker<>() {

				@Override
				protected void done() {
					model.fireTableDataChanged();
					try {
						get();
						if (toSaveEd == null)
							model.init(dao.listCardsFromCollection(toSaveCol));
						else
							model.init(dao.listCardsFromCollection(toSaveCol, toSaveEd));
					} catch (SQLException | ExecutionException ex) {
						logger.error(ex);
						MTGControler.getInstance().notify(ex);
						lblWaiting.end();
						btnMove.setEnabled(true);
					} catch (InterruptedException e) {
						Thread.currentThread().interrupt();
						logger.error(e);
						lblWaiting.end();
						btnMove.setEnabled(true);
					}
					lblWaiting.end();
					btnMove.setEnabled(true);
				}

				@Override
				protected void process(List<MagicCard> chunks) {
					lblWaiting.setText("moving " + chunks);
					lblWaiting.progressSmooth(chunks.size());
				}

				@Override
				protected Void doInBackground(){
					for (int i = 0; i < tableCards.getSelectedRowCount(); i++) {
						int viewRow = tableCards.getSelectedRows()[i];
						int modelRow = tableCards.convertRowIndexToModel(viewRow);
						MagicCard mc = (MagicCard) tableCards.getModel().getValueAt(modelRow, 0);
						try {
							dao.moveCard(mc, toSaveCol, (MagicCollection) cboCollections.getSelectedItem());
							publish(mc);
							logger.info("moving " + mc + " to " + cboCollections.getSelectedItem());
							change = true;
						} catch (SQLException e1) {
							logger.error(e1);
						}
					}

					return null;

				}
			};

			if (tableCards.getSelectedRowCount() > 0) {
				lblWaiting.start(tableCards.getSelectedRowCount());
				ThreadManager.getInstance().runInEdt(sw, "mass movement");

			}
		});

	}

	public MassMoverDialog(MagicCollection col, MagicEdition ed) {
		setSize(new Dimension(640, 370));
		setTitle(MTGControler.getInstance().getLangService().getCapitalize("MASS_MOVEMENTS") + " : " + col);
		setIconImage(MTGConstants.ICON_TAB_IMPORT_EXPORT.getImage());
		setModal(true);
		getContentPane().setLayout(new BorderLayout(0, 0));
		setLocationRelativeTo(null);

		cboCollections = UITools.createComboboxCollection();
		dao = MTGControler.getInstance().getEnabled(MTGDao.class);

		this.toSaveCol = col;
		this.toSaveEd = ed;

		JPanel panel = new JPanel();
		getContentPane().add(panel, BorderLayout.SOUTH);

		btnMove = new JButton(MTGControler.getInstance().getLangService().getCapitalize("MOVE_TO"));

		panel.add(btnMove);
		panel.add(cboCollections);
		panel.add(lblWaiting);

		model = new MagicCardTableModel();
		try {
			if (ed == null)
				model.init(dao.listCardsFromCollection(col));
			else
				model.init(dao.listCardsFromCollection(col, ed));
		} catch (SQLException e) {
			logger.error(e);
		}

		tableCards = new JXTable(model);
		tableCards.getColumnModel().getColumn(2).setCellRenderer(new ManaCellRenderer());
		tableCards.getColumnModel().getColumn(6).setCellRenderer(new MagicEditionsComboBoxCellRenderer(false));
		getContentPane().add(new JScrollPane(tableCards), BorderLayout.CENTER);

		UITools.initTableFilter(tableCards);

		btnMove.addActionListener(e -> {
			btnMove.setEnabled(false);

			SwingWorker<Void, MagicCard> sw = new SwingWorker<Void, MagicCard>() {

				@Override
				protected void done() {
					model.fireTableDataChanged();
					try {
						get();
						if (toSaveEd == null)
							model.init(dao.listCardsFromCollection(toSaveCol));
						else
							model.init(dao.listCardsFromCollection(toSaveCol, toSaveEd));
					} catch (SQLException | ExecutionException ex) {
						logger.error(ex);
						MTGControler.getInstance().notify(ex);
						lblWaiting.end();
						btnMove.setEnabled(true);
					} catch (InterruptedException e) {
						Thread.currentThread().interrupt();
						logger.error(e);
						lblWaiting.end();
						btnMove.setEnabled(true);
					}
					lblWaiting.end();
					btnMove.setEnabled(true);
				}

				@Override
				protected void process(List<MagicCard> chunks) {
					lblWaiting.setText("moving " + chunks);
					lblWaiting.progressSmooth(chunks.size());
				}

				@Override
				protected Void doInBackground(){
					for (int i = 0; i < tableCards.getSelectedRowCount(); i++) {
						int viewRow = tableCards.getSelectedRows()[i];
						int modelRow = tableCards.convertRowIndexToModel(viewRow);
						MagicCard mc = (MagicCard) tableCards.getModel().getValueAt(modelRow, 0);
						try {
							dao.moveCard(mc, toSaveCol, (MagicCollection) cboCollections.getSelectedItem());
							publish(mc);
							logger.info("moving " + mc + " to " + cboCollections.getSelectedItem());
							change = true;
						} catch (SQLException e1) {
							logger.error(e1);
						}
					}

					return null;

				}
			};

			if (tableCards.getSelectedRowCount() > 0) {
				lblWaiting.start(tableCards.getSelectedRowCount());
				ThreadManager.getInstance().runInEdt(sw, "mass movement");

			}
		});

	}

Replace Generic With Diamond SwingWorker<Void,MagicCard> with SwingWorker<> in method public MassMoverDialog(col MagicCollection, ed MagicEdition) from class org.magic.gui.components.dialog.MassMoverDialog


	public OrderImporterDialog() {

		setSize(new Dimension(500, 300));
		setTitle(MTGControler.getInstance().getLangService().getCapitalize("FINANCIAL_MODULE"));
		setIconImage(MTGConstants.ICON_SHOP.getImage());
		setModal(true);
		getContentPane().setLayout(new BorderLayout(0, 0));

		table = new JXTable();
		model = new ShoppingEntryTableModel();
		panelChoose = new JPanel();
		JPanel panel = new JPanel();
		JPanel panelButton = new JPanel();
		JButton btnClose = new JButton(MTGConstants.ICON_CANCEL);
		JButton btnLoad = new JButton(MTGConstants.ICON_OPEN);
		btnImport = new JButton(MTGConstants.ICON_CHECK);
		cboSniffers =UITools.createCombobox(MTGShopper.class,false);

		table.setModel(model);
		panel.setLayout(new BorderLayout(0, 0));

		getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
		getContentPane().add(panel, BorderLayout.NORTH);

		panel.add(panelChoose, BorderLayout.WEST);
		panelChoose.add(cboSniffers);
		panelChoose.add(btnLoad);
		panelChoose.add(lblLoad);
		getContentPane().add(panelButton, BorderLayout.SOUTH);
		panelButton.add(btnClose);
		panelButton.add(btnImport);

		selectedSniffer = MTGControler.getInstance().listEnabled(MTGShopper.class).get(0);

		cboSniffers.addActionListener(e -> selectedSniffer = (MTGShopper) cboSniffers.getSelectedItem());

		btnLoad.addActionListener(ae->{
			AbstractObservableWorker<List<OrderEntry>, OrderEntry, MTGShopper> sw = new AbstractObservableWorker<>(lblLoad,selectedSniffer) {
				@Override
				protected List<OrderEntry> doInBackground() throws Exception {
					return plug.listOrders();
				}
				@Override
				protected void done() {
					super.done();
					model.init(getResult());
				}
			};
			ThreadManager.getInstance().runInEdt(sw, "loading orders");
		});

		btnClose.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("CANCEL"));

		btnClose.addActionListener(e -> dispose());

		btnImport.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("IMPORT"));

		btnImport.addActionListener(e ->
			ThreadManager.getInstance().invokeLater(() -> {
					try {
						btnImport.setEnabled(false);
						selectedEntries = UITools.getTableSelections(table, 0);
						btnImport.setEnabled(true);
						dispose();
					} catch (Exception e1) {
						logger.error("Error snif",e1);
						MTGControler.getInstance().notify(e1);
						btnImport.setEnabled(true);
					}
					finally
					{
						selectedSniffer.removeObserver(lblLoad);
					}
				})
		);

		setLocationRelativeTo(null);
	}

	public OrderImporterDialog() {

		setSize(new Dimension(500, 300));
		setTitle(MTGControler.getInstance().getLangService().getCapitalize("FINANCIAL_MODULE"));
		setIconImage(MTGConstants.ICON_SHOP.getImage());
		setModal(true);
		getContentPane().setLayout(new BorderLayout(0, 0));

		table = new JXTable();
		model = new ShoppingEntryTableModel();
		panelChoose = new JPanel();
		JPanel panel = new JPanel();
		JPanel panelButton = new JPanel();
		JButton btnClose = new JButton(MTGConstants.ICON_CANCEL);
		JButton btnLoad = new JButton(MTGConstants.ICON_OPEN);
		btnImport = new JButton(MTGConstants.ICON_CHECK);
		cboSniffers =UITools.createCombobox(MTGShopper.class,false);

		table.setModel(model);
		panel.setLayout(new BorderLayout(0, 0));

		getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
		getContentPane().add(panel, BorderLayout.NORTH);

		panel.add(panelChoose, BorderLayout.WEST);
		panelChoose.add(cboSniffers);
		panelChoose.add(btnLoad);
		panelChoose.add(lblLoad);
		getContentPane().add(panelButton, BorderLayout.SOUTH);
		panelButton.add(btnClose);
		panelButton.add(btnImport);

		selectedSniffer = MTGControler.getInstance().listEnabled(MTGShopper.class).get(0);

		cboSniffers.addActionListener(e -> selectedSniffer = (MTGShopper) cboSniffers.getSelectedItem());

		btnLoad.addActionListener(ae->{
			AbstractObservableWorker<List<OrderEntry>, OrderEntry, MTGShopper> sw = new AbstractObservableWorker<List<OrderEntry>, OrderEntry, MTGShopper>(lblLoad,selectedSniffer) {
				@Override
				protected List<OrderEntry> doInBackground() throws Exception {
					return plug.listOrders();
				}
				@Override
				protected void done() {
					super.done();
					model.init(getResult());
				}
			};
			ThreadManager.getInstance().runInEdt(sw, "loading orders");
		});

		btnClose.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("CANCEL"));

		btnClose.addActionListener(e -> dispose());

		btnImport.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("IMPORT"));

		btnImport.addActionListener(e ->
			ThreadManager.getInstance().invokeLater(() -> {
					try {
						btnImport.setEnabled(false);
						selectedEntries = UITools.getTableSelections(table, 0);
						btnImport.setEnabled(true);
						dispose();
					} catch (Exception e1) {
						logger.error("Error snif",e1);
						MTGControler.getInstance().notify(e1);
						btnImport.setEnabled(true);
					}
					finally
					{
						selectedSniffer.removeObserver(lblLoad);
					}
				})
		);

		setLocationRelativeTo(null);
	}

Replace Generic With Diamond AbstractObservableWorker<List<OrderEntry>,OrderEntry,MTGShopper> with AbstractObservableWorker<> in method public OrderImporterDialog() from class org.magic.gui.components.dialog.OrderImporterDialog


			@Override
			protected void done() {

				List<CardShake> ret;
				try {
					ret = get();

					Collections.sort(ret, new PricesCardsShakeSorter((SORT)cboSorter.getSelectedItem(),false));
					modStandard.init(ret);
					table.setRowSorter(new TableRowSorter<>(modStandard));
					table.packAll();
					table.getColumnModel().getColumn(3).setCellRenderer(new CardShakeRenderer());
				} catch (Exception e) {
					logger.error(e);
				}

			}

			@Override
			protected void done() {

				List<CardShake> ret;
				try {
					ret = get();

					Collections.sort(ret, new PricesCardsShakeSorter((SORT)cboSorter.getSelectedItem(),false));
					modStandard.init(ret);
					table.setRowSorter(new TableRowSorter<CardShakerTableModel>(modStandard));
					table.packAll();
					table.getColumnModel().getColumn(3).setCellRenderer(new CardShakeRenderer());
				} catch (Exception e) {
					logger.error(e);
				}

			}

Replace Generic With Diamond TableRowSorter<CardShakerTableModel> with TableRowSorter<> in method protected done() : void from class org.magic.gui.dashlet.BestTrendingDashlet.init.sw.new SwingWorker<>


	@Override
	public void init() {

		SwingWorker<List<CardShake>, Void> sw = new SwingWorker<>()
		{

			@Override
			protected List<CardShake> doInBackground() {
				List<CardShake> ret = new ArrayList<>();
				try {
					List<CardShake> shakes = new ArrayList<>();

					if (boxM.isSelected())
						shakes.addAll(MTGControler.getInstance().getEnabled(MTGDashBoard.class).getShakerFor(MagicFormat.FORMATS.MODERN));
					if (boxS.isSelected())
						shakes.addAll(MTGControler.getInstance().getEnabled(MTGDashBoard.class).getShakerFor(MagicFormat.FORMATS.STANDARD));
					if (boxL.isSelected())
						shakes.addAll(MTGControler.getInstance().getEnabled(MTGDashBoard.class).getShakerFor(MagicFormat.FORMATS.LEGACY));
					if (boxV.isSelected())
						shakes.addAll(MTGControler.getInstance().getEnabled(MTGDashBoard.class).getShakerFor(MagicFormat.FORMATS.VINTAGE));
					if (boxP.isSelected())
						shakes.addAll(MTGControler.getInstance().getEnabled(MTGDashBoard.class).getShakerFor(MagicFormat.FORMATS.PAUPER));

					if(!boxM.isSelected() && !boxS.isSelected() && !boxL.isSelected() && !boxV.isSelected() && !boxP.isSelected())
						shakes.addAll(MTGControler.getInstance().getEnabled(MTGDashBoard.class).getShakerFor(null));

					int val = (Integer) spinner.getValue();
					setProperty("LIMIT", String.valueOf(val));
					setProperty("STD", String.valueOf(boxS.isSelected()));
					setProperty("MDN", String.valueOf(boxM.isSelected()));
					setProperty("LEG", String.valueOf(boxL.isSelected()));
					setProperty("VIN", String.valueOf(boxV.isSelected()));
					setProperty("PAU", String.valueOf(boxP.isSelected()));
					setProperty("SORT",String.valueOf(cboSorter.getSelectedItem()));

					ret.addAll(shakes.subList(0, val));
					ret.addAll(shakes.subList(shakes.size() - (val + 1), shakes.size())); // x last

				} catch (Exception e) {
					logger.error(e);
				}
				return ret;

			}

			@Override
			protected void done() {

				List<CardShake> ret;
				try {
					ret = get();

					Collections.sort(ret, new PricesCardsShakeSorter((SORT)cboSorter.getSelectedItem(),false));
					modStandard.init(ret);
					table.setRowSorter(new TableRowSorter<>(modStandard));
					table.packAll();
					table.getColumnModel().getColumn(3).setCellRenderer(new CardShakeRenderer());
				} catch (Exception e) {
					logger.error(e);
				}

			}

		};
		ThreadManager.getInstance().runInEdt(sw,"update best trending");
	}

	@Override
	public void init() {

		SwingWorker<List<CardShake>, Void> sw = new SwingWorker<>()
		{

			@Override
			protected List<CardShake> doInBackground() {
				List<CardShake> ret = new ArrayList<>();
				try {
					List<CardShake> shakes = new ArrayList<>();

					if (boxM.isSelected())
						shakes.addAll(MTGControler.getInstance().getEnabled(MTGDashBoard.class).getShakerFor(MagicFormat.FORMATS.MODERN));
					if (boxS.isSelected())
						shakes.addAll(MTGControler.getInstance().getEnabled(MTGDashBoard.class).getShakerFor(MagicFormat.FORMATS.STANDARD));
					if (boxL.isSelected())
						shakes.addAll(MTGControler.getInstance().getEnabled(MTGDashBoard.class).getShakerFor(MagicFormat.FORMATS.LEGACY));
					if (boxV.isSelected())
						shakes.addAll(MTGControler.getInstance().getEnabled(MTGDashBoard.class).getShakerFor(MagicFormat.FORMATS.VINTAGE));
					if (boxP.isSelected())
						shakes.addAll(MTGControler.getInstance().getEnabled(MTGDashBoard.class).getShakerFor(MagicFormat.FORMATS.PAUPER));

					if(!boxM.isSelected() && !boxS.isSelected() && !boxL.isSelected() && !boxV.isSelected() && !boxP.isSelected())
						shakes.addAll(MTGControler.getInstance().getEnabled(MTGDashBoard.class).getShakerFor(null));

					int val = (Integer) spinner.getValue();
					setProperty("LIMIT", String.valueOf(val));
					setProperty("STD", String.valueOf(boxS.isSelected()));
					setProperty("MDN", String.valueOf(boxM.isSelected()));
					setProperty("LEG", String.valueOf(boxL.isSelected()));
					setProperty("VIN", String.valueOf(boxV.isSelected()));
					setProperty("PAU", String.valueOf(boxP.isSelected()));
					setProperty("SORT",String.valueOf(cboSorter.getSelectedItem()));

					ret.addAll(shakes.subList(0, val));
					ret.addAll(shakes.subList(shakes.size() - (val + 1), shakes.size())); // x last

				} catch (Exception e) {
					logger.error(e);
				}
				return ret;

			}

			@Override
			protected void done() {

				List<CardShake> ret;
				try {
					ret = get();

					Collections.sort(ret, new PricesCardsShakeSorter((SORT)cboSorter.getSelectedItem(),false));
					modStandard.init(ret);
					table.setRowSorter(new TableRowSorter<CardShakerTableModel>(modStandard));
					table.packAll();
					table.getColumnModel().getColumn(3).setCellRenderer(new CardShakeRenderer());
				} catch (Exception e) {
					logger.error(e);
				}

			}

		};
		ThreadManager.getInstance().runInEdt(sw,"update best trending");
	}

Replace Generic With Diamond TableRowSorter<CardShakerTableModel> with TableRowSorter<> in method public init() : void from class org.magic.gui.dashlet.BestTrendingDashlet


	@Override
	public void initGUI() {
		getContentPane().setLayout(new BorderLayout(0, 0));
		modelCache = new MapTableModel<>();
		modelCache.setColumnNames("EDITION", "DATE");
		JXTable tableCache = new JXTable();
		tableCache.setModel(modelCache);

		JPanel panelHaut = new JPanel();
		getContentPane().add(panelHaut, BorderLayout.NORTH);
		buzy = AbstractBuzyIndicatorComponent.createProgressComponent();

		lblPrice = new JLabel();
		lblPrice.setFont(MTGControler.getInstance().getFont().deriveFont(Font.BOLD, 13));
		panelHaut.add(lblPrice);
		panelHaut.add(buzy);

		JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
		getContentPane().add(tabbedPane, BorderLayout.CENTER);

		JPanel panneauColl = new JPanel();
		tabbedPane.addTab("Collection", null, panneauColl, null);

		treeTable = new JXTreeTable();
		CardShakeTreeCellRenderer ren = new CardShakeTreeCellRenderer();
		treeTable.setDefaultRenderer(Object.class, ren);
		treeTable.setTreeCellRenderer(ren);

		panneauColl.setLayout(new BorderLayout(0, 0));
		panneauColl.add(new JScrollPane(treeTable));

		JPanel panneauh = new JPanel();
		panneauColl.add(panneauh, BorderLayout.NORTH);

		JButton btnRefresh = new JButton(MTGConstants.ICON_REFRESH);

		panneauh.add(btnRefresh);

		JPanel panelCacheDetail = new JPanel();
		tabbedPane.addTab("Cache", null, panelCacheDetail, null);
		panelCacheDetail.setLayout(new BorderLayout(0, 0));

		panelCacheDetail.add(new JScrollPane(tableCache));

		JPanel panel = new JPanel();
		panelCacheDetail.add(panel, BorderLayout.NORTH);

		JButton btnUpdateCache = new JButton("Update selected Cache");

		panel.add(btnUpdateCache);

		if (getProperties().size() > 0) {
			Rectangle r = new Rectangle((int) Double.parseDouble(getString("x")),
					(int) Double.parseDouble(getString("y")), (int) Double.parseDouble(getString("w")),
					(int) Double.parseDouble(getString("h")));
			setBounds(r);
		}

		btnUpdateCache.addActionListener(ae->
		{
			List<MagicEdition> ret = UITools.getTableSelections(tableCache,0);
			buzy.start(ret.size());
			SwingWorker<Void, Map.Entry<MagicEdition,Date>> swC = new SwingWorker<>()
			{

				@Override
				protected void done() {
					buzy.end();
				}

				@Override
				protected void process(List<Map.Entry<MagicEdition,Date>> chunks) {
					buzy.progressSmooth(chunks.size());

					chunks.forEach(e->modelCache.updateRow(e.getKey(),e.getValue()));
				}

				@Override
				protected Void doInBackground() throws Exception {
					for(MagicEdition ed : ret) {
						try {
							EditionPriceVariations css = evaluator.initCache(ed);

							if(!css.isEmpty())
							{

								publish(new DefaultMapEntry<>(ed, css.getDate()));
							}
						} catch (Exception e) {
							logger.error(e);
						}
					}
					return null;
				}

			};
			ThreadManager.getInstance().runInEdt(swC,"update cache date for "+ret);
		});

		btnRefresh.addActionListener(ae-> init());

	}

	@Override
	public void initGUI() {
		getContentPane().setLayout(new BorderLayout(0, 0));
		modelCache = new MapTableModel<>();
		modelCache.setColumnNames("EDITION", "DATE");
		JXTable tableCache = new JXTable();
		tableCache.setModel(modelCache);

		JPanel panelHaut = new JPanel();
		getContentPane().add(panelHaut, BorderLayout.NORTH);
		buzy = AbstractBuzyIndicatorComponent.createProgressComponent();

		lblPrice = new JLabel();
		lblPrice.setFont(MTGControler.getInstance().getFont().deriveFont(Font.BOLD, 13));
		panelHaut.add(lblPrice);
		panelHaut.add(buzy);

		JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
		getContentPane().add(tabbedPane, BorderLayout.CENTER);

		JPanel panneauColl = new JPanel();
		tabbedPane.addTab("Collection", null, panneauColl, null);

		treeTable = new JXTreeTable();
		CardShakeTreeCellRenderer ren = new CardShakeTreeCellRenderer();
		treeTable.setDefaultRenderer(Object.class, ren);
		treeTable.setTreeCellRenderer(ren);

		panneauColl.setLayout(new BorderLayout(0, 0));
		panneauColl.add(new JScrollPane(treeTable));

		JPanel panneauh = new JPanel();
		panneauColl.add(panneauh, BorderLayout.NORTH);

		JButton btnRefresh = new JButton(MTGConstants.ICON_REFRESH);

		panneauh.add(btnRefresh);

		JPanel panelCacheDetail = new JPanel();
		tabbedPane.addTab("Cache", null, panelCacheDetail, null);
		panelCacheDetail.setLayout(new BorderLayout(0, 0));

		panelCacheDetail.add(new JScrollPane(tableCache));

		JPanel panel = new JPanel();
		panelCacheDetail.add(panel, BorderLayout.NORTH);

		JButton btnUpdateCache = new JButton("Update selected Cache");

		panel.add(btnUpdateCache);

		if (getProperties().size() > 0) {
			Rectangle r = new Rectangle((int) Double.parseDouble(getString("x")),
					(int) Double.parseDouble(getString("y")), (int) Double.parseDouble(getString("w")),
					(int) Double.parseDouble(getString("h")));
			setBounds(r);
		}

		btnUpdateCache.addActionListener(ae->
		{
			List<MagicEdition> ret = UITools.getTableSelections(tableCache,0);
			buzy.start(ret.size());
			SwingWorker<Void, Map.Entry<MagicEdition,Date>> swC = new SwingWorker<Void, Map.Entry<MagicEdition,Date>>()
			{

				@Override
				protected void done() {
					buzy.end();
				}

				@Override
				protected void process(List<Map.Entry<MagicEdition,Date>> chunks) {
					buzy.progressSmooth(chunks.size());

					chunks.forEach(e->modelCache.updateRow(e.getKey(),e.getValue()));
				}

				@Override
				protected Void doInBackground() throws Exception {
					for(MagicEdition ed : ret) {
						try {
							EditionPriceVariations css = evaluator.initCache(ed);

							if(!css.isEmpty())
							{

								publish(new DefaultMapEntry<>(ed, css.getDate()));
							}
						} catch (Exception e) {
							logger.error(e);
						}
					}
					return null;
				}

			};
			ThreadManager.getInstance().runInEdt(swC,"update cache date for "+ret);
		});

		btnRefresh.addActionListener(ae-> init());

	}

Replace Generic With Diamond SwingWorker<Void,Map.Entry<MagicEdition,Date>> with SwingWorker<> in method public initGUI() : void from class org.magic.gui.dashlet.CollectionAnalyzerDashlet


	@Override
	public void init() {

		if (cboEditions.getSelectedItem() != null)
		{
			lblLoading.start();
			SwingWorker<EditionPriceVariations, Void> sw = new SwingWorker<>()
			{
				@Override
				protected EditionPriceVariations doInBackground(){
					MagicEdition ed = (MagicEdition) cboEditions.getSelectedItem();
					setProperty("EDITION", ed.getId());
					try {
						return MTGControler.getInstance().getEnabled(MTGDashBoard.class).getShakesForEdition(ed);
					} catch (IOException e) {
						logger.error(e);
						return new EditionPriceVariations();
					}
				}

				@Override
				protected void done() {
					try {
						modEdition.init(get().getShakes());
						table.packAll();
						table.setRowSorter(new TableRowSorter(modEdition));

					} catch (Exception e) {
						logger.error(e);
					}
					lblLoading.end();
				}

			};

			ThreadManager.getInstance().runInEdt(sw,"loading " + cboEditions.getSelectedItem() + " in editionDashlet");
		}

	}

	@Override
	public void init() {

		if (cboEditions.getSelectedItem() != null)
		{
			lblLoading.start();
			SwingWorker<EditionPriceVariations, Void> sw = new SwingWorker<EditionPriceVariations, Void>()
			{
				@Override
				protected EditionPriceVariations doInBackground(){
					MagicEdition ed = (MagicEdition) cboEditions.getSelectedItem();
					setProperty("EDITION", ed.getId());
					try {
						return MTGControler.getInstance().getEnabled(MTGDashBoard.class).getShakesForEdition(ed);
					} catch (IOException e) {
						logger.error(e);
						return new EditionPriceVariations();
					}
				}

				@Override
				protected void done() {
					try {
						modEdition.init(get().getShakes());
						table.packAll();
						table.setRowSorter(new TableRowSorter(modEdition));

					} catch (Exception e) {
						logger.error(e);
					}
					lblLoading.end();
				}

			};

			ThreadManager.getInstance().runInEdt(sw,"loading " + cboEditions.getSelectedItem() + " in editionDashlet");
		}

	}

Replace Generic With Diamond SwingWorker<EditionPriceVariations,Void> with SwingWorker<> in method public init() : void from class org.magic.gui.dashlet.EditionsDashlet


	public void addRow(K key, V value)
	{

		keys.add(new AbstractMap.SimpleEntry<>(key,value));
		fireTableDataChanged();

	}

	public void addRow(K key, V value)
	{

		keys.add(new AbstractMap.SimpleEntry<K, V>(key,value));
		fireTableDataChanged();

	}

Replace Generic With Diamond AbstractMap.SimpleEntry<K,V> with AbstractMap.SimpleEntry<> in method public addRow(key K, value V) : void from class org.magic.gui.models.conf.MapTableModel


	@Override
	public Object getChild(Object parent, int index) {
		if (parent instanceof MTGPlugin) {
			T dept = (T) parent;

			return dept.getProperties().entrySet().toArray()[index];
		}
		return new ArrayList<>(listElements).get(index);
	}

	@Override
	public Object getChild(Object parent, int index) {
		if (parent instanceof MTGPlugin) {
			T dept = (T) parent;

			return dept.getProperties().entrySet().toArray()[index];
		}
		return new ArrayList<T>(listElements).get(index);
	}

Replace Generic With Diamond ArrayList<T> with ArrayList<> in method public getChild(parent Object, index int) : Object from class org.magic.gui.models.conf.PluginTreeTableModel