package op.settings.subpanels; import com.jgoodies.forms.factories.CC; import com.jgoodies.forms.layout.FormLayout; import com.jidesoft.popup.JidePopup; import com.jidesoft.swing.JideButton; import entity.EntityTools; import entity.system.Commontags; import entity.system.CommontagsTools; import gui.GUITools; import gui.PnlBeanEditor; import gui.PnlYesNo; import gui.events.ContentRequestedEventListener; import gui.events.DataChangeEvent; import gui.events.DataChangeListener; import gui.events.JPADataChangeListener; import gui.interfaces.DefaultCollapsiblePane; import gui.interfaces.DefaultCollapsiblePanes; import gui.interfaces.DefaultPanel; import op.OPDE; import op.threads.DisplayMessage; import op.tools.SYSConst; import op.tools.SYSTools; import org.apache.commons.collections.CollectionUtils; import org.apache.log4j.Logger; import org.jdesktop.swingx.VerticalLayout; import javax.swing.*; import java.awt.*; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Random; /** * Created by tloehr on 03.07.15. */ public class PnlCommonTags extends DefaultPanel { private HashMap<Commontags, DefaultCollapsiblePane> cpMap; private Logger logger = Logger.getLogger(this.getClass()); private JScrollPane scrollPane1; private DefaultCollapsiblePanes cpsMain; private int i = 0; // just for the progressbar public PnlCommonTags() { super("opde.settings.commontags"); mainPanel.setLayout(new FormLayout( "default, $lcgap, default:grow, $lcgap, default", "default, $lgap, default:grow, $lgap, default")); cpsMain = new DefaultCollapsiblePanes(); scrollPane1 = new JScrollPane(); scrollPane1.setViewportView(cpsMain); mainPanel.add(scrollPane1, CC.xy(3, 3, CC.FILL, CC.FILL)); cpMap = new HashMap<>(); loadAllData(); } @Override public void reload() { super.reload(); OPDE.getMainframe().setBlocked(true); OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), -1, cpMap.size())); SwingWorker worker = new SwingWorker() { @Override protected Object doInBackground() throws Exception { i = -1; CollectionUtils.forAllDo(cpMap.values(), o -> { try { OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), i, cpMap.size())); i++; ((DefaultCollapsiblePane) o).reload(); } catch (Exception e) { OPDE.fatal(logger, e); } }); return null; } @Override protected void done() { OPDE.getDisplayManager().setProgressBarMessage(null); OPDE.getMainframe().setBlocked(false); } }; worker.execute(); } @Override public void cleanup() { super.cleanup(); cpMap.clear(); cpsMain.removeAll(); } private void loadAllData() { cpsMain.removeAll(); cpsMain.add(createAddButton()); OPDE.getMainframe().setBlocked(true); OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), 0, -1)); SwingWorker worker = new SwingWorker() { @Override protected Object doInBackground() throws Exception { i = 0; for (final Commontags tag : CommontagsTools.getAll()) { try { cpsMain.add(createCP(tag)); } catch (Exception e) { OPDE.fatal(logger, e); } } cpsMain.addExpansion(); return null; } @Override protected void done() { OPDE.getDisplayManager().setProgressBarMessage(null); OPDE.getMainframe().setBlocked(false); } }; worker.execute(); } private DefaultCollapsiblePane createCP(final Commontags tag) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { ContentRequestedEventListener<DefaultCollapsiblePane> headerUpdate = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); Commontags myTag = EntityTools.find(Commontags.class, tag.getId()); dcp.setTitleButtonText(myTag.getText()); dcp.getTitleButton().setForeground(GUITools.blend(myTag.getColor(), Color.BLACK, 0.85f)); dcp.setBackground(GUITools.blend(myTag.getColor(), Color.WHITE, 0.05f)); dcp.getTitleButton().setFont(SYSConst.ARIAL24); }; ContentRequestedEventListener<DefaultCollapsiblePane> contentUpdate = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); try { PnlBeanEditor<Commontags> pnlBeanEditor = new PnlBeanEditor<>(() -> EntityTools.find(Commontags.class, tag.getId()), Commontags.class, PnlBeanEditor.SAVE_MODE_IMMEDIATE); pnlBeanEditor.addDataChangeListener(new JPADataChangeListener<>((DataChangeListener<Commontags>) evt -> { if (evt.isTriggersReload()) { reload(); } else { pnlBeanEditor.reload(evt.getData()); ((DefaultCollapsiblePane<Commontags>) cre.getSource()).dataChanged(new DataChangeEvent<>(pnlBeanEditor, evt.getData())); } })); pnlBeanEditor.setEnabled(tag.getType() == CommontagsTools.TYPE_SYS_USER); dcp.setContentPane(pnlBeanEditor); } catch (Exception e) { OPDE.fatal(logger, e); } }; DefaultCollapsiblePane<Commontags> cp = new DefaultCollapsiblePane(headerUpdate, contentUpdate, getMenu(tag)); cpMap.put(tag, cp); return cp; } private JideButton createAddButton() { final JideButton btnAdd = GUITools.createHyperlinkButton("opde.settings.btnNewCommontags", SYSConst.icon22add, null); btnAdd.addActionListener(e -> { Random rand = new Random(); // nextInt is normally exclusive of the top value, // so add 1 to make it inclusive int randomNum = rand.nextInt((10000 - 1) + 1) + 1; Commontags newTag = EntityTools.merge(new Commontags("new:" + randomNum)); if (newTag != null) { try { cpsMain.removeExpansion(); cpsMain.add(createCP(newTag)); cpsMain.addExpansion(); cpsMain.validate(); GUITools.scroll2show(scrollPane1, cpMap.get(newTag), cpsMain, o -> GUITools.flashBackground(cpMap.get(newTag), Color.YELLOW, 2)); } catch (Exception exc) { OPDE.fatal(logger, exc); } } }); return btnAdd; } private JPanel getMenu(final Commontags tag) { final JPanel pnlMenu = new JPanel(new VerticalLayout()); final JButton btnDelete = GUITools.createHyperlinkButton("opde.settings.btnDelCommontags", SYSConst.icon22delete, null); pnlMenu.add(btnDelete); btnDelete.addActionListener(e -> { Container c = pnlMenu.getParent(); ((JidePopup) c.getParent().getParent().getParent()).hidePopup(); String message = EntityTools.mayBeDeleted(EntityTools.find(Commontags.class, tag.getId())); if (message != null) { OPDE.getDisplayManager().addSubMessage(new DisplayMessage(message, DisplayMessage.WARNING)); return; } ask(new PnlYesNo(SYSTools.xx("misc.questions.delete1") + "<br/><br/>»" + tag.getText() + " (#" + tag.getId() + ")" + "«<br/>" + "<br/>" + SYSTools.xx("misc.questions.delete2"), "opde.settings.btnDelCommontags", SYSConst.icon48delete, o -> { if (o.equals(JOptionPane.YES_OPTION)) { EntityTools.delete(EntityTools.find(Commontags.class, tag.getId())); cpsMain.remove(cpMap.get(tag)); cpMap.remove(tag); } mainView(); })); }); btnDelete.setEnabled(tag.getType() == CommontagsTools.TYPE_SYS_USER); return pnlMenu; } }