/* * Created by JFormDesigner on Thu Apr 30 14:43:18 CEST 2015 */ package op.settings.subpanels; import com.jgoodies.forms.factories.CC; import com.jgoodies.forms.layout.FormLayout; import com.jidesoft.pane.CollapsiblePanes; import com.jidesoft.popup.JidePopup; import com.jidesoft.swing.JideButton; import entity.EntityTools; import entity.building.*; 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.persistence.EntityManager; import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; import java.awt.*; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.UUID; /** * @author Torsten Löhr */ public class PnlHomeStationRoomEditor extends DefaultPanel { private HashMap<String, DefaultCollapsiblePane> cpMap; private HashMap<String, DefaultCollapsiblePanes> parentCPS; private Logger logger = Logger.getLogger(this.getClass()); private JScrollPane scrollPane1; private DefaultCollapsiblePanes cpsHomes; private int i = 0; // just for the progressbar public PnlHomeStationRoomEditor() { super("opde.settings.homes"); mainPanel.setLayout(new FormLayout( "default, $lcgap, default:grow, $lcgap, default", "default, $lgap, default:grow, $lgap, default")); cpsHomes = new DefaultCollapsiblePanes(); scrollPane1 = new JScrollPane(); scrollPane1.setViewportView(cpsHomes); mainPanel.add(scrollPane1, CC.xy(3, 3, CC.FILL, CC.FILL)); cpMap = new HashMap<>(); parentCPS = 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(); Iterator it = parentCPS.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, CollapsiblePanes> pair = (Map.Entry) it.next(); pair.getValue().removeAll(); } cpMap.clear(); parentCPS.clear(); cpsHomes.removeAll(); } private void loadAllData() { cpsHomes.removeAll(); cpsHomes.add(createAddHomeButton()); 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 Homes home : HomesTools.getAll()) { try { cpsHomes.add(createCP(home)); } catch (Exception e) { OPDE.fatal(logger, e); } } cpsHomes.addExpansion(); return null; } @Override protected void done() { OPDE.getDisplayManager().setProgressBarMessage(null); OPDE.getMainframe().setBlocked(false); } }; worker.execute(); } private DefaultCollapsiblePane createCP(final Homes home) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { ContentRequestedEventListener<DefaultCollapsiblePane> headerUpdate = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); Homes myHome = EntityTools.find(Homes.class, home.getEid()); dcp.setTitleButtonText(myHome.getName()); dcp.getTitleButton().setForeground(GUITools.blend(myHome.getColor(), Color.BLACK, 0.85f)); dcp.setBackground(GUITools.blend(myHome.getColor(), Color.WHITE, 0.05f)); dcp.getTitleButton().setFont(SYSConst.ARIAL24); }; ContentRequestedEventListener<DefaultCollapsiblePane> contentUpdate = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); Homes myHome = EntityTools.find(Homes.class, home.getEid()); dcp.setContentPane(createContent(myHome, (DefaultCollapsiblePane<Homes>) cre.getSource())); }; DefaultCollapsiblePane<Homes> cp = new DefaultCollapsiblePane(headerUpdate, contentUpdate, getMenu(home)); cp.setName(getKey(home)); cpMap.put(cp.getName(), cp); return cp; } private DefaultCollapsiblePanes createContent(final Homes home, DataChangeListener<Homes> dcl) { DefaultCollapsiblePanes dcps = new DefaultCollapsiblePanes(); dcps.setBackground(GUITools.blend(home.getColor(), Color.WHITE, 0.08f)); try { PnlBeanEditor<Homes> pnlBeanEditor = new PnlBeanEditor<>(() -> EntityTools.find(Homes.class, home.getEid()), Homes.class, PnlBeanEditor.SAVE_MODE_IMMEDIATE); pnlBeanEditor.addDataChangeListener(new JPADataChangeListener<>((DataChangeListener<Homes>) evt -> { if (evt.isTriggersReload()) { reload(); } else { pnlBeanEditor.reload(evt.getData()); dcl.dataChanged(new DataChangeEvent<>(pnlBeanEditor, evt.getData())); } })); // pnlBeanEditor.setOpaque(false); // pnlBeanEditor.setBackground(GUITools.blend(home.getColor(), Color.WHITE, 0.25f)); dcps.add(pnlBeanEditor); ContentRequestedEventListener<DefaultCollapsiblePane> headerUpdate1 = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); dcp.setTitleButtonText("misc.msg.floor"); Homes myHome = EntityTools.find(Homes.class, home.getEid()); dcp.getTitleButton().setForeground(GUITools.blend(myHome.getColor(), Color.BLACK, 0.85f)); dcp.setBackground(GUITools.blend(myHome.getColor(), Color.WHITE, 0.12f)); dcp.getTitleButton().setFont(SYSConst.ARIAL20); }; ContentRequestedEventListener<DefaultCollapsiblePane> contentUpdate1 = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); Homes myHome = EntityTools.find(Homes.class, home.getEid()); DefaultCollapsiblePanes dcps1 = new DefaultCollapsiblePanes(); dcps1.setBackground(GUITools.blend(myHome.getColor(), Color.WHITE, 0.15f)); parentCPS.put(getKey(home) + ":floors", dcps1); dcps1.add(createAddFloorButton(home)); for (final Floors floor : myHome.getFloors()) { dcps1.add(createCP(floor)); parentCPS.put(getKey(floor), dcps1); } dcps1.addExpansion(); dcp.setContentPane(dcps1); }; dcps.add(new DefaultCollapsiblePane<>(headerUpdate1, contentUpdate1)); ContentRequestedEventListener<DefaultCollapsiblePane> headerUpdate2 = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); dcp.setTitleButtonText("misc.msg.station"); Homes myHome = EntityTools.find(Homes.class, home.getEid()); dcp.getTitleButton().setForeground(GUITools.blend(myHome.getColor(), Color.BLACK, 0.85f)); dcp.setBackground(GUITools.blend(myHome.getColor(), Color.WHITE, 0.12f)); dcp.getTitleButton().setFont(SYSConst.ARIAL20); }; ContentRequestedEventListener<DefaultCollapsiblePane> contentUpdate2 = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); Homes myHome = EntityTools.find(Homes.class, home.getEid()); DefaultCollapsiblePanes dcps1 = new DefaultCollapsiblePanes(); dcps1.setBackground(GUITools.blend(myHome.getColor(), Color.WHITE, 0.15f)); parentCPS.put(getKey(home) + ":station", dcps1); dcps1.add(createAddStationButton(home)); for (final Station station : myHome.getStations()) { dcps1.add(createCP(station)); parentCPS.put(getKey(station), dcps1); } dcps1.addExpansion(); dcp.setContentPane(dcps1); }; dcps.add(new DefaultCollapsiblePane<>(headerUpdate2, contentUpdate2)); dcps.addExpansion(); } catch (Exception e) { OPDE.fatal(logger, e); } return dcps; } private DefaultCollapsiblePane createCP(final Floors floor) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { ContentRequestedEventListener<DefaultCollapsiblePane> headerUpdate = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); Floors myFloor = EntityTools.find(Floors.class, floor.getFloorid()); dcp.setTitleButtonText(myFloor.getName()); dcp.getTitleButton().setForeground(GUITools.blend(floor.getHome().getColor(), Color.BLACK, 0.85f)); dcp.setBackground(GUITools.blend(floor.getHome().getColor(), Color.WHITE, 0.18f)); }; ContentRequestedEventListener<DefaultCollapsiblePane> contentUpdate = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); Floors myFloor = EntityTools.find(Floors.class, floor.getFloorid()); dcp.setContentPane(createContent(myFloor, (DefaultCollapsiblePane<Floors>) cre.getSource())); }; DefaultCollapsiblePane<Floors> cp = new DefaultCollapsiblePane(headerUpdate, contentUpdate, getMenu(floor)); cp.setName(getKey(floor)); cpMap.put(cp.getName(), cp); return cp; } private DefaultCollapsiblePanes createContent(final Floors floor, DefaultCollapsiblePane<Floors> dcl) { DefaultCollapsiblePanes dcps = new DefaultCollapsiblePanes(); dcps.setBackground(GUITools.blend(floor.getHome().getColor(), Color.WHITE, 0.2f)); try { PnlBeanEditor<Floors> pbe = new PnlBeanEditor<>(() -> EntityTools.find(Floors.class, floor.getFloorid()), Floors.class, PnlBeanEditor.SAVE_MODE_IMMEDIATE); pbe.addDataChangeListener(new JPADataChangeListener<Floors>(evt -> { pbe.reload(evt.getData()); dcl.dataChanged(new DataChangeEvent<>(pbe, evt.getData())); })); pbe.setOpaque(true); pbe.setBackground(GUITools.blend(floor.getHome().getColor(), Color.WHITE, 0.23f)); dcps.add(pbe); ContentRequestedEventListener<DefaultCollapsiblePane> headerUpdate = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); dcp.setTitleButtonText("misc.msg.room"); dcp.getTitleButton().setForeground(GUITools.blend(floor.getHome().getColor(), Color.BLACK, 0.85f)); dcp.setBackground(GUITools.blend(floor.getHome().getColor(), Color.WHITE, 0.26f)); dcp.getTitleButton().setFont(dcp.getTitleButton().getFont().deriveFont(Font.BOLD)); }; ContentRequestedEventListener<DefaultCollapsiblePane> contentUpdate = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); Floors myFloor = EntityTools.find(Floors.class, floor.getFloorid()); DefaultCollapsiblePanes dcps1 = new DefaultCollapsiblePanes(); dcps1.setBackground(GUITools.blend(myFloor.getHome().getColor(), Color.WHITE, 0.29f)); parentCPS.put("rooms4:" + getKey(floor), dcps1); dcps1.add(createAddRoomButton(floor)); for (final Rooms room : myFloor.getRooms()) { dcps1.add(createCP(room)); // #27 parentCPS.put(getKey(room), dcps1); } dcps1.addExpansion(); dcp.setContentPane(dcps1); }; dcps.add(new DefaultCollapsiblePane<Floors>(headerUpdate, contentUpdate)); dcps.addExpansion(); } catch (Exception e) { OPDE.fatal(logger, e); } return dcps; } private DefaultCollapsiblePane createCP(final Rooms room) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { ContentRequestedEventListener<DefaultCollapsiblePane> headerUpdate = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); Rooms myRoom = EntityTools.find(Rooms.class, room.getRoomID()); dcp.setTitleButtonText(myRoom.getText()); dcp.getTitleButton().setForeground(GUITools.blend(room.getFloor().getHome().getColor(), Color.BLACK, 0.85f)); dcp.setBackground(GUITools.blend(room.getFloor().getHome().getColor(), Color.WHITE, 0.29f)); }; ContentRequestedEventListener<DefaultCollapsiblePane> contentUpdate = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); Rooms myRoom = EntityTools.find(Rooms.class, room.getRoomID()); dcp.setContentPane(createContent(myRoom, (DefaultCollapsiblePane<Rooms>) cre.getSource())); }; DefaultCollapsiblePane<Homes> cp = new DefaultCollapsiblePane(headerUpdate, contentUpdate, getMenu(room)); cp.setName(getKey(room)); cpMap.put(cp.getName(), cp); return cp; } private JPanel createContent(final Rooms room, DefaultCollapsiblePane<Rooms> dcl) { JPanel result = null; try { PnlBeanEditor<Rooms> pbe = new PnlBeanEditor<>(() -> EntityTools.find(Rooms.class, room.getRoomID()), Rooms.class, PnlBeanEditor.SAVE_MODE_IMMEDIATE); pbe.setOpaque(true); pbe.setBackground(GUITools.blend(room.getFloor().getHome().getColor(), Color.WHITE, 0.33f)); pbe.addDataChangeListener(new JPADataChangeListener<>(evt -> { pbe.reload(evt.getData()); dcl.dataChanged(new DataChangeEvent<>(pbe, evt.getData())); })); result = pbe; } catch (Exception e) { OPDE.fatal(logger, e); } return result; } private DefaultCollapsiblePane createCP(final Station station) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { ContentRequestedEventListener<DefaultCollapsiblePane> headerUpdate = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); Station myStation = EntityTools.find(Station.class, station.getStatID()); dcp.getTitleButton().setForeground(GUITools.blend(station.getHome().getColor(), Color.BLACK, 0.85f)); dcp.setBackground(GUITools.blend(myStation.getHome().getColor(), Color.WHITE, 0.2f)); dcp.setTitleButtonText(myStation.getName()); }; ContentRequestedEventListener<DefaultCollapsiblePane> contentUpdate = cre -> { DefaultCollapsiblePane dcp = (DefaultCollapsiblePane) cre.getSource(); Station myStation = EntityTools.find(Station.class, station.getStatID()); dcp.setContentPane(createContent(myStation, (DefaultCollapsiblePane<Station>) cre.getSource())); }; DefaultCollapsiblePane<Homes> cp = new DefaultCollapsiblePane(headerUpdate, contentUpdate, getMenu(station)); cp.setName(getKey(station)); cpMap.put(cp.getName(), cp); return cp; } private JPanel createContent(final Station station, DefaultCollapsiblePane<Station> dcl) { JPanel result = null; try { PnlBeanEditor<Station> pbe = new PnlBeanEditor<>(() -> EntityTools.find(Station.class, station.getStatID()), Station.class, PnlBeanEditor.SAVE_MODE_IMMEDIATE); pbe.addDataChangeListener(new JPADataChangeListener<>(evt -> { pbe.reload(evt.getData()); dcl.dataChanged(new DataChangeEvent<>(pbe, evt.getData())); })); result = pbe; } catch (Exception e) { OPDE.fatal(logger, e); } return result; } private JideButton createAddHomeButton() { final JideButton btnAddHome = GUITools.createHyperlinkButton("opde.settings.home.btnAddHome", SYSConst.icon22add, null); btnAddHome.addActionListener(e -> { Homes newHome = null; EntityManager em = OPDE.createEM(); try { em.getTransaction().begin(); newHome = em.merge(new Homes(UUID.randomUUID().toString().substring(0, 15))); em.getTransaction().commit(); } catch (IllegalStateException ise) { logger.error(ise); } catch (Exception ex) { em.getTransaction().rollback(); OPDE.fatal(logger, ex); } finally { em.close(); } try { cpsHomes.removeExpansion(); cpsHomes.add(createCP(newHome)); cpsHomes.addExpansion(); } catch (Exception e1) { OPDE.fatal(logger, e1); } }); return btnAddHome; } private JideButton createAddFloorButton(final Homes home) { final JideButton btnAddHome = GUITools.createHyperlinkButton("opde.settings.home.btnAddFloor", SYSConst.icon22add, null); btnAddHome.addActionListener(e -> { Homes myHome = EntityTools.find(Homes.class, home.getEid()); btnAddHome.setForeground(GUITools.blend(myHome.getColor(), Color.BLACK, 0.85f)); Floors newFloor = null; EntityManager em = OPDE.createEM(); try { em.getTransaction().begin(); newFloor = em.merge(new Floors(em.merge(myHome), SYSTools.xx("opde.settings.home.btnAddFloor"))); em.getTransaction().commit(); } catch (Exception ex) { em.getTransaction().rollback(); OPDE.fatal(logger, ex); } finally { em.close(); } try { parentCPS.get(getKey(home) + ":floors").removeExpansion(); parentCPS.get(getKey(home) + ":floors").add(createCP(newFloor)); parentCPS.get(getKey(home) + ":floors").addExpansion(); } catch (Exception e1) { OPDE.fatal(logger, e1); } }); return btnAddHome; } private JideButton createAddRoomButton(final Floors floor) { final JideButton btnAddHome = GUITools.createHyperlinkButton("opde.settings.home.btnAddRoom", SYSConst.icon22add, null); btnAddHome.addActionListener(e -> { Floors myFloor = EntityTools.find(Floors.class, floor.getFloorid()); Rooms newRoom = null; EntityManager em = OPDE.createEM(); try { em.getTransaction().begin(); newRoom = em.merge(new Rooms(SYSTools.xx("opde.settings.home.btnAddRoom"), true, true, em.merge(myFloor))); em.getTransaction().commit(); } catch (Exception ex) { em.getTransaction().rollback(); OPDE.fatal(logger, ex); } finally { em.close(); } try { parentCPS.get("rooms4:" + getKey(floor)).removeExpansion(); parentCPS.get("rooms4:" + getKey(floor)).add(createCP(newRoom)); parentCPS.get("rooms4:" + getKey(floor)).addExpansion(); // #27 parentCPS.put(getKey(newRoom), parentCPS.get("rooms4:" + getKey(floor))); } catch (Exception e1) { OPDE.fatal(logger, e1); } }); return btnAddHome; } private JideButton createAddStationButton(final Homes home) { final JideButton btnAddHome = GUITools.createHyperlinkButton("opde.settings.home.btnAddStation", SYSConst.icon22add, null); btnAddHome.addActionListener(e -> { Homes myHome = EntityTools.find(Homes.class, home.getEid()); Station newStation = null; EntityManager em = OPDE.createEM(); try { em.getTransaction().begin(); newStation = em.merge(new Station(SYSTools.xx("opde.settings.home.btnAddStation"), em.merge(myHome))); em.getTransaction().commit(); } catch (Exception ex) { em.getTransaction().rollback(); OPDE.fatal(logger, ex); } finally { em.close(); } try { parentCPS.get(getKey(home) + ":station").removeExpansion(); parentCPS.get(getKey(home) + ":station").add(createCP(newStation)); parentCPS.get(getKey(home) + ":station").addExpansion(); } catch (Exception e1) { OPDE.fatal(logger, e1); } }); return btnAddHome; } private JPanel getMenu(final Homes home) { final JPanel pnlMenu = new JPanel(new VerticalLayout()); final JButton btnDelete = GUITools.createHyperlinkButton("opde.settings.home.btnDelHome", 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(Homes.class, home.getEid())); if (message != null) { OPDE.getDisplayManager().addSubMessage(new DisplayMessage(message, DisplayMessage.WARNING)); return; } ask(new PnlYesNo(SYSTools.xx("misc.questions.delete1") + "<br/><br/>»" + home.getName() + " (" + home.getEid() + ")" + "«<br/>" + "<br/>" + SYSTools.xx("misc.questions.delete2"), "opde.settings.home.btnDelHome", SYSConst.icon48delete, o -> { if (o.equals(JOptionPane.YES_OPTION)) { EntityTools.delete(EntityTools.find(Homes.class, home.getEid())); cpsHomes.remove(cpMap.get(getKey(home))); cpMap.remove(getKey(home)); } mainView(); })); }); return pnlMenu; } private JPanel getMenu(final Floors floor) { final JPanel pnlMenu = new JPanel(new VerticalLayout()); final JButton btnDelete = GUITools.createHyperlinkButton("opde.settings.home.btnDelFloor", 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(Floors.class, floor.getFloorid())); if (message != null) { OPDE.getDisplayManager().addSubMessage(new DisplayMessage(message, DisplayMessage.WARNING)); return; } ask(new PnlYesNo(SYSTools.xx("misc.questions.delete1") + "<br/><br/>»" + floor.getName() + " (#" + floor.getFloorid() + ")" + "«<br/>" + "<br/>" + SYSTools.xx("misc.questions.delete2"), "opde.settings.home.btnDelFloor", SYSConst.icon48delete, o -> { if (o.equals(JOptionPane.YES_OPTION)) { Floors myFloor = floor; String key = getKey(myFloor); EntityTools.delete(EntityTools.find(Floors.class, floor.getFloorid())); parentCPS.get(getKey(myFloor.getHome()) + ":floors").remove(cpMap.get(key)); cpMap.remove(key); } mainView(); })); }); return pnlMenu; } private JPanel getMenu(final Rooms room) { final JPanel pnlMenu = new JPanel(new VerticalLayout()); final JButton btnDelete = GUITools.createHyperlinkButton("opde.settings.home.btnDelRoom", 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(Rooms.class, room.getRoomID())); if (message != null) { OPDE.getDisplayManager().addSubMessage(new DisplayMessage(message, DisplayMessage.WARNING)); return; } ask(new PnlYesNo(SYSTools.xx("misc.questions.delete1") + "<br/><br/>»" + room.getText() + " (#" + room.getRoomID() + ")" + "«<br/>" + "<br/>" + SYSTools.xx("misc.questions.delete2"), "opde.settings.home.btnDelFloor", SYSConst.icon48delete, o -> { if (o.equals(JOptionPane.YES_OPTION)) { parentCPS.get(getKey(room)).remove(cpMap.get(getKey(room))); cpMap.remove(getKey(room)); EntityTools.delete(EntityTools.find(Rooms.class, room.getRoomID())); } mainView(); })); }); return pnlMenu; } private JPanel getMenu(final Station station) { final JPanel pnlMenu = new JPanel(new VerticalLayout()); final JButton btnDelete = GUITools.createHyperlinkButton("opde.settings.home.btnDelStation", 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(Station.class, station.getStatID())); if (message != null) { OPDE.getDisplayManager().addSubMessage(new DisplayMessage(message, DisplayMessage.WARNING)); return; } ask(new PnlYesNo(SYSTools.xx("misc.questions.delete1") + "<br/><br/>»" + station.getName() + " (" + station.getStatID() + ")" + "«<br/>" + "<br/>" + SYSTools.xx("misc.questions.delete2"), "opde.settings.home.btnDelFloor", SYSConst.icon48delete, o -> { if (o.equals(JOptionPane.YES_OPTION)) { Station myStation = station; String key = getKey(myStation); // #27 EntityTools.delete(EntityTools.find(Station.class, station.getStatID())); parentCPS.get(getKey(myStation.getHome()) + ":station").remove(cpMap.get(key)); cpMap.remove(key); } mainView(); })); }); return pnlMenu; } private String getKey(Object object) { if (object instanceof DefaultMutableTreeNode) object = ((DefaultMutableTreeNode) object).getUserObject(); if (object instanceof Rooms) return "room:" + ((Rooms) object).getRoomID(); if (object instanceof Homes) return "home:" + ((Homes) object).getEid(); if (object instanceof Floors) return "floor:" + ((Floors) object).getFloorid(); if (object instanceof Station) return "station:" + ((Station) object).getStatID(); return null; } }