	private void initGUI() throws ClassNotFoundException, IOException, SQLException {
		JMenuBar mtgMnuBar;
		JMenu mnFile;
		JMenu mnuAbout;
		JMenuItem mntmExit;

		logger.info("init Main GUI");
		setSize(new Dimension(1420, 900));
		setTitle(MTGConstants.MTG_APP_NAME + " ( v" + serviceUpdate.getVersion() + ")");

		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				MTGControler.getInstance().closeApp();

			}
		});

		setIconImage(MTGConstants.IMAGE_LOGO);
		getContentPane().setLayout(new BorderLayout());

		mtgMnuBar = new JMenuBar();
		setJMenuBar(mtgMnuBar);

		mnFile = new JMenu(MTGControler.getInstance().getLangService().getCapitalize("FILE"));
		mnuAbout = new JMenu("?");
		mntmExit = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("EXIT"),MTGConstants.ICON_EXIT);

		JMenuItem mntmHelp = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("READ_MANUAL"),MTGConstants.ICON_HELP);
		JMenuItem mntmThreadItem = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("THREADS"),MTGConstants.ICON_CONFIG);
		JMenuItem mntmLogsItem = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("LOGS"),MTGConstants.ICON_CONFIG);
		JMenuItem mntmAboutMagicDesktop = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("ABOUT"),new ImageIcon(MTGConstants.IMAGE_LOGO));
		JMenuItem mntmReportBug = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("REPORT_BUG"),MTGConstants.ICON_BUG);
		JMenuItem mntmFileOpen = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("OPEN"),MTGConstants.ICON_OPEN);
		JMenuItem mntmFileTagEditor = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("BINDER_TAG_EDITOR"),MTGConstants.ICON_BINDERS);
		JMenuItem mntmFileChromePlugin = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("CHROME_PLUGIN"),MTGConstants.ICON_CHROME);
		JMenuItem mntmFilePackageExplorer = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("PACKAGES"),MTGConstants.ICON_PACKAGE);
		JMenuItem mntmFileScript = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("SCRIPT"),MTGConstants.ICON_SCRIPT);

		mtgMnuBar.add(mnFile);
		mnFile.add(mntmFileOpen);
		mnFile.add(mntmFileTagEditor);
		mnFile.add(mntmFileChromePlugin);
		mnFile.add(mntmFilePackageExplorer);
		mnFile.add(mntmFileScript);
		mnFile.add(mntmExit);
		mtgMnuBar.add(mnuAbout);
		mnuAbout.add(mntmThreadItem);
		mnuAbout.add(mntmLogsItem);
		mnuAbout.add(mntmHelp);
		mnuAbout.add(mntmAboutMagicDesktop);
		mnuAbout.add(mntmReportBug);

		mntmFileChromePlugin.addActionListener(ae->{
			ChromeDownloader dow = new ChromeDownloader();
			dow.setVisible(true);
		});

		mntmFilePackageExplorer.addActionListener(ae -> ThreadManager.getInstance().invokeLater(() -> MTGUIComponent.createJDialog(new PackagesBrowserPanel(), true, false).setVisible(true)));

		mntmFileScript.addActionListener(ae -> ThreadManager.getInstance().invokeLater(() -> MTGUIComponent.createJDialog(new ScriptPanel(), true, false).setVisible(true)));

		mntmFileTagEditor.addActionListener(ae -> ThreadManager.getInstance().invokeLater(() -> MTGUIComponent.createJDialog(new BinderTagsEditorComponent(), true, false).setVisible(true)));

		mntmLogsItem.addActionListener(ae -> ThreadManager.getInstance().invokeLater(() -> MTGUIComponent.createJDialog(new LoggerViewPanel(), true, false).setVisible(true)));

		mntmThreadItem.addActionListener(e ->

		ThreadManager.getInstance().invokeLater(() -> MTGUIComponent.createJDialog(new ThreadMonitor(), true, false).setVisible(true)));

		mntmExit.addActionListener(e -> MTGControler.getInstance().closeApp());

		mntmHelp.addActionListener(e -> {
			String url = MTGConstants.MTG_DESKTOP_WIKI_URL;
			try {
				Desktop.getDesktop().browse(new URI(url));
			} catch (Exception e1) {
				logger.error(e1);
			}
		});

		mntmAboutMagicDesktop.addActionListener(ae -> MTGUIComponent.createJDialog(new AboutDialog(), false,true).setVisible(true));

		mntmReportBug.addActionListener(ae -> {
			try {
				String url = MTGConstants.MTG_DESKTOP_ISSUES_URL;
				Desktop.getDesktop().browse(new URI(url));
			} catch (Exception e) {
				logger.error(e);
			}
		});
		mntmFileOpen.addActionListener(ae -> {

			if (CardSearchPanel.getInstance() == null)
				throw new NullPointerException(MTGControler.getInstance().getLangService().getCapitalize("MUST_BE_LOADED",MTGControler.getInstance().getLangService().get("SEARCH_MODULE")));

			JFileChooser choose = new JFileChooser();
			int returnVal = choose.showOpenDialog(null);
			if (returnVal == JFileChooser.APPROVE_OPTION) {
				File f = choose.getSelectedFile();
				MTGCardsExport exp = MTGControler.getInstance().getAbstractExporterFromExt(f);

				if (exp != null) {
					CardSearchPanel.getInstance().getLblLoading().setText(MTGControler.getInstance().getLangService().getCapitalize("LOADING_FILE", f.getName(), exp));
					AbstractObservableWorker<MagicDeck, MagicCard, MTGCardsExport> sw = new AbstractObservableWorker<>(CardSearchPanel.getInstance().getLblLoading(),exp) {
						@Override
						protected MagicDeck doInBackground() throws IOException {
							return plug.importDeck(f);
						}

						@Override
						protected void done() {
							super.done();
							try {
								CardSearchPanel.getInstance().open(get().getAsList());
								tabbedPane.setSelectedIndex(0);
							} catch (Exception e) {
								logger.error(e);
							}
						}
					};
					ThreadManager.getInstance().runInEdt(sw, "opening " + f);

				} else {
					MTGControler.getInstance().notify(new NullPointerException("NO EXPORT FOUND"));
				}
			}
		});

		boolean update=serviceUpdate.hasNewVersion();

		if (update)
		{
			JMenuItem newversion = new JMenuItem(
					MTGControler.getInstance().getLangService().getCapitalize("DOWNLOAD_LAST_VERSION") + " : "
							+ serviceUpdate.getOnlineVersion());
			newversion.addActionListener(e -> {
				try {
					Desktop.getDesktop().browse(new URI(MTGConstants.MTG_DESKTOP_APP_ZIP+"tag/"+serviceUpdate.getOnlineVersion()));
				} catch (Exception e1) {
					logger.error(e1.getMessage());
				}
			});
			mnuAbout.add(newversion);
		}

		String pos = MTGControler.getInstance().get("ui/moduleTabPosition");
		int position=0;
		switch(pos)
		{
		case "TOP": position = JTabbedPane.TOP;break;
		case "LEFT": position = JTabbedPane.LEFT;break;
		case "RIGHT": position = JTabbedPane.RIGHT;break;
		case "BOTTOM": position = JTabbedPane.BOTTOM;break;
		default : position=JTabbedPane.LEFT;break;
		}

		tabbedPane = new JTabbedPane(position);

		if (MTGControler.getInstance().get("modules/search").equals("true"))
			addTab(CardSearchPanel.getInstance());

		if (MTGControler.getInstance().get("modules/deckbuilder").equals("true"))
			addTab(new DeckBuilderGUI());

		if (MTGControler.getInstance().get("modules/game").equals("true"))
			addTab(new GameGUI());

		if (MTGControler.getInstance().get("modules/collection").equals("true"))
			addTab(new CollectionPanelGUI());

		if (MTGControler.getInstance().get("modules/stock").equals("true"))
			addTab(new StockPanelGUI());

		if (MTGControler.getInstance().get("modules/dashboard").equals("true"))
			addTab(new DashBoardGUI2());

		if (MTGControler.getInstance().get("modules/shopper").equals("true"))
			addTab(new OrdersGUI());

		if (MTGControler.getInstance().get("modules/alarm").equals("true"))
			addTab(new AlarmGUI());

		if (MTGControler.getInstance().get("modules/cardbuilder").equals("true"))
			addTab(new CardBuilder2GUI());

		if (MTGControler.getInstance().get("modules/rss").equals("true"))
			addTab(new RssGUI());

		if (MTGControler.getInstance().get("modules/history").equals("true"))
			addTab(new StoriesGUI());

		if (MTGControler.getInstance().get("modules/wallpaper").equals("true"))
			addTab(new WallpaperGUI());

		if (MTGControler.getInstance().get("modules/mkm").equals("true"))
			addTab(MTGUIComponent.build(new MkmPanel(), "MKM", MTGConstants.ICON_SHOP));

		getContentPane().add(tabbedPane, BorderLayout.CENTER);

			if(osNotifier!=null)
			{
				osNotifier.getTrayNotifier().addActionListener(e -> setVisible(!isVisible()));

				PopupMenu menuTray = new PopupMenu();
				for (int index_tab = 0; index_tab < tabbedPane.getTabCount(); index_tab++) {
					final int index = index_tab;
					MenuItem it = new MenuItem(tabbedPane.getTitleAt(index_tab));
					it.addActionListener(e -> {
						setVisible(true);
						setSelectedTab(index);
					});
					menuTray.add(it);
				}

				osNotifier.getTrayNotifier().setPopupMenu(menuTray);
				osNotifier.getTrayNotifier().setToolTip(MTGConstants.MTG_APP_NAME);

				if (update)
				{
					String msg=(MTGControler.getInstance().getLangService().getCapitalize("NEW_VERSION") + " "
									+ serviceUpdate.getOnlineVersion() + " "
									+ MTGControler.getInstance().getLangService().get("AVAILABLE"));
					MTGNotification notif = new MTGNotification(getTitle(),msg,MESSAGE_TYPE.INFO);
					osNotifier.send(notif);
				}
			}
			ThreadManager.getInstance().invokeLater(() -> {
				try {
					new TipsOfTheDayDialog().show();
				} catch (IOException e) {
					logger.error(e);
				}

			});
		}

	private void initGUI() throws ClassNotFoundException, IOException, SQLException {
		JMenuBar mtgMnuBar;
		JMenu mnFile;
		JMenu mnuAbout;
		JMenuItem mntmExit;

		logger.info("init Main GUI");
		setSize(new Dimension(1420, 900));
		setTitle(MTGConstants.MTG_APP_NAME + " ( v" + serviceUpdate.getVersion() + ")");

	//	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				MTGControler.getInstance().closeApp();

			}
		});

		setIconImage(MTGConstants.IMAGE_LOGO);
		getContentPane().setLayout(new BorderLayout());

		mtgMnuBar = new JMenuBar();
		setJMenuBar(mtgMnuBar);

		mnFile = new JMenu(MTGControler.getInstance().getLangService().getCapitalize("FILE"));
		mnuAbout = new JMenu("?");
		mntmExit = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("EXIT"),MTGConstants.ICON_EXIT);

		JMenuItem mntmHelp = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("READ_MANUAL"),MTGConstants.ICON_HELP);
		JMenuItem mntmThreadItem = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("THREADS"),MTGConstants.ICON_CONFIG);
		JMenuItem mntmLogsItem = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("LOGS"),MTGConstants.ICON_CONFIG);
		JMenuItem mntmAboutMagicDesktop = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("ABOUT"),new ImageIcon(MTGConstants.IMAGE_LOGO));
		JMenuItem mntmReportBug = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("REPORT_BUG"),MTGConstants.ICON_BUG);
		JMenuItem mntmFileOpen = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("OPEN"),MTGConstants.ICON_OPEN);
		JMenuItem mntmFileTagEditor = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("BINDER_TAG_EDITOR"),MTGConstants.ICON_BINDERS);
		JMenuItem mntmFileChromePlugin = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("CHROME_PLUGIN"),MTGConstants.ICON_CHROME);
		JMenuItem mntmFilePackageExplorer = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("PACKAGES"),MTGConstants.ICON_PACKAGE);
		JMenuItem mntmFileScript = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("SCRIPT"),MTGConstants.ICON_SCRIPT);

		mtgMnuBar.add(mnFile);
		mnFile.add(mntmFileOpen);
		mnFile.add(mntmFileTagEditor);
		mnFile.add(mntmFileChromePlugin);
		mnFile.add(mntmFilePackageExplorer);
		mnFile.add(mntmFileScript);
		mnFile.add(mntmExit);
		mtgMnuBar.add(mnuAbout);
		mnuAbout.add(mntmThreadItem);
		mnuAbout.add(mntmLogsItem);
		mnuAbout.add(mntmHelp);
		mnuAbout.add(mntmAboutMagicDesktop);
		mnuAbout.add(mntmReportBug);

		mntmFileChromePlugin.addActionListener(ae->{
			ChromeDownloader dow = new ChromeDownloader();
			dow.setVisible(true);
		});

		mntmFilePackageExplorer.addActionListener(ae -> ThreadManager.getInstance().invokeLater(() -> MTGUIComponent.createJDialog(new PackagesBrowserPanel(), true, false).setVisible(true)));

		mntmFileScript.addActionListener(ae -> ThreadManager.getInstance().invokeLater(() -> MTGUIComponent.createJDialog(new ScriptPanel(), true, false).setVisible(true)));

		mntmFileTagEditor.addActionListener(ae -> ThreadManager.getInstance().invokeLater(() -> MTGUIComponent.createJDialog(new BinderTagsEditorComponent(), true, false).setVisible(true)));

		mntmLogsItem.addActionListener(ae -> ThreadManager.getInstance().invokeLater(() -> MTGUIComponent.createJDialog(new LoggerViewPanel(), true, false).setVisible(true)));

		mntmThreadItem.addActionListener(e ->

		ThreadManager.getInstance().invokeLater(() -> MTGUIComponent.createJDialog(new ThreadMonitor(), true, false).setVisible(true)));

		mntmExit.addActionListener(e -> MTGControler.getInstance().closeApp());

		mntmHelp.addActionListener(e -> {
			String url = MTGConstants.MTG_DESKTOP_WIKI_URL;
			try {
				Desktop.getDesktop().browse(new URI(url));
			} catch (Exception e1) {
				logger.error(e1);
			}
		});

		mntmAboutMagicDesktop.addActionListener(ae -> MTGUIComponent.createJDialog(new AboutDialog(), false,true).setVisible(true));

		mntmReportBug.addActionListener(ae -> {
			try {
				String url = MTGConstants.MTG_DESKTOP_ISSUES_URL;
				Desktop.getDesktop().browse(new URI(url));
			} catch (Exception e) {
				logger.error(e);
			}
		});
		mntmFileOpen.addActionListener(ae -> {

			if (CardSearchPanel.getInstance() == null)
				throw new NullPointerException(MTGControler.getInstance().getLangService().getCapitalize("MUST_BE_LOADED",MTGControler.getInstance().getLangService().get("SEARCH_MODULE")));

			JFileChooser choose = new JFileChooser();
			int returnVal = choose.showOpenDialog(null);
			if (returnVal == JFileChooser.APPROVE_OPTION) {
				File f = choose.getSelectedFile();
				MTGCardsExport exp = MTGControler.getInstance().getAbstractExporterFromExt(f);

				if (exp != null) {
					CardSearchPanel.getInstance().getLblLoading().setText(MTGControler.getInstance().getLangService().getCapitalize("LOADING_FILE", f.getName(), exp));
					AbstractObservableWorker<MagicDeck, MagicCard, MTGCardsExport> sw = new AbstractObservableWorker<MagicDeck, MagicCard, MTGCardsExport>(CardSearchPanel.getInstance().getLblLoading(),exp) {
						@Override
						protected MagicDeck doInBackground() throws IOException {
							return plug.importDeck(f);
						}

						@Override
						protected void done() {
							super.done();
							try {
								CardSearchPanel.getInstance().open(get().getAsList());
								tabbedPane.setSelectedIndex(0);
							} catch (Exception e) {
								logger.error(e);
							}
						}
					};
					ThreadManager.getInstance().runInEdt(sw, "opening " + f);

				} else {
					MTGControler.getInstance().notify(new NullPointerException("NO EXPORT FOUND"));
				}
			}
		});

		boolean update=serviceUpdate.hasNewVersion();

		if (update)
		{
			JMenuItem newversion = new JMenuItem(
					MTGControler.getInstance().getLangService().getCapitalize("DOWNLOAD_LAST_VERSION") + " : "
							+ serviceUpdate.getOnlineVersion());
			newversion.addActionListener(e -> {
				try {
					Desktop.getDesktop().browse(new URI(MTGConstants.MTG_DESKTOP_APP_ZIP+"tag/"+serviceUpdate.getOnlineVersion()));
				} catch (Exception e1) {
					logger.error(e1.getMessage());
				}
			});
			mnuAbout.add(newversion);
		}

		String pos = MTGControler.getInstance().get("ui/moduleTabPosition");
		int position=0;
		switch(pos)
		{
		case "TOP": position = JTabbedPane.TOP;break;
		case "LEFT": position = JTabbedPane.LEFT;break;
		case "RIGHT": position = JTabbedPane.RIGHT;break;
		case "BOTTOM": position = JTabbedPane.BOTTOM;break;
		default : position=JTabbedPane.LEFT;break;
		}

		tabbedPane = new JTabbedPane(position);

		if (MTGControler.getInstance().get("modules/search").equals("true"))
			addTab(CardSearchPanel.getInstance());

		if (MTGControler.getInstance().get("modules/deckbuilder").equals("true"))
			addTab(new DeckBuilderGUI());

		if (MTGControler.getInstance().get("modules/game").equals("true"))
			addTab(new GameGUI());

		if (MTGControler.getInstance().get("modules/collection").equals("true"))
			addTab(new CollectionPanelGUI());

		if (MTGControler.getInstance().get("modules/stock").equals("true"))
			addTab(new StockPanelGUI());

		if (MTGControler.getInstance().get("modules/dashboard").equals("true"))
			addTab(new DashBoardGUI2());

		if (MTGControler.getInstance().get("modules/shopper").equals("true"))
			addTab(new OrdersGUI());

		if (MTGControler.getInstance().get("modules/alarm").equals("true"))
			addTab(new AlarmGUI());

		if (MTGControler.getInstance().get("modules/cardbuilder").equals("true"))
			addTab(new CardBuilder2GUI());

		if (MTGControler.getInstance().get("modules/rss").equals("true"))
			addTab(new RssGUI());

		if (MTGControler.getInstance().get("modules/history").equals("true"))
			addTab(new StoriesGUI());

		if (MTGControler.getInstance().get("modules/wallpaper").equals("true"))
			addTab(new WallpaperGUI());

		if (MTGControler.getInstance().get("modules/mkm").equals("true"))
			addTab(MTGUIComponent.build(new MkmPanel(), "MKM", MTGConstants.ICON_SHOP));

		getContentPane().add(tabbedPane, BorderLayout.CENTER);

			if(osNotifier!=null)
			{
				osNotifier.getTrayNotifier().addActionListener(e -> setVisible(!isVisible()));

				PopupMenu menuTray = new PopupMenu();
				for (int index_tab = 0; index_tab < tabbedPane.getTabCount(); index_tab++) {
					final int index = index_tab;
					MenuItem it = new MenuItem(tabbedPane.getTitleAt(index_tab));
					it.addActionListener(e -> {
						setVisible(true);
						setSelectedTab(index);
					});
					menuTray.add(it);
				}

				osNotifier.getTrayNotifier().setPopupMenu(menuTray);
				osNotifier.getTrayNotifier().setToolTip(MTGConstants.MTG_APP_NAME);

				if (update)
				{
					String msg=(MTGControler.getInstance().getLangService().getCapitalize("NEW_VERSION") + " "
									+ serviceUpdate.getOnlineVersion() + " "
									+ MTGControler.getInstance().getLangService().get("AVAILABLE"));
					MTGNotification notif = new MTGNotification(getTitle(),msg,MESSAGE_TYPE.INFO);
					osNotifier.send(notif);
				}
			}
			ThreadManager.getInstance().invokeLater(() -> {
				try {
					new TipsOfTheDayDialog().show();
				} catch (IOException e) {
					logger.error(e);
				}

			});
		}

Replace Generic With Diamond AbstractObservableWorker<MagicDeck,MagicCard,MTGCardsExport> with AbstractObservableWorker<> in method private initGUI() : void from class org.magic.gui.MagicGUI


	public String getVersion() {
		InputStream input = getClass().getResourceAsStream(MTGConstants.MTG_DESKTOP_VERSION_FILE);
		try (BufferedReader read = new BufferedReader(new InputStreamReader(input)))
		{
			String version = read.readLine();

			if (version.startsWith("${"))
				return "0.0";
			else
				return version;
		} catch (IOException e) {
			return "";
		}

	}

	public String getVersion() {
		InputStream input = getClass().getResourceAsStream(MTGConstants.MTG_DESKTOP_VERSION_FILE);
		BufferedReader read = new BufferedReader(new InputStreamReader(input));
		try {
			String version = read.readLine();

			if (version.startsWith("${"))
				return "0.0";
			else
				return version;

		} catch (IOException e) {
			return "";
		}

	}

Try With Resources try(BufferedReader read=new BufferedReader(new InputStreamReader(input))) in method public getVersion() : String from class org.magic.services.VersionChecker


	private <T extends MTGPlugin> void createTab(String label, Icon ic, boolean multi,List<T> list)
	{
		JXTreeTable table = new JXTreeTable(new PluginTreeTableModel<>(multi, list));
		table.setShowGrid(true, false);
		table.setTreeCellRenderer(new MTGPluginTreeCellRenderer());
		table.setDefaultRenderer(Boolean.class, (JTable table2, Object value, boolean isSelected,boolean hasFocus, int row, int column)->{
				JPanel p = new JPanel();
				JCheckBox cbox = new JCheckBox("",Boolean.parseBoolean(value.toString()));
				cbox.setOpaque(false);
				p.add(cbox);

				if(isSelected)
					p.setBackground(table.getSelectionBackground());
				else
					p.setBackground(table.getBackground());

				return p;
		});

		subTabbedProviders.addTab(label, ic,new JScrollPane(table), null);
		table.addTreeSelectionListener(e -> {
			if (e.getNewLeadSelectionPath() != null && e.getNewLeadSelectionPath().getPathCount() > 1)
				((PluginTreeTableModel<?>) table.getTreeTableModel()).setSelectedNode((T) e.getNewLeadSelectionPath().getPathComponent(1));

			if(e.getNewLeadSelectionPath()!=null)
				lblCopyright.setText(((T) e.getNewLeadSelectionPath().getPathComponent(1)).termsAndCondition());

		});
		table.packAll();

	}

	private <T extends MTGPlugin> void createTab(String label, Icon ic, boolean multi,List<T> list)
	{
		JXTreeTable table = new JXTreeTable(new PluginTreeTableModel<T>(multi, list));
		table.setShowGrid(true, false);
		table.setTreeCellRenderer(new MTGPluginTreeCellRenderer());
		table.setDefaultRenderer(Boolean.class, (JTable table2, Object value, boolean isSelected,boolean hasFocus, int row, int column)->{
				JPanel p = new JPanel();
				JCheckBox cbox = new JCheckBox("",Boolean.parseBoolean(value.toString()));
				cbox.setOpaque(false);
				p.add(cbox);

				if(isSelected)
					p.setBackground(table.getSelectionBackground());
				else
					p.setBackground(table.getBackground());

				return p;
		});

		subTabbedProviders.addTab(label, ic,new JScrollPane(table), null);
		table.addTreeSelectionListener(e -> {
			if (e.getNewLeadSelectionPath() != null && e.getNewLeadSelectionPath().getPathCount() > 1)
				((PluginTreeTableModel<?>) table.getTreeTableModel()).setSelectedNode((T) e.getNewLeadSelectionPath().getPathComponent(1));

			if(e.getNewLeadSelectionPath()!=null)
				lblCopyright.setText(((T) e.getNewLeadSelectionPath().getPathComponent(1)).termsAndCondition());

		});
		table.packAll();

	}

Replace Generic With Diamond JXTreeTable with JXTreeTable in method private createTab(label String, ic Icon, multi boolean, list List<T>) : void from class org.magic.gui.ConfigurationPanelGUI


	private void initActions() {

		btnCompare.addActionListener(ae-> {
			model.clear();
			if(currentDeck!=null)
			{
				MagicCollection col = (MagicCollection)cboCollections.getSelectedItem();
				buzyLabel.start(currentDeck.getMap().entrySet().size());
				SwingWorker<Void, MagicCard> sw = new SwingWorker<>()
						{
						@Override
						protected Void doInBackground() throws Exception {
							currentDeck.getMap().entrySet().forEach(entry->
							{
								try {
									boolean has = MTGControler.getInstance().getEnabled(MTGDao.class).listCollectionFromCards(entry.getKey()).contains(col);
									List<MagicCardStock> stocks = MTGControler.getInstance().getEnabled(MTGDao.class).listStocks(entry.getKey(), col,false);
									int qty = currentDeck.getMap().get(entry.getKey());
									model.addItem(entry.getKey(),qty,has, stocks);
									publish(entry.getKey());
								} catch (SQLException e) {
									logger.error(e);
								}
							});

							return null;
						}

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

						@Override
						protected void process(List<MagicCard> chunks) {
							buzyLabel.progressSmooth(chunks.size());
						}
				};
				ThreadManager.getInstance().runInEdt(sw, "compare deck and stock");

			}
		});

	}

	private void initActions() {

		btnCompare.addActionListener(ae-> {
			model.clear();
			if(currentDeck!=null)
			{
				MagicCollection col = (MagicCollection)cboCollections.getSelectedItem();
				buzyLabel.start(currentDeck.getMap().entrySet().size());
				SwingWorker<Void, MagicCard> sw = new SwingWorker<Void, MagicCard>()
						{
						@Override
						protected Void doInBackground() throws Exception {
							currentDeck.getMap().entrySet().forEach(entry->
							{
								try {
									boolean has = MTGControler.getInstance().getEnabled(MTGDao.class).listCollectionFromCards(entry.getKey()).contains(col);
									List<MagicCardStock> stocks = MTGControler.getInstance().getEnabled(MTGDao.class).listStocks(entry.getKey(), col,false);
									int qty = currentDeck.getMap().get(entry.getKey());
									model.addItem(entry.getKey(),qty,has, stocks);
									publish(entry.getKey());
								} catch (SQLException e) {
									logger.error(e);
								}
							});

							return null;
						}

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

						@Override
						protected void process(List<MagicCard> chunks) {
							buzyLabel.progressSmooth(chunks.size());
						}
				};
				ThreadManager.getInstance().runInEdt(sw, "compare deck and stock");

			}
		});

	}

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


	public void init() {

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

			@Override
			protected List<CardShake> doInBackground() throws Exception {
				return MTGControler.getInstance().getEnabled(MTGDashBoard.class).getShakerFor((MagicFormat.FORMATS) cboFormats.getSelectedItem());
			}

			@Override
			protected void done() {
				try {
					modStandard.init(get());
					table.setModel(modStandard);
				} catch (Exception e) {
					logger.error(e);
				}
				lblLoading.end();
				table.getColumnModel().getColumn(3).setCellRenderer(new CardShakeRenderer());
				setProperty("FORMAT", ((MagicFormat.FORMATS) cboFormats.getSelectedItem()).toString());

				List<SortKey> keys = new ArrayList<>();
				SortKey sortKey = new SortKey(3, SortOrder.DESCENDING);// column index 2
				keys.add(sortKey);
				try {
					table.setRowSorter(new TableRowSorter(modStandard));
					((TableRowSorter) table.getRowSorter()).setSortKeys(keys);
					((TableRowSorter) table.getRowSorter()).sort();
					modStandard.fireTableDataChanged();
					table.packAll();
				} catch (Exception e) {
					// do nothing
				}
			}

		};

		lblLoading.start();
		ThreadManager.getInstance().runInEdt(sw,"Init Formats Dashlet");

	}

	public void init() {

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

			@Override
			protected List<CardShake> doInBackground() throws Exception {
				return MTGControler.getInstance().getEnabled(MTGDashBoard.class).getShakerFor((MagicFormat.FORMATS) cboFormats.getSelectedItem());
			}

			@Override
			protected void done() {
				try {
					modStandard.init(get());
					table.setModel(modStandard);
				} catch (Exception e) {
					logger.error(e);
				}
				lblLoading.end();
				table.getColumnModel().getColumn(3).setCellRenderer(new CardShakeRenderer());
				setProperty("FORMAT", ((MagicFormat.FORMATS) cboFormats.getSelectedItem()).toString());

				List<SortKey> keys = new ArrayList<>();
				SortKey sortKey = new SortKey(3, SortOrder.DESCENDING);// column index 2
				keys.add(sortKey);
				try {
					table.setRowSorter(new TableRowSorter(modStandard));
					((TableRowSorter) table.getRowSorter()).setSortKeys(keys);
					((TableRowSorter) table.getRowSorter()).sort();
					modStandard.fireTableDataChanged();
					table.packAll();
				} catch (Exception e) {
					// do nothing
				}
			}

		};

		lblLoading.start();
		ThreadManager.getInstance().runInEdt(sw,"Init Formats Dashlet");

	}

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


	private void initGUI() {
		getContentPane().setLayout(new BorderLayout(0, 0));
		deck = new MagicDeck();
		JPanel panelCollectionInput = new JPanel();
		getContentPane().add(panelCollectionInput, BorderLayout.NORTH);

		JLabel lblImport = new JLabel(MTGControler.getInstance().getLangService().getCapitalize("IMPORT") + " ");
		panelCollectionInput.add(lblImport);

		cboEditions =UITools.createComboboxEditions();
		panelCollectionInput.add(cboEditions);

		JLabel lblNewLabel = new JLabel(MTGControler.getInstance().getLangService().getCapitalize("BY"));
		panelCollectionInput.add(lblNewLabel);

		cboByType = UITools.createCombobox(new String[] { NUMBER, NAME });
		panelCollectionInput.add(cboByType);

		JLabel lblIn = new JLabel("in");
		panelCollectionInput.add(lblIn);

		JComboBox<MagicCollection> cboCollections = UITools.createComboboxCollection();
		panelCollectionInput.add(cboCollections);

		JPanel panneauBas = new JPanel();
		getContentPane().add(panneauBas, BorderLayout.SOUTH);
		AbstractBuzyIndicatorComponent progressBar = AbstractBuzyIndicatorComponent.createProgressComponent();

		final JCheckBox checkNewOne = new JCheckBox(
				MTGControler.getInstance().getLangService().getCapitalize("IMPORT_OTHER_SERIE"));

		JButton btnInverse = new JButton("Inverse");

		JButton btnImport = new JButton(MTGControler.getInstance().getLangService().getCapitalize("IMPORT"),MTGConstants.ICON_MASS_IMPORT);

		panneauBas.add(btnInverse);

		panneauBas.add(checkNewOne);

		panneauBas.add(btnImport);

		panneauBas.add(progressBar);

		JTextPane txtNumbersInput = new JTextPane();

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

		setModal(true);
		setLocationRelativeTo(null);

		btnInverse.addActionListener(e -> {
			List<String> elements = Arrays.asList(txtNumbersInput.getText().replaceAll("\n", " ").replaceAll("  ", " ").trim().split(" "));
			StringBuilder temp = new StringBuilder();
			for (MagicCard s : ids(elements))
				temp.append(s.getCurrentSet().getNumber()).append(" ");

			txtNumbersInput.setText(temp.toString());
		});

		btnImport.addActionListener(e -> {
			final MagicEdition ed = (MagicEdition) cboEditions.getSelectedItem();
			final MagicCollection col = (MagicCollection) cboCollections.getSelectedItem();

			if (cboByType.getSelectedItem().equals(NUMBER))
				ids = txtNumbersInput.getText().replaceAll("\n", " ").replaceAll("  ", " ").trim().split(" ");
			else
				ids = txtNumbersInput.getText().split("\n");

			AbstractObservableWorker<Void, MagicCard, MTGCardsProvider> sw = new AbstractObservableWorker<>(progressBar,MTGControler.getInstance().getEnabled(MTGCardsProvider.class),ids.length) {

				@Override
				protected void notifyEnd() {
					MTGControler.getInstance().notify(new MTGNotification(
							MTGControler.getInstance().getLangService().getCapitalize("FINISHED"),
							MTGControler.getInstance().getLangService().getCapitalize("X_ITEMS_IMPORTED", ids.length),
							MESSAGE_TYPE.INFO
							));
				}

				@Override
				protected void done() {
					super.done();
					if (!checkNewOne.isSelected()) {
						dispose();
					}
				}

				@Override
				protected Void doInBackground() throws Exception {
					for (String id : ids) {
						try {
							MagicCard mc = null;

							if (cboByType.getSelectedItem().toString().equalsIgnoreCase(NUMBER))
								mc = plug.getCardByNumber(id.trim(), ed);
							else
								mc = plug.searchCardByName( id.replaceAll("\n", " ").replaceAll("  ", " ").trim(),
												(MagicEdition) cboEditions.getSelectedItem(), true)
										.get(0);

							deck.add(mc);
							MTGControler.getInstance().saveCard(mc,col,null);

						} catch (Exception e1) {
							logger.error(e1);
						}
					}

					return null;
				}
			};

			ThreadManager.getInstance().runInEdt(sw, "btnImport importCards");
		});

	}

	private void initGUI() {
		getContentPane().setLayout(new BorderLayout(0, 0));
		deck = new MagicDeck();
		JPanel panelCollectionInput = new JPanel();
		getContentPane().add(panelCollectionInput, BorderLayout.NORTH);

		JLabel lblImport = new JLabel(MTGControler.getInstance().getLangService().getCapitalize("IMPORT") + " ");
		panelCollectionInput.add(lblImport);

		cboEditions =UITools.createComboboxEditions();
		panelCollectionInput.add(cboEditions);

		JLabel lblNewLabel = new JLabel(MTGControler.getInstance().getLangService().getCapitalize("BY"));
		panelCollectionInput.add(lblNewLabel);

		cboByType = UITools.createCombobox(new String[] { NUMBER, NAME });
		panelCollectionInput.add(cboByType);

		JLabel lblIn = new JLabel("in");
		panelCollectionInput.add(lblIn);

		JComboBox<MagicCollection> cboCollections = UITools.createComboboxCollection();
		panelCollectionInput.add(cboCollections);

		JPanel panneauBas = new JPanel();
		getContentPane().add(panneauBas, BorderLayout.SOUTH);
		AbstractBuzyIndicatorComponent progressBar = AbstractBuzyIndicatorComponent.createProgressComponent();

		final JCheckBox checkNewOne = new JCheckBox(
				MTGControler.getInstance().getLangService().getCapitalize("IMPORT_OTHER_SERIE"));

		JButton btnInverse = new JButton("Inverse");

		JButton btnImport = new JButton(MTGControler.getInstance().getLangService().getCapitalize("IMPORT"),MTGConstants.ICON_MASS_IMPORT);

		panneauBas.add(btnInverse);

		panneauBas.add(checkNewOne);

		panneauBas.add(btnImport);

		panneauBas.add(progressBar);

		JTextPane txtNumbersInput = new JTextPane();

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

		setModal(true);
		setLocationRelativeTo(null);

		btnInverse.addActionListener(e -> {
			List<String> elements = Arrays.asList(txtNumbersInput.getText().replaceAll("\n", " ").replaceAll("  ", " ").trim().split(" "));
			StringBuilder temp = new StringBuilder();
			for (MagicCard s : ids(elements))
				temp.append(s.getCurrentSet().getNumber()).append(" ");

			txtNumbersInput.setText(temp.toString());
		});

		btnImport.addActionListener(e -> {
			final MagicEdition ed = (MagicEdition) cboEditions.getSelectedItem();
			final MagicCollection col = (MagicCollection) cboCollections.getSelectedItem();

			if (cboByType.getSelectedItem().equals(NUMBER))
				ids = txtNumbersInput.getText().replaceAll("\n", " ").replaceAll("  ", " ").trim().split(" ");
			else
				ids = txtNumbersInput.getText().split("\n");

			AbstractObservableWorker<Void, MagicCard, MTGCardsProvider> sw = new AbstractObservableWorker<Void, MagicCard, MTGCardsProvider>(progressBar,MTGControler.getInstance().getEnabled(MTGCardsProvider.class),ids.length) {

				@Override
				protected void notifyEnd() {
					MTGControler.getInstance().notify(new MTGNotification(
							MTGControler.getInstance().getLangService().getCapitalize("FINISHED"),
							MTGControler.getInstance().getLangService().getCapitalize("X_ITEMS_IMPORTED", ids.length),
							MESSAGE_TYPE.INFO
							));
				}

				@Override
				protected void done() {
					super.done();
					if (!checkNewOne.isSelected()) {
						dispose();
					}
				}

				@Override
				protected Void doInBackground() throws Exception {
					for (String id : ids) {
						try {
							MagicCard mc = null;

							if (cboByType.getSelectedItem().toString().equalsIgnoreCase(NUMBER))
								mc = plug.getCardByNumber(id.trim(), ed);
							else
								mc = plug.searchCardByName( id.replaceAll("\n", " ").replaceAll("  ", " ").trim(),
												(MagicEdition) cboEditions.getSelectedItem(), true)
										.get(0);

							deck.add(mc);
							MTGControler.getInstance().saveCard(mc,col,null);

						} catch (Exception e1) {
							logger.error(e1);
						}
					}

					return null;
				}
			};

			ThreadManager.getInstance().runInEdt(sw, "btnImport importCards");
		});

	}

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


	protected void loadPics(MagicCard mc,MagicCardNames fn) {
		SwingWorker<ImageIcon, Void> sw = new SwingWorker<>()
		{
			@Override
			protected ImageIcon doInBackground() throws Exception {
				ImageIcon icon;
				try {
					if(fn==null)
						icon = new ImageIcon(MTGControler.getInstance().getEnabled(MTGPictureProvider.class).getPicture(mc, null));
					else
						icon = new ImageIcon(MTGControler.getInstance().getEnabled(MTGPictureProvider.class).getForeignNamePicture(fn, mc));
				} catch (Exception e) {
					icon = new ImageIcon(MTGControler.getInstance().getEnabled(MTGPictureProvider.class).getBackPicture());
					logger.error("Error loading pics for" + mc, e);
				}
				return icon;

			}

			@Override
			protected void done() {
				try {
					lblThumbnail.setIcon(get());
					repaint();
				} catch (Exception e) {
					logger.error(e);
				}

			}
		};

		ThreadManager.getInstance().runInEdt(sw,"loading " + mc + " picture");
	}

	protected void loadPics(MagicCard mc,MagicCardNames fn) {
		SwingWorker<ImageIcon, Void> sw = new SwingWorker<ImageIcon, Void>()
		{
			@Override
			protected ImageIcon doInBackground() throws Exception {
				ImageIcon icon;
				try {
					if(fn==null)
						icon = new ImageIcon(MTGControler.getInstance().getEnabled(MTGPictureProvider.class).getPicture(mc, null));
					else
						icon = new ImageIcon(MTGControler.getInstance().getEnabled(MTGPictureProvider.class).getForeignNamePicture(fn, mc));
				} catch (Exception e) {
					icon = new ImageIcon(MTGControler.getInstance().getEnabled(MTGPictureProvider.class).getBackPicture());
					logger.error("Error loading pics for" + mc, e);
				}
				return icon;

			}

			@Override
			protected void done() {
				try {
					lblThumbnail.setIcon(get());
					repaint();
				} catch (Exception e) {
					logger.error(e);
				}

			}
		};

		ThreadManager.getInstance().runInEdt(sw,"loading " + mc + " picture");
	}

Replace Generic With Diamond SwingWorker<ImageIcon,Void> with SwingWorker<> in method protected loadPics(mc MagicCard, fn MagicCardNames) : void from class org.magic.gui.components.MagicCardDetailPanel


	public void initAddAllSet(JMenuItem it)
	{

		it.addActionListener(evt -> {
			List<MagicEdition> eds = UITools.getTableSelections(tableEditions, 1);

			int res = JOptionPane.showConfirmDialog(null, MTGControler.getInstance().getLangService().getCapitalize(
					"CONFIRM_COLLECTION_ITEM_ADDITION", eds, it.getText()));

			if (res == JOptionPane.YES_OPTION)
			{
				try {
					List<MagicCard> list = new ArrayList<>();

					for(MagicEdition e : eds)
						for(MagicCard mc : provider.searchCardByEdition(e))
							list.add(mc);

						progressBar.start(list.size());
						logger.debug("save " + list.size() + " cards from " + eds);

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

							@Override
							protected Void doInBackground() {
								for (MagicCard mc : list) {
									MagicCollection col = new MagicCollection(it.getText());
									try {
										MTGControler.getInstance().saveCard(mc, col,null);
										publish(mc);

									} catch (SQLException e) {
										logger.error(e);
									}
								}
								return null;
							}

							@Override
							protected void done() {
								model.calculate();
								model.fireTableDataChanged();
								progressBar.end();
							}

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

						};

						ThreadManager.getInstance().runInEdt(sw, "insert sets");
					} catch (Exception e) {
						logger.error(e);
						MTGControler.getInstance().notify(e);

					}

			}

		});

	}

	public void initAddAllSet(JMenuItem it)
	{

		it.addActionListener(evt -> {
			List<MagicEdition> eds = UITools.getTableSelections(tableEditions, 1);

			int res = JOptionPane.showConfirmDialog(null, MTGControler.getInstance().getLangService().getCapitalize(
					"CONFIRM_COLLECTION_ITEM_ADDITION", eds, it.getText()));

			if (res == JOptionPane.YES_OPTION)
			{
				try {
					List<MagicCard> list = new ArrayList<>();

					for(MagicEdition e : eds)
						for(MagicCard mc : provider.searchCardByEdition(e))
							list.add(mc);

						progressBar.start(list.size());
						logger.debug("save " + list.size() + " cards from " + eds);

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

							@Override
							protected Void doInBackground() {
								for (MagicCard mc : list) {
									MagicCollection col = new MagicCollection(it.getText());
									try {
										MTGControler.getInstance().saveCard(mc, col,null);
										publish(mc);

									} catch (SQLException e) {
										logger.error(e);
									}
								}
								return null;
							}

							@Override
							protected void done() {
								model.calculate();
								model.fireTableDataChanged();
								progressBar.end();
							}

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

						};

						ThreadManager.getInstance().runInEdt(sw, "insert sets");
					} catch (Exception e) {
						logger.error(e);
						MTGControler.getInstance().notify(e);

					}

			}

		});

	}

Replace Generic With Diamond SwingWorker<Void,MagicCard> with SwingWorker<> in method public initAddAllSet(it JMenuItem) : void from class org.magic.gui.CollectionPanelGUI


	protected BindingGroup initDataBindings() {
		BeanProperty<MagicCard, Integer> cmcProperty = BeanProperty.create("cmc");
		BeanProperty<JTextField, String> textProperty = BeanProperty.create("text");
		AutoBinding<MagicCard, Integer, JTextField, String> autoBinding = Bindings
				.createAutoBinding(UpdateStrategy.READ, magicCard, cmcProperty, cmcJTextField, textProperty);
		autoBinding.bind();
		//
		BeanProperty<MagicCard, String> costProperty = BeanProperty.create("cost");
		BeanProperty<ManaPanel, String> textProperty1 = BeanProperty.create("manaCost");
		AutoBinding<MagicCard, String, ManaPanel, String> autoBinding1 = Bindings
				.createAutoBinding(UpdateStrategy.READ, magicCard, costProperty, manaPanel, textProperty1);
		autoBinding1.bind();
		//
		BeanProperty<MagicCard, String> fullTypeProperty = BeanProperty.create("fullType");
		BeanProperty<JTextField, String> textProperty2 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, JTextField, String> autoBinding2 = Bindings.createAutoBinding(
				UpdateStrategy.READ, magicCard, fullTypeProperty, fullTypeJTextField, textProperty2);
		autoBinding2.bind();
		//
		BeanProperty<MagicCard, Integer> loyaltyProperty = BeanProperty.create("loyalty");
		BeanProperty<JTextField, String> textProperty4 = BeanProperty.create("text");
		AutoBinding<MagicCard, Integer, JTextField, String> autoBinding4 = Bindings.createAutoBinding(
				UpdateStrategy.READ, magicCard, loyaltyProperty, loyaltyJTextField, textProperty4);
		autoBinding4.bind();
		//
		BeanProperty<MagicCard, String> nameProperty = BeanProperty.create("name");
		BeanProperty<JTextField, String> textProperty5 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, JTextField, String> autoBinding5 = Bindings
				.createAutoBinding(UpdateStrategy.READ, magicCard, nameProperty, nameJTextField, textProperty5);
		autoBinding5.bind();
		//
		BeanProperty<MagicCard, String> powerProperty = BeanProperty.create("power");
		BeanProperty<JTextField, String> textProperty6 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, JTextField, String> autoBinding6 = Bindings
				.createAutoBinding(UpdateStrategy.READ, magicCard, powerProperty, powerJTextField, textProperty6);
		autoBinding6.bind();
		//
		BeanProperty<MagicCard, String> textProperty8 = BeanProperty.create("text");
		BeanProperty<MagicTextPane, String> textProperty9 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, MagicTextPane, String> autoBinding8 = Bindings
				.createAutoBinding(UpdateStrategy.READ, magicCard, textProperty8, txtTextPane, textProperty9);
		autoBinding8.bind();
		//
		BeanProperty<MagicCard, String> toughnessProperty = BeanProperty.create("toughness");
		BeanProperty<JTextField, String> textProperty10 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, JTextField, String> autoBinding9 = Bindings.createAutoBinding(
				UpdateStrategy.READ, magicCard, toughnessProperty, toughnessJTextField, textProperty10);
		autoBinding9.bind();

		BeanProperty<MagicCard, String> flavorProperty = BeanProperty.create("flavor");
		BeanProperty<JTextPane, String> textProperty11 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, JTextPane, String> autoBinding10 = Bindings
				.createAutoBinding(UpdateStrategy.READ, magicCard, flavorProperty, txtFlavorArea, textProperty11);
		autoBinding10.bind();

		BeanProperty<MagicCard, String> artistProperty = BeanProperty.create("artist");
		BeanProperty<JTextField, String> textProperty12 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, JTextField, String> autoBinding11 = Bindings
				.createAutoBinding(UpdateStrategy.READ, magicCard, artistProperty, txtArtist, textProperty12);
		autoBinding11.bind();

		BeanProperty<MagicCard, String> layoutProperty = BeanProperty.create("layout");
		BeanProperty<JTextField, String> textProperty13 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, JTextField, String> autoBinding12 = Bindings.createAutoBinding(
				UpdateStrategy.READ, magicCard, layoutProperty, txtLayoutField, textProperty13);
		autoBinding12.bind();

		BeanProperty<MagicCard, String> waterProperty = BeanProperty.create("watermarks");
		BeanProperty<JTextField, String> textProperty14 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, JTextField, String> autoBinding13 = Bindings
				.createAutoBinding(UpdateStrategy.READ, magicCard, waterProperty, txtWatermark, textProperty14);
		autoBinding13.bind();

		BeanProperty<MagicCard, Boolean> reservedProperty = BeanProperty.create("reserved");
		BeanProperty<JCheckBox, Boolean> chkProperty15 = BeanProperty.create("selected");
		AutoBinding<MagicCard, Boolean, JCheckBox, Boolean> autoBinding15 = Bindings.createAutoBinding(
				UpdateStrategy.READ, magicCard, reservedProperty, chckbxReserved, chkProperty15);
		autoBinding15.bind();

		try {
			if (magicCard != null)
				rarityJTextField.setText(magicCard.getCurrentSet().getRarity());
		} catch (Exception e) {
			rarityJTextField.setText("");
		}

		txtTextPane.updateTextWithIcons();

		if (thumbnail && magicCard != null)
		{
			loadPics(magicCard,null);
		}

		if (magicCard != null && !magicCard.getEditions().isEmpty()) {

			ThreadManager.getInstance().executeThread(() -> {
				setMagicLogo(magicCard.getCurrentSet().getId(), magicCard.getCurrentSet().getRarity());

				int showCount = magicCard.getCurrentSet().getCardCountOfficial();
				if(showCount==0)
					showCount=magicCard.getCurrentSet().getCardCount();

				lblnumberInSet.setText(magicCard.getCurrentSet().getNumber() + "/"+ showCount);
			}, "loadLogo");
		}

		if (magicCard != null && enableCollectionLookup && !magicCard.getEditions().isEmpty()) {
			ThreadManager.getInstance().executeThread(() -> {
				try {
					listModelCollection.removeAllElements();
					MTGControler.getInstance().getEnabled(MTGDao.class).listCollectionFromCards(magicCard).forEach(col->listModelCollection.addElement(col));
				} catch (Exception e) {
					logger.error(e);
				}
			}, "loadCollections");
		}

		if (magicCard != null && enableCollectionLookup)
			ThreadManager.getInstance().executeThread(() -> {
				if (MTGControler.getInstance().getEnabled(MTGDao.class).hasAlert(magicCard)) {
					btnAlert.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("HAD_ALERT"));
					btnAlert.setEnabled(false);
				} else {
					btnAlert.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("ADD_ALERT_FOR",magicCard.getName()));
					btnAlert.setEnabled(true);
				}
			}, "Get alerts for " + magicCard);

		((DefaultListModel<MagicFormat>) lstFormats.getModel()).removeAllElements();

		if (magicCard != null)
			for (MagicFormat mf : magicCard.getLegalities())
				((DefaultListModel<MagicFormat>) lstFormats.getModel()).addElement(mf);

		ButtonGroup groupLanguagesButtons = new ButtonGroup();

		if(magicCard!=null)
		{

				panelSwitchLangage.removeAll();
				panelSwitchLangage.revalidate();

				if(enableCollectionLookup)
				{

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

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

						chunks.forEach(fn->{
							JToggleButton tglLangButton = new JToggleButton(fn.getLanguage());
							tglLangButton.setContentAreaFilled(false);
							tglLangButton.setActionCommand(fn.getLanguage());
							tglLangButton.setFont(tglLangButton.getFont().deriveFont(tglLangButton.getFont().getSize()-2));
							AbstractAction act = new AbstractAction() {
								private static final long serialVersionUID = 1L;
								@Override
								public void actionPerformed(ActionEvent ae) {
									obs.setChanged();
									obs.notifyObservers(fn);
									txtTextPane.setText(fn.getText());
									txtTextPane.updateTextWithIcons();
									nameJTextField.setText(fn.getName());
									fullTypeJTextField.setText(fn.getType());
									txtFlavorArea.setText(fn.getFlavor());
									if (thumbnail)
										loadPics(magicCard,fn);

								}
							};
							act.putValue(Action.NAME, fn.getLanguage());

							tglLangButton.setActionCommand(fn.getLanguage());
							tglLangButton.setAction(act);
							groupLanguagesButtons.add(tglLangButton);
							panelSwitchLangage.add(tglLangButton);

							if(!MTGControler.getInstance().get("langage").equalsIgnoreCase("english") && fn.getGathererId()>0 && fn.getLanguage().equalsIgnoreCase(MTGControler.getInstance().get("langage")))
								tglLangButton.doClick();

						});

					}

					@Override
					protected Void doInBackground() throws Exception {
						publish(magicCard.getForeignNames().toArray(new MagicCardNames[magicCard.getForeignNames().size()]));
						return null;
					}
				};
				ThreadManager.getInstance().runInEdt(sw,"loading " + magicCard + " languages");
				}
		}

		//
		BindingGroup bindingGroup = new BindingGroup();
		//
		bindingGroup.addBinding(autoBinding);
		bindingGroup.addBinding(autoBinding1);
		bindingGroup.addBinding(autoBinding2);
		bindingGroup.addBinding(autoBinding4);
		bindingGroup.addBinding(autoBinding5);
		bindingGroup.addBinding(autoBinding6);
		bindingGroup.addBinding(autoBinding8);
		bindingGroup.addBinding(autoBinding9);
		bindingGroup.addBinding(autoBinding10);
		bindingGroup.addBinding(autoBinding11);
		bindingGroup.addBinding(autoBinding12);
		bindingGroup.addBinding(autoBinding13);
		bindingGroup.addBinding(autoBinding15);
		return bindingGroup;
	}

	protected BindingGroup initDataBindings() {
		BeanProperty<MagicCard, Integer> cmcProperty = BeanProperty.create("cmc");
		BeanProperty<JTextField, String> textProperty = BeanProperty.create("text");
		AutoBinding<MagicCard, Integer, JTextField, String> autoBinding = Bindings
				.createAutoBinding(UpdateStrategy.READ, magicCard, cmcProperty, cmcJTextField, textProperty);
		autoBinding.bind();
		//
		BeanProperty<MagicCard, String> costProperty = BeanProperty.create("cost");
		BeanProperty<ManaPanel, String> textProperty1 = BeanProperty.create("manaCost");
		AutoBinding<MagicCard, String, ManaPanel, String> autoBinding1 = Bindings
				.createAutoBinding(UpdateStrategy.READ, magicCard, costProperty, manaPanel, textProperty1);
		autoBinding1.bind();
		//
		BeanProperty<MagicCard, String> fullTypeProperty = BeanProperty.create("fullType");
		BeanProperty<JTextField, String> textProperty2 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, JTextField, String> autoBinding2 = Bindings.createAutoBinding(
				UpdateStrategy.READ, magicCard, fullTypeProperty, fullTypeJTextField, textProperty2);
		autoBinding2.bind();
		//
		BeanProperty<MagicCard, Integer> loyaltyProperty = BeanProperty.create("loyalty");
		BeanProperty<JTextField, String> textProperty4 = BeanProperty.create("text");
		AutoBinding<MagicCard, Integer, JTextField, String> autoBinding4 = Bindings.createAutoBinding(
				UpdateStrategy.READ, magicCard, loyaltyProperty, loyaltyJTextField, textProperty4);
		autoBinding4.bind();
		//
		BeanProperty<MagicCard, String> nameProperty = BeanProperty.create("name");
		BeanProperty<JTextField, String> textProperty5 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, JTextField, String> autoBinding5 = Bindings
				.createAutoBinding(UpdateStrategy.READ, magicCard, nameProperty, nameJTextField, textProperty5);
		autoBinding5.bind();
		//
		BeanProperty<MagicCard, String> powerProperty = BeanProperty.create("power");
		BeanProperty<JTextField, String> textProperty6 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, JTextField, String> autoBinding6 = Bindings
				.createAutoBinding(UpdateStrategy.READ, magicCard, powerProperty, powerJTextField, textProperty6);
		autoBinding6.bind();
		//
		BeanProperty<MagicCard, String> textProperty8 = BeanProperty.create("text");
		BeanProperty<MagicTextPane, String> textProperty9 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, MagicTextPane, String> autoBinding8 = Bindings
				.createAutoBinding(UpdateStrategy.READ, magicCard, textProperty8, txtTextPane, textProperty9);
		autoBinding8.bind();
		//
		BeanProperty<MagicCard, String> toughnessProperty = BeanProperty.create("toughness");
		BeanProperty<JTextField, String> textProperty10 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, JTextField, String> autoBinding9 = Bindings.createAutoBinding(
				UpdateStrategy.READ, magicCard, toughnessProperty, toughnessJTextField, textProperty10);
		autoBinding9.bind();

		BeanProperty<MagicCard, String> flavorProperty = BeanProperty.create("flavor");
		BeanProperty<JTextPane, String> textProperty11 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, JTextPane, String> autoBinding10 = Bindings
				.createAutoBinding(UpdateStrategy.READ, magicCard, flavorProperty, txtFlavorArea, textProperty11);
		autoBinding10.bind();

		BeanProperty<MagicCard, String> artistProperty = BeanProperty.create("artist");
		BeanProperty<JTextField, String> textProperty12 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, JTextField, String> autoBinding11 = Bindings
				.createAutoBinding(UpdateStrategy.READ, magicCard, artistProperty, txtArtist, textProperty12);
		autoBinding11.bind();

		BeanProperty<MagicCard, String> layoutProperty = BeanProperty.create("layout");
		BeanProperty<JTextField, String> textProperty13 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, JTextField, String> autoBinding12 = Bindings.createAutoBinding(
				UpdateStrategy.READ, magicCard, layoutProperty, txtLayoutField, textProperty13);
		autoBinding12.bind();

		BeanProperty<MagicCard, String> waterProperty = BeanProperty.create("watermarks");
		BeanProperty<JTextField, String> textProperty14 = BeanProperty.create("text");
		AutoBinding<MagicCard, String, JTextField, String> autoBinding13 = Bindings
				.createAutoBinding(UpdateStrategy.READ, magicCard, waterProperty, txtWatermark, textProperty14);
		autoBinding13.bind();

		BeanProperty<MagicCard, Boolean> reservedProperty = BeanProperty.create("reserved");
		BeanProperty<JCheckBox, Boolean> chkProperty15 = BeanProperty.create("selected");
		AutoBinding<MagicCard, Boolean, JCheckBox, Boolean> autoBinding15 = Bindings.createAutoBinding(
				UpdateStrategy.READ, magicCard, reservedProperty, chckbxReserved, chkProperty15);
		autoBinding15.bind();

		try {
			if (magicCard != null)
				rarityJTextField.setText(magicCard.getCurrentSet().getRarity());
		} catch (Exception e) {
			rarityJTextField.setText("");
		}

		txtTextPane.updateTextWithIcons();

		if (thumbnail && magicCard != null)
		{
			loadPics(magicCard,null);
		}

		if (magicCard != null && !magicCard.getEditions().isEmpty()) {

			ThreadManager.getInstance().executeThread(() -> {
				setMagicLogo(magicCard.getCurrentSet().getId(), magicCard.getCurrentSet().getRarity());

				int showCount = magicCard.getCurrentSet().getCardCountOfficial();
				if(showCount==0)
					showCount=magicCard.getCurrentSet().getCardCount();

				lblnumberInSet.setText(magicCard.getCurrentSet().getNumber() + "/"+ showCount);
			}, "loadLogo");
		}

		if (magicCard != null && enableCollectionLookup && !magicCard.getEditions().isEmpty()) {
			ThreadManager.getInstance().executeThread(() -> {
				try {
					listModelCollection.removeAllElements();
					MTGControler.getInstance().getEnabled(MTGDao.class).listCollectionFromCards(magicCard).forEach(col->listModelCollection.addElement(col));
				} catch (Exception e) {
					logger.error(e);
				}
			}, "loadCollections");
		}

		if (magicCard != null && enableCollectionLookup)
			ThreadManager.getInstance().executeThread(() -> {
				if (MTGControler.getInstance().getEnabled(MTGDao.class).hasAlert(magicCard)) {
					btnAlert.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("HAD_ALERT"));
					btnAlert.setEnabled(false);
				} else {
					btnAlert.setToolTipText(MTGControler.getInstance().getLangService().getCapitalize("ADD_ALERT_FOR",magicCard.getName()));
					btnAlert.setEnabled(true);
				}
			}, "Get alerts for " + magicCard);

		((DefaultListModel<MagicFormat>) lstFormats.getModel()).removeAllElements();

		if (magicCard != null)
			for (MagicFormat mf : magicCard.getLegalities())
				((DefaultListModel<MagicFormat>) lstFormats.getModel()).addElement(mf);

		ButtonGroup groupLanguagesButtons = new ButtonGroup();

		if(magicCard!=null)
		{

				panelSwitchLangage.removeAll();
				panelSwitchLangage.revalidate();

				if(enableCollectionLookup)
				{

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

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

						chunks.forEach(fn->{
							JToggleButton tglLangButton = new JToggleButton(fn.getLanguage());
							tglLangButton.setContentAreaFilled(false);
							tglLangButton.setActionCommand(fn.getLanguage());
							tglLangButton.setFont(tglLangButton.getFont().deriveFont(tglLangButton.getFont().getSize()-2));
							AbstractAction act = new AbstractAction() {
								private static final long serialVersionUID = 1L;
								@Override
								public void actionPerformed(ActionEvent ae) {
									obs.setChanged();
									obs.notifyObservers(fn);
									txtTextPane.setText(fn.getText());
									txtTextPane.updateTextWithIcons();
									nameJTextField.setText(fn.getName());
									fullTypeJTextField.setText(fn.getType());
									txtFlavorArea.setText(fn.getFlavor());
									if (thumbnail)
										loadPics(magicCard,fn);

								}
							};
							act.putValue(Action.NAME, fn.getLanguage());

							tglLangButton.setActionCommand(fn.getLanguage());
							tglLangButton.setAction(act);
							groupLanguagesButtons.add(tglLangButton);
							panelSwitchLangage.add(tglLangButton);

							if(!MTGControler.getInstance().get("langage").equalsIgnoreCase("english") && fn.getGathererId()>0 && fn.getLanguage().equalsIgnoreCase(MTGControler.getInstance().get("langage")))
								tglLangButton.doClick();

						});

					}

					@Override
					protected Void doInBackground() throws Exception {
						publish(magicCard.getForeignNames().toArray(new MagicCardNames[magicCard.getForeignNames().size()]));
						return null;
					}
				};
				ThreadManager.getInstance().runInEdt(sw,"loading " + magicCard + " languages");
				}
		}

		//
		BindingGroup bindingGroup = new BindingGroup();
		//
		bindingGroup.addBinding(autoBinding);
		bindingGroup.addBinding(autoBinding1);
		bindingGroup.addBinding(autoBinding2);
		bindingGroup.addBinding(autoBinding4);
		bindingGroup.addBinding(autoBinding5);
		bindingGroup.addBinding(autoBinding6);
		bindingGroup.addBinding(autoBinding8);
		bindingGroup.addBinding(autoBinding9);
		bindingGroup.addBinding(autoBinding10);
		bindingGroup.addBinding(autoBinding11);
		bindingGroup.addBinding(autoBinding12);
		bindingGroup.addBinding(autoBinding13);
		bindingGroup.addBinding(autoBinding15);
		return bindingGroup;
	}

Replace Generic With Diamond SwingWorker<Void,MagicCardNames> with SwingWorker<> in method protected initDataBindings() : BindingGroup from class org.magic.gui.components.MagicCardDetailPanel


	public WallpaperGUI() {

		setLayout(new BorderLayout(0, 0));

		panelThumnail = new JPanel();
		add(new JScrollPane(panelThumnail), BorderLayout.CENTER);

		c = new GridBagConstraints();
		c.insets = new Insets(2, 2, 2, 2);
		c.anchor = GridBagConstraints.NORTHWEST;

		panelThumnail.setLayout(new GridBagLayout());

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

		cboWallpapersProv = UITools.createCombobox(MTGWallpaperProvider.class, false);

		selectedProvider = cboWallpapersProv.getItemAt(0);
		cboWallpapersProv
				.addActionListener(e -> selectedProvider = (MTGWallpaperProvider) cboWallpapersProv.getSelectedItem());

		panel.add(cboWallpapersProv);

		txtSearch = UITools.createSearchField();

		panel.add(txtSearch);
		txtSearch.setColumns(20);

		txtSearch.addActionListener(e ->{

			panelThumnail.removeAll();
			panelThumnail.revalidate();
			index = 0;
			c.weightx = 1;
			c.weighty = 1;
			c.gridx = 0;
			c.gridy = 0;
			lblLoad.start();

			SwingWorker<List<Wallpaper>, Wallpaper> sw = new SwingWorker<>() {

				@Override
				protected List<Wallpaper> doInBackground() throws Exception {
					return selectedProvider.search(txtSearch.getText()).stream().map(w -> {
						try {
							Wallpaper p= w.load();
							publish(p);
							return p;
						} catch (IOException e) {
							logger.error(e);
						}
						return w;
					}).collect(Collectors.toList());
				}

				@Override
				protected void process(List<Wallpaper> chunks) {
					for (Wallpaper w : chunks) {
						JWallThumb thumb = new JWallThumb(w);
						addComponent(thumb);

						thumb.addMouseListener(new MouseAdapter() {
							@Override
							public void mouseClicked(MouseEvent e) {
								thumb.selected(!thumb.isSelected());

							}
						});
				}
				}

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

			ThreadManager.getInstance().runInEdt(sw,"searching " + txtSearch.getText());

		});

		lblLoad = AbstractBuzyIndicatorComponent.createLabelComponent();
		panel.add(lblLoad);

		JPanel panel1 = new JPanel();
		add(panel1, BorderLayout.SOUTH);

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

		btnImport.addActionListener(ae -> {

			boolean error = false;
			for (Component comp : panelThumnail.getComponents()) {
				JWallThumb th = (JWallThumb) comp;

				if (th.isSelected()) {
					try {
						MTGControler.getInstance().saveWallpaper(th.getWallpaper());
						th.selected(false);
					} catch (IOException e1) {
						error = true;
						MTGControler.getInstance().notify(e1);
					}
				}
			}

			if (!error)
				MTGControler.getInstance().notify(new MTGNotification("OK", MTGControler.getInstance().getLangService().get("FINISHED"), MESSAGE_TYPE.INFO));

		});

	}

	public WallpaperGUI() {

		setLayout(new BorderLayout(0, 0));

		panelThumnail = new JPanel();
		add(new JScrollPane(panelThumnail), BorderLayout.CENTER);

		c = new GridBagConstraints();
		c.insets = new Insets(2, 2, 2, 2);
		c.anchor = GridBagConstraints.NORTHWEST;

		panelThumnail.setLayout(new GridBagLayout());

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

		cboWallpapersProv = UITools.createCombobox(MTGWallpaperProvider.class, false);

		selectedProvider = cboWallpapersProv.getItemAt(0);
		cboWallpapersProv
				.addActionListener(e -> selectedProvider = (MTGWallpaperProvider) cboWallpapersProv.getSelectedItem());

		panel.add(cboWallpapersProv);

		txtSearch = UITools.createSearchField();

		panel.add(txtSearch);
		txtSearch.setColumns(20);

		txtSearch.addActionListener(e ->{

			panelThumnail.removeAll();
			panelThumnail.revalidate();
			index = 0;
			c.weightx = 1;
			c.weighty = 1;
			c.gridx = 0;
			c.gridy = 0;
			lblLoad.start();

			SwingWorker<List<Wallpaper>, Wallpaper> sw = new SwingWorker<List<Wallpaper>, Wallpaper>() {

				@Override
				protected List<Wallpaper> doInBackground() throws Exception {
					return selectedProvider.search(txtSearch.getText()).stream().map(w -> {
						try {
							Wallpaper p= w.load();
							publish(p);
							return p;
						} catch (IOException e) {
							logger.error(e);
						}
						return w;
					}).collect(Collectors.toList());
				}

				@Override
				protected void process(List<Wallpaper> chunks) {
					for (Wallpaper w : chunks) {
						JWallThumb thumb = new JWallThumb(w);
						addComponent(thumb);

						thumb.addMouseListener(new MouseAdapter() {
							@Override
							public void mouseClicked(MouseEvent e) {
								thumb.selected(!thumb.isSelected());

							}
						});
				}
				}

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

			ThreadManager.getInstance().runInEdt(sw,"searching " + txtSearch.getText());

		});

		lblLoad = AbstractBuzyIndicatorComponent.createLabelComponent();
		panel.add(lblLoad);

		JPanel panel1 = new JPanel();
		add(panel1, BorderLayout.SOUTH);

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

		btnImport.addActionListener(ae -> {

			boolean error = false;
			for (Component comp : panelThumnail.getComponents()) {
				JWallThumb th = (JWallThumb) comp;

				if (th.isSelected()) {
					try {
						MTGControler.getInstance().saveWallpaper(th.getWallpaper());

					} catch (IOException e1) {
						error = true;
						MTGControler.getInstance().notify(e1);
					}
				}
			}

			if (!error)
				MTGControler.getInstance().notify(new MTGNotification("OK", MTGControler.getInstance().getLangService().get("FINISHED"), MESSAGE_TYPE.INFO));

		});

	}

Replace Generic With Diamond SwingWorker<List<Wallpaper>,Wallpaper> with SwingWorker<> in method public WallpaperGUI() from class org.magic.gui.WallpaperGUI


	public void init(MagicCard card,MagicEdition ed)
	{
		currentCard = card;
		currentEd=ed;

		if(currentCard==null && currentEd==null)
			return;

		if(ed==null)
			currentEd=card.getCurrentSet();

		if(isVisible()&&card!=null)
		{

			if(sw!=null && !sw.isDone())
			{
				sw.cancel(true);
				lblLoading.end();
			}

			List<MTGPricesProvider> providers = MTGControler.getInstance().listEnabled(MTGPricesProvider.class);
			lblLoading.start(providers.size());

			sw = new SwingWorker<>()
			{
				@Override
				protected List<MagicPrice> doInBackground() throws Exception {

					List<MagicPrice> list = new ArrayList<>();
					lblLoading.setText(MTGControler.getInstance().getLangService().getCapitalize("LOADING_PRICES") + " : " + currentCard + "("+currentEd+")" );
					for(MTGPricesProvider prov : MTGControler.getInstance().listEnabled(MTGPricesProvider.class))
					{
						try {

						List<MagicPrice> l = prov.getPrice(currentEd,currentCard);
						publish(l.toArray(new MagicPrice[l.size()]));
						list.addAll(l);
						}
						catch(Exception e)
						{
							logger.error("error with " + prov + ":" + e);
						}
					}
					return list;
				}

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

					model.addItems(chunks);
					lblLoading.progress();
				}

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

			};

			model.clear();
			ThreadManager.getInstance().runInEdt(sw,"loading prices");
		}

	}

	public void init(MagicCard card,MagicEdition ed)
	{
		currentCard = card;
		currentEd=ed;

		if(currentCard==null && currentEd==null)
			return;

		if(ed==null)
			currentEd=card.getCurrentSet();

		if(isVisible()&&card!=null)
		{

			if(sw!=null && !sw.isDone())
			{
				sw.cancel(true);
				lblLoading.end();
			}

			List<MTGPricesProvider> providers = MTGControler.getInstance().listEnabled(MTGPricesProvider.class);
			lblLoading.start(providers.size());

			sw = new SwingWorker<List<MagicPrice>, MagicPrice>()
			{
				@Override
				protected List<MagicPrice> doInBackground() throws Exception {
					model.clear();
					List<MagicPrice> list = new ArrayList<>();
					lblLoading.setText(MTGControler.getInstance().getLangService().getCapitalize("LOADING_PRICES") + " : " + currentCard + "("+currentEd+")" );
					for(MTGPricesProvider prov : MTGControler.getInstance().listEnabled(MTGPricesProvider.class))
					{
						try {

						List<MagicPrice> l = prov.getPrice(currentEd,currentCard);
						publish(l.toArray(new MagicPrice[l.size()]));
						list.addAll(l);
						}
						catch(Exception e)
						{
							logger.error("error with " + prov + ":" + e);
						}
					}
					return list;
				}

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

					model.addItems(chunks);
					lblLoading.progress();
				}

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

			};

			ThreadManager.getInstance().runInEdt(sw,"loading prices");
		}

	}

Replace Generic With Diamond SwingWorker<List<MagicPrice>,MagicPrice> with SwingWorker<> in method public init(card MagicCard, ed MagicEdition) : void from class org.magic.gui.components.PricesTablePanel


	private void initActions()
	{

		btnRefresh.addActionListener(e -> {

		progressBar.start();

		SwingWorker<Void, Void> sw = new SwingWorker<>()
		{
			@Override
			protected void process(List<Void> chunks) {
				progressBar.progress();
			}

			 protected Void doInBackground() {
					try {
						model.calculate();
					} catch (Exception ex) {
						logger.error(ex);
					}
				 return null;
			 }

			 @Override
			protected void done() {
				lblTotal.setText("Total : " + model.getCountDefaultLibrary() + "/" + model.getCountTotal());
				model.fireTableDataChanged();
				tree.refresh();
				progressBar.end();
			}
		};

		ThreadManager.getInstance().runInEdt(sw,"calculate collection");
		});

		btnExport.addActionListener(ae -> {
			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();
					it.setIcon(exp.getIcon());
					it.setText(exp.getName());
					it.addActionListener(al -> {

								DefaultMutableTreeNode curr = (DefaultMutableTreeNode) path.getLastPathComponent();
								JFileChooser jf = new JFileChooser();

								MagicCollection mc = null;
								MagicEdition ed = null;

								if (curr.getUserObject() instanceof MagicEdition) {
									ed = (MagicEdition) curr.getUserObject();
									mc = (MagicCollection) ((DefaultMutableTreeNode) curr.getParent()).getUserObject();
								} else {
									mc = (MagicCollection) curr.getUserObject();
								}

								jf.setSelectedFile(new File(mc.getName() + exp.getFileExtension()));
								int result = jf.showSaveDialog(null);
								File f = jf.getSelectedFile();

								if (result == JFileChooser.APPROVE_OPTION) {
									try {
										if (ed == null)
											listExport= dao.listCardsFromCollection(mc);
										else
											listExport= dao.listCardsFromCollection(mc, ed);

									AbstractObservableWorker<Void, MagicCard, MTGCardsExport> swExp = new AbstractObservableWorker<Void, MagicCard, MTGCardsExport>(progressBar,exp,listExport.size()){

										@Override
										protected Void doInBackground() throws Exception {
											plug.export(listExport, f);
											return null;
										}

										@Override
										protected void notifyEnd() {
											MTGControler.getInstance().notify(new MTGNotification(
													MTGControler.getInstance().getLangService().getCapitalize("FINISHED"),
													MTGControler.getInstance().getLangService().combine("EXPORT", "FINISHED"),
													MESSAGE_TYPE.INFO
													));
										}

										@Override
										protected void error(Exception e) {
											MTGControler.getInstance().notify(e);
										}
									};
									ThreadManager.getInstance().runInEdt(swExp,"export collection");

									}
									catch(Exception e)
									{
										MTGControler.getInstance().notify(e);
									}

								}

					});
					menu.add(it);
				}

			}

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

		});

		splitPane.addComponentListener(new ComponentAdapter() {

			@Override
			public void componentShown(ComponentEvent componentEvent) {
				splitPane.setDividerLocation(.5);
				removeComponentListener(this);
			}
		});

		tree.addTreeSelectionListener(tse -> {
			path = tse.getPath();
			btnRemove.setEnabled(true);
			btnAddAllSet.setEnabled(false);
			btnExport.setEnabled(true);
			final DefaultMutableTreeNode curr = (DefaultMutableTreeNode) path.getLastPathComponent();

			if (curr.getUserObject() instanceof String) {
				btnExport.setEnabled(false);
				statsPanel.enabledAdd(false);
			}

			if (curr.getUserObject() instanceof MagicCollection) {
				selectedcol = (MagicCollection) curr.getUserObject();
				statsPanel.enabledAdd(false);
				ThreadManager.getInstance().executeThread(() -> {
					try {

						List<MagicCard> list = dao.listCardsFromCollection(selectedcol);
						rarityRepartitionPanel.init(list);
						typeRepartitionPanel.init(list);
						manaRepartitionPanel.init(list);
						jsonPanel.show(curr.getUserObject());

					} catch (Exception e) {
						logger.error("error",e);
					}
				}, "Calculate Collection cards");

			}

			if (curr.getUserObject() instanceof MagicEdition) {
				magicEditionDetailPanel.setMagicEdition((MagicEdition) curr.getUserObject());
				packagePanel.setMagicEdition((MagicEdition) curr.getUserObject());
				statsPanel.enabledAdd(false);
				ThreadManager.getInstance().executeThread(() -> {
					try {

						MagicCollection collec = (MagicCollection) ((DefaultMutableTreeNode) curr.getParent()).getUserObject();
						List<MagicCard> list = dao.listCardsFromCollection(collec, (MagicEdition) curr.getUserObject());
						rarityRepartitionPanel.init(list);
						typeRepartitionPanel.init(list);
						manaRepartitionPanel.init(list);
						historyPricesPanel.init(null, (MagicEdition) curr.getUserObject(),curr.getUserObject().toString());
						jsonPanel.show(curr.getUserObject());

					} catch (Exception e) {
						logger.error("error refresh " + curr.getUserObject() +":"+e.getLocalizedMessage());
					}
				}, "Calculate Editions cards");
			}

			if (curr.getUserObject() instanceof MagicCard) {
				final MagicCard card = (MagicCard) ((DefaultMutableTreeNode) path.getLastPathComponent()).getUserObject();
				try {
					initCardSelectionGui(card,(MagicCollection) ((DefaultMutableTreeNode) curr.getParent().getParent()).getUserObject());
				}catch(Exception e)
				{
					logger.error("error updating " + card + " in " + curr.getParent() );
				}
			}
		});

		cardsSetPanel.getTable().getSelectionModel().addListSelectionListener(me-> {

			if(!me.getValueIsAdjusting() && cardsSetPanel.getSelectedCard()!=null) {
					cardsSetPanel.enabledImport(true);
					initCardSelectionGui(cardsSetPanel.getSelectedCard(),null);
			}
		});

		tree.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (SwingUtilities.isRightMouseButton(e)) {
					int row = tree.getClosestRowForLocation(e.getX(), e.getY());
					tree.setSelectionRow(row);

					final DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();

					if (node.getUserObject() instanceof MagicEdition) {
						popupMenuEdition.show(e.getComponent(), e.getX(), e.getY());

					}
					if (node.getUserObject() instanceof MagicCard) {
						popupMenuCards.show(e.getComponent(), e.getX(), e.getY());
					}
					if (node.getUserObject() instanceof MagicCollection) {
						JPopupMenu p = new JPopupMenu();
						JMenuItem it = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("MASS_MOVEMENTS"),MTGConstants.ICON_COLLECTION);

						p.add(it);

						it.addActionListener(ae -> {
							MassMoverDialog d = new MassMoverDialog((MagicCollection) node.getUserObject(), null);
							d.setVisible(true);
							if(d.hasChange())
								tree.refresh(node);

							logger.trace("closing mass import with change =" + d.hasChange());
						});
						p.show(e.getComponent(), e.getX(), e.getY());
					}

				}
			}
		});

		btnMassCollection.addActionListener(ae -> {
			MassCollectionImporterDialog diag = new MassCollectionImporterDialog();

			if(magicEditionDetailPanel.getMagicEdition().getId()!=null)
				diag.setDefaultEdition(magicEditionDetailPanel.getMagicEdition());

			diag.setVisible(true);
			try {
				model.calculate();
			} catch (Exception e) {
				logger.error(e);
			}
			model.fireTableDataChanged();
		});

		btnGenerateWebSite.addActionListener(ae -> ThreadManager.getInstance().invokeLater(() -> {
			try {

				WebSiteGeneratorDialog diag = new WebSiteGeneratorDialog(dao.listCollections());
				diag.setVisible(true);
				if (diag.value()) {
					int max = 0;
					for (MagicCollection col : diag.getSelectedCollections())
						max += dao.getCardsCount(col, null);

					progressBar.start(max);
					WebsiteExportWorker sw = new WebsiteExportWorker(diag.getTemplate(), diag.getDest(), diag.getSelectedCollections(), diag.getPriceProviders(), progressBar);
					ThreadManager.getInstance().runInEdt(sw,"website generation");
				}

			} catch (Exception e) {
				logger.error("error generating website", e);
				progressBar.end();
				MTGControler.getInstance().notify(e);
			}
		}));

	    btnAddAllSet.addActionListener(ae ->{
			JPopupMenu popupMenu = new JPopupMenu("Title");
			try {
					for(MagicCollection c : MTGControler.getInstance().getEnabled(MTGDao.class).listCollections())
					{
						JMenuItem cutMenuItem = new JMenuItem(c.getName(),MTGConstants.ICON_COLLECTION);
						initAddAllSet(cutMenuItem);
						popupMenu.add(cutMenuItem);
					}
				} catch (Exception e1) {
					logger.error(e1);
			}
			btnAddAllSet.setComponentPopupMenu(popupMenu);
	    	Component b=(Component)ae.getSource();
	    	Point p=b.getLocationOnScreen();
	    	popupMenu.show(this,0,0);
	    	popupMenu.setLocation(p.x,p.y+b.getHeight());
	    });

		tableEditions.getSelectionModel().addListSelectionListener(me-> {
			if(!me.getValueIsAdjusting()) {
		    	  try {
		    		 int row = tableEditions.getSelectedRow();
					MagicEdition ed = (MagicEdition) tableEditions.getValueAt(row, 1);
					magicEditionDetailPanel.setMagicEdition(ed);
					packagePanel.setMagicEdition(ed);
					historyPricesPanel.init(null, ed, ed.getSet());
					jsonPanel.show(ed);
					btnRemove.setEnabled(false);
					btnAddAllSet.setEnabled(true);
					btnExport.setEnabled(false);
					cardsSetPanel.init(ed);
					panneauTreeTable.setTitleAt(1, ed.getSet());
					panneauTreeTable.setSelectedIndex(1);
		    	  }
		    	  catch(Exception e)
		    	  {
		    		  progressBar.end();
		    	  }
			}
		});

		btnAdd.addActionListener(e -> {
			String name = JOptionPane
					.showInputDialog(MTGControler.getInstance().getLangService().getCapitalize("NAME") + " ?");
			MagicCollection collectionAdd = new MagicCollection(name);
			try {
				dao.saveCollection(collectionAdd);
				((LazyLoadingTree.MyNode) getJTree().getModel().getRoot()).add(new DefaultMutableTreeNode(collectionAdd));
				getJTree().refresh();
				initPopupCollection();
			} catch (Exception ex) {
				logger.error(ex);
				MTGControler.getInstance().notify(ex);
			}
		});

		btnRemove.addActionListener(evt -> {

			MagicCollection col = (MagicCollection) ((DefaultMutableTreeNode) path.getPathComponent(1)).getUserObject();
			int res = 0;

			DefaultMutableTreeNode curr = (DefaultMutableTreeNode) path.getLastPathComponent();
			if (curr.getUserObject() instanceof MagicCard) {
				MagicCard card = (MagicCard) ((DefaultMutableTreeNode) path.getLastPathComponent()).getUserObject();

				try {
					res = JOptionPane.showConfirmDialog(null, MTGControler.getInstance().getLangService().getCapitalize("CONFIRM_COLLECTION_ITEM_DELETE", card, col));
					if (res == JOptionPane.YES_OPTION) {
						MTGControler.getInstance().removeCard(card, col);
					}
				} catch (SQLException e) {
					MTGControler.getInstance().notify(e);
				}
			}
			if (curr.getUserObject() instanceof MagicEdition) {
				MagicEdition me = (MagicEdition) ((DefaultMutableTreeNode) path.getPathComponent(2)).getUserObject();

				try {
					res = JOptionPane.showConfirmDialog(null, MTGControler.getInstance().getLangService()
							.getCapitalize("CONFIRM_COLLECTION_ITEM_DELETE", me, col));
					if (res == JOptionPane.YES_OPTION) {
						dao.removeEdition(me, col);
					}
				} catch (SQLException e) {
					MTGControler.getInstance().notify(e);
				}
			}
			if (curr.getUserObject() instanceof MagicCollection) {
				try {
					res = JOptionPane.showConfirmDialog(null, MTGControler.getInstance().getLangService().getCapitalize("CONFIRM_COLLECTION_DELETE", col, dao.getCardsCount(col, null)));
					if (res == JOptionPane.YES_OPTION) {
						dao.removeCollection(col);
					}
				} catch (SQLException e) {
					MTGControler.getInstance().notify(e);
				}
			}

			if (res == JOptionPane.YES_OPTION) {
				try {
					tree.removeNodeFromParent(curr);
				} catch (Exception e) {
					MTGControler.getInstance().notify(e);
				}

			}
		});
	}

	private void initActions()
	{

		btnRefresh.addActionListener(e -> {

		progressBar.start();

		SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>()
		{
			@Override
			protected void process(List<Void> chunks) {
				progressBar.progress();
			}

			 protected Void doInBackground() {
					try {
						model.calculate();
					} catch (Exception ex) {
						logger.error(ex);
					}
				 return null;
			 }

			 @Override
			protected void done() {
				lblTotal.setText("Total : " + model.getCountDefaultLibrary() + "/" + model.getCountTotal());
				model.fireTableDataChanged();
				tree.refresh();
				progressBar.end();
			}
		};

		ThreadManager.getInstance().runInEdt(sw,"calculate collection");
		});

		btnExport.addActionListener(ae -> {
			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();
					it.setIcon(exp.getIcon());
					it.setText(exp.getName());
					it.addActionListener(al -> {

								DefaultMutableTreeNode curr = (DefaultMutableTreeNode) path.getLastPathComponent();
								JFileChooser jf = new JFileChooser();

								MagicCollection mc = null;
								MagicEdition ed = null;

								if (curr.getUserObject() instanceof MagicEdition) {
									ed = (MagicEdition) curr.getUserObject();
									mc = (MagicCollection) ((DefaultMutableTreeNode) curr.getParent()).getUserObject();
								} else {
									mc = (MagicCollection) curr.getUserObject();
								}

								jf.setSelectedFile(new File(mc.getName() + exp.getFileExtension()));
								int result = jf.showSaveDialog(null);
								File f = jf.getSelectedFile();

								if (result == JFileChooser.APPROVE_OPTION) {
									try {
										if (ed == null)
											listExport= dao.listCardsFromCollection(mc);
										else
											listExport= dao.listCardsFromCollection(mc, ed);

									AbstractObservableWorker<Void, MagicCard, MTGCardsExport> swExp = new AbstractObservableWorker<Void, MagicCard, MTGCardsExport>(progressBar,exp,listExport.size()){

										@Override
										protected Void doInBackground() throws Exception {
											plug.export(listExport, f);
											return null;
										}

										@Override
										protected void notifyEnd() {
											MTGControler.getInstance().notify(new MTGNotification(
													MTGControler.getInstance().getLangService().getCapitalize("FINISHED"),
													MTGControler.getInstance().getLangService().combine("EXPORT", "FINISHED"),
													MESSAGE_TYPE.INFO
													));
										}

										@Override
										protected void error(Exception e) {
											MTGControler.getInstance().notify(e);
										}
									};
									ThreadManager.getInstance().runInEdt(swExp,"export collection");

									}
									catch(Exception e)
									{
										MTGControler.getInstance().notify(e);
									}

								}

					});
					menu.add(it);
				}

			}

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

		});

		splitPane.addComponentListener(new ComponentAdapter() {

			@Override
			public void componentShown(ComponentEvent componentEvent) {
				splitPane.setDividerLocation(.5);
				removeComponentListener(this);
			}
		});

		tree.addTreeSelectionListener(tse -> {
			path = tse.getPath();
			btnRemove.setEnabled(true);
			btnAddAllSet.setEnabled(false);
			btnExport.setEnabled(true);
			final DefaultMutableTreeNode curr = (DefaultMutableTreeNode) path.getLastPathComponent();

			if (curr.getUserObject() instanceof String) {
				btnExport.setEnabled(false);
				statsPanel.enabledAdd(false);
			}

			if (curr.getUserObject() instanceof MagicCollection) {
				selectedcol = (MagicCollection) curr.getUserObject();
				statsPanel.enabledAdd(false);
				ThreadManager.getInstance().executeThread(() -> {
					try {

						List<MagicCard> list = dao.listCardsFromCollection(selectedcol);
						rarityRepartitionPanel.init(list);
						typeRepartitionPanel.init(list);
						manaRepartitionPanel.init(list);
						jsonPanel.show(curr.getUserObject());

					} catch (Exception e) {
						logger.error("error",e);
					}
				}, "Calculate Collection cards");

			}

			if (curr.getUserObject() instanceof MagicEdition) {
				magicEditionDetailPanel.setMagicEdition((MagicEdition) curr.getUserObject());
				packagePanel.setMagicEdition((MagicEdition) curr.getUserObject());
				statsPanel.enabledAdd(false);
				ThreadManager.getInstance().executeThread(() -> {
					try {

						MagicCollection collec = (MagicCollection) ((DefaultMutableTreeNode) curr.getParent()).getUserObject();
						List<MagicCard> list = dao.listCardsFromCollection(collec, (MagicEdition) curr.getUserObject());
						rarityRepartitionPanel.init(list);
						typeRepartitionPanel.init(list);
						manaRepartitionPanel.init(list);
						historyPricesPanel.init(null, (MagicEdition) curr.getUserObject(),curr.getUserObject().toString());
						jsonPanel.show(curr.getUserObject());

					} catch (Exception e) {
						logger.error("error refresh " + curr.getUserObject() +":"+e.getLocalizedMessage());
					}
				}, "Calculate Editions cards");
			}

			if (curr.getUserObject() instanceof MagicCard) {
				final MagicCard card = (MagicCard) ((DefaultMutableTreeNode) path.getLastPathComponent()).getUserObject();
				try {
					initCardSelectionGui(card,(MagicCollection) ((DefaultMutableTreeNode) curr.getParent().getParent()).getUserObject());
				}catch(Exception e)
				{
					logger.error("error updating " + card + " in " + curr.getParent() );
				}
			}
		});

		cardsSetPanel.getTable().getSelectionModel().addListSelectionListener(me-> {

			if(!me.getValueIsAdjusting() && cardsSetPanel.getSelectedCard()!=null) {
					cardsSetPanel.enabledImport(true);
					initCardSelectionGui(cardsSetPanel.getSelectedCard(),null);
			}
		});

		tree.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (SwingUtilities.isRightMouseButton(e)) {
					int row = tree.getClosestRowForLocation(e.getX(), e.getY());
					tree.setSelectionRow(row);

					final DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();

					if (node.getUserObject() instanceof MagicEdition) {
						popupMenuEdition.show(e.getComponent(), e.getX(), e.getY());

					}
					if (node.getUserObject() instanceof MagicCard) {
						popupMenuCards.show(e.getComponent(), e.getX(), e.getY());
					}
					if (node.getUserObject() instanceof MagicCollection) {
						JPopupMenu p = new JPopupMenu();
						JMenuItem it = new JMenuItem(MTGControler.getInstance().getLangService().getCapitalize("MASS_MOVEMENTS"),MTGConstants.ICON_COLLECTION);

						p.add(it);

						it.addActionListener(ae -> {
							MassMoverDialog d = new MassMoverDialog((MagicCollection) node.getUserObject(), null);
							d.setVisible(true);
							if(d.hasChange())
								tree.refresh(node);

							logger.trace("closing mass import with change =" + d.hasChange());
						});
						p.show(e.getComponent(), e.getX(), e.getY());
					}

				}
			}
		});

		btnMassCollection.addActionListener(ae -> {
			MassCollectionImporterDialog diag = new MassCollectionImporterDialog();

			if(magicEditionDetailPanel.getMagicEdition().getId()!=null)
				diag.setDefaultEdition(magicEditionDetailPanel.getMagicEdition());

			diag.setVisible(true);
			try {
				model.calculate();
			} catch (Exception e) {
				logger.error(e);
			}
			model.fireTableDataChanged();
		});

		btnGenerateWebSite.addActionListener(ae -> ThreadManager.getInstance().invokeLater(() -> {
			try {

				WebSiteGeneratorDialog diag = new WebSiteGeneratorDialog(dao.listCollections());
				diag.setVisible(true);
				if (diag.value()) {
					int max = 0;
					for (MagicCollection col : diag.getSelectedCollections())
						max += dao.getCardsCount(col, null);

					progressBar.start(max);
					WebsiteExportWorker sw = new WebsiteExportWorker(diag.getTemplate(), diag.getDest(), diag.getSelectedCollections(), diag.getPriceProviders(), progressBar);
					ThreadManager.getInstance().runInEdt(sw,"website generation");
				}

			} catch (Exception e) {
				logger.error("error generating website", e);
				progressBar.end();
				MTGControler.getInstance().notify(e);
			}
		}));

	    btnAddAllSet.addActionListener(ae ->{
			JPopupMenu popupMenu = new JPopupMenu("Title");
			try {
					for(MagicCollection c : MTGControler.getInstance().getEnabled(MTGDao.class).listCollections())
					{
						JMenuItem cutMenuItem = new JMenuItem(c.getName(),MTGConstants.ICON_COLLECTION);
						initAddAllSet(cutMenuItem);
						popupMenu.add(cutMenuItem);
					}
				} catch (Exception e1) {
					logger.error(e1);
			}
			btnAddAllSet.setComponentPopupMenu(popupMenu);
	    	Component b=(Component)ae.getSource();
	    	Point p=b.getLocationOnScreen();
	    	popupMenu.show(this,0,0);
	    	popupMenu.setLocation(p.x,p.y+b.getHeight());
	    });

		tableEditions.getSelectionModel().addListSelectionListener(me-> {
			if(!me.getValueIsAdjusting()) {
		    	  try {
		    		 int row = tableEditions.getSelectedRow();
					MagicEdition ed = (MagicEdition) tableEditions.getValueAt(row, 1);
					magicEditionDetailPanel.setMagicEdition(ed);
					packagePanel.setMagicEdition(ed);
					historyPricesPanel.init(null, ed, ed.getSet());
					jsonPanel.show(ed);
					btnRemove.setEnabled(false);
					btnAddAllSet.setEnabled(true);
					btnExport.setEnabled(false);
					cardsSetPanel.init(ed);
					panneauTreeTable.setTitleAt(1, ed.getSet());
					panneauTreeTable.setSelectedIndex(1);
		    	  }
		    	  catch(Exception e)
		    	  {
		    		  progressBar.end();
		    	  }
			}
		});

		btnAdd.addActionListener(e -> {
			String name = JOptionPane
					.showInputDialog(MTGControler.getInstance().getLangService().getCapitalize("NAME") + " ?");
			MagicCollection collectionAdd = new MagicCollection(name);
			try {
				dao.saveCollection(collectionAdd);
				((LazyLoadingTree.MyNode) getJTree().getModel().getRoot()).add(new DefaultMutableTreeNode(collectionAdd));
				getJTree().refresh();
				initPopupCollection();
			} catch (Exception ex) {
				logger.error(ex);
				MTGControler.getInstance().notify(ex);
			}
		});

		btnRemove.addActionListener(evt -> {

			MagicCollection col = (MagicCollection) ((DefaultMutableTreeNode) path.getPathComponent(1)).getUserObject();
			int res = 0;

			DefaultMutableTreeNode curr = (DefaultMutableTreeNode) path.getLastPathComponent();
			if (curr.getUserObject() instanceof MagicCard) {
				MagicCard card = (MagicCard) ((DefaultMutableTreeNode) path.getLastPathComponent()).getUserObject();

				try {
					res = JOptionPane.showConfirmDialog(null, MTGControler.getInstance().getLangService().getCapitalize("CONFIRM_COLLECTION_ITEM_DELETE", card, col));
					if (res == JOptionPane.YES_OPTION) {
						MTGControler.getInstance().removeCard(card, col);
					}
				} catch (SQLException e) {
					MTGControler.getInstance().notify(e);
				}
			}
			if (curr.getUserObject() instanceof MagicEdition) {
				MagicEdition me = (MagicEdition) ((DefaultMutableTreeNode) path.getPathComponent(2)).getUserObject();

				try {
					res = JOptionPane.showConfirmDialog(null, MTGControler.getInstance().getLangService()
							.getCapitalize("CONFIRM_COLLECTION_ITEM_DELETE", me, col));
					if (res == JOptionPane.YES_OPTION) {
						dao.removeEdition(me, col);
					}
				} catch (SQLException e) {
					MTGControler.getInstance().notify(e);
				}
			}
			if (curr.getUserObject() instanceof MagicCollection) {
				try {
					res = JOptionPane.showConfirmDialog(null, MTGControler.getInstance().getLangService().getCapitalize("CONFIRM_COLLECTION_DELETE", col, dao.getCardsCount(col, null)));
					if (res == JOptionPane.YES_OPTION) {
						dao.removeCollection(col);
					}
				} catch (SQLException e) {
					MTGControler.getInstance().notify(e);
				}
			}

			if (res == JOptionPane.YES_OPTION) {
				try {
					tree.removeNodeFromParent(curr);
				} catch (Exception e) {
					MTGControler.getInstance().notify(e);
				}

			}
		});
	}

Replace Generic With Diamond SwingWorker<Void,Void> with SwingWorker<> in method private initActions() : void from class org.magic.gui.CollectionPanelGUI


	@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(shakes.isEmpty())
						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("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.setModel(modStandard);
					modStandard.fireTableDataChanged();
					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<List<CardShake>, Void>()
		{

			@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(shakes.isEmpty())
						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("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.setModel(modStandard);
					modStandard.fireTableDataChanged();
					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");
	}

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