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.info.ResInfoCategory; import entity.info.ResInfoCategoryTools; 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; /** * Created by tloehr on 30.06.15. */ public class PnlModelEditor extends DefaultPanel { private HashMap<ResInfoCategory, DefaultCollapsiblePane> cpMap; private Logger logger = Logger.getLogger(this.getClass()); private JScrollPane scrollPane1; private DefaultCollapsiblePanes cpsMain; private int i = 0; // just for the progressbar public PnlModelEditor() { super("opde.settings.model"); 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 ResInfoCategory cat : ResInfoCategoryTools.getAll()) { try { cpsMain.add(createCP(cat)); } 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 ResInfoCategory cat) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { ContentRequestedEventListener<DefaultCollapsiblePane> headerUpdate = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); ResInfoCategory myCat = EntityTools.find(ResInfoCategory.class, cat.getID()); dcp.setTitleButtonText(myCat.getText()); dcp.getTitleButton().setForeground(GUITools.blend(myCat.getColor(), Color.BLACK, 0.85f)); dcp.setBackground(GUITools.blend(myCat.getColor(), Color.WHITE, 0.05f)); dcp.getTitleButton().setFont(SYSConst.ARIAL24); }; ContentRequestedEventListener<DefaultCollapsiblePane> contentUpdate = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); try { PnlBeanEditor<ResInfoCategory> pnlBeanEditor = new PnlBeanEditor<>(() -> EntityTools.find(ResInfoCategory.class, cat.getID()), ResInfoCategory.class, PnlBeanEditor.SAVE_MODE_IMMEDIATE); pnlBeanEditor.addDataChangeListener(new JPADataChangeListener<>((DataChangeListener<ResInfoCategory>) evt -> { if (evt.isTriggersReload()) { reload(); } else { pnlBeanEditor.reload(evt.getData()); ((DefaultCollapsiblePane<ResInfoCategory>) cre.getSource()).dataChanged(new DataChangeEvent<>(pnlBeanEditor, evt.getData())); } })); dcp.setContentPane(pnlBeanEditor); } catch (Exception e) { OPDE.fatal(logger, e); } }; DefaultCollapsiblePane<ResInfoCategory> cp = new DefaultCollapsiblePane(headerUpdate, contentUpdate, getMenu(cat)); cpMap.put(cat, cp); return cp; } private JideButton createAddButton() { final JideButton btnAdd = GUITools.createHyperlinkButton("opde.settings.model.btnAddCategory", SYSConst.icon22add, null); btnAdd.addActionListener(e -> { ResInfoCategory newCat = EntityTools.merge(new ResInfoCategory(ResInfoCategoryTools.BASICS)); if (newCat != null) { try { cpsMain.removeExpansion(); cpsMain.add(createCP(newCat)); cpsMain.addExpansion(); } catch (Exception exc) { OPDE.fatal(logger, exc); } } }); return btnAdd; } private JPanel getMenu(final ResInfoCategory cat) { final JPanel pnlMenu = new JPanel(new VerticalLayout()); final JButton btnDelete = GUITools.createHyperlinkButton("opde.settings.model.btnDelCategory", SYSConst.icon22delete, null); pnlMenu.add(btnDelete); btnDelete.addActionListener(e -> { Container c = pnlMenu.getParent(); ((JidePopup) c.getParent().getParent().getParent()).hidePopup(); // if (!OPDE.isAdmin()) return; String message = EntityTools.mayBeDeleted(EntityTools.find(ResInfoCategory.class, cat.getID())); if (message != null) { OPDE.getDisplayManager().addSubMessage(new DisplayMessage(message, DisplayMessage.WARNING)); return; } ask(new PnlYesNo(SYSTools.xx("misc.questions.delete1") + "<br/><br/>»" + cat.getText() + " (#" + cat.getID() + ")" + "«<br/>" + "<br/>" + SYSTools.xx("misc.questions.delete2"), "opde.settings.home.btnDelHome", SYSConst.icon48delete, o -> { if (o.equals(JOptionPane.YES_OPTION)) { EntityTools.delete(EntityTools.find(ResInfoCategory.class, cat.getID())); cpsMain.remove(cpMap.get(cat)); cpMap.remove(cat); } mainView(); })); }); return pnlMenu; } }