From 4aeaa25d1abd0f0f2757b851adae8bbc7ad27df9 Mon Sep 17 00:00:00 2001 From: Branislav Stojkovic Date: Sat, 15 Dec 2018 19:47:21 +0100 Subject: [PATCH] Components in the tree sometimes stop responding until deselected and selected again --- diylc/diylc-library/lib/diylc-core.jar | Bin 242638 -> 242638 bytes diylc/diylc-swing/lib/diylc-core.jar | Bin 242638 -> 242638 bytes .../diylc/swing/plugins/tree/TreePanel.java | 1412 +++++++++-------- diylc/diylc-swing/update.xml | 4 + 4 files changed, 713 insertions(+), 703 deletions(-) diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index cef9d727eddf8477c4ce5f83e1416b15ce32e8f5..a5a4c34f7d55399acec85d7cce49610f49cb41f4 100644 GIT binary patch delta 3789 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 delta 3789 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 delta 3789 zcmX|@d0fuf8o)c}yhJF?&+<+~Q(~fIt}V-rWXZg*A}I+e6e)>ho20U|NvgM;(q>Ca zmI^;it_iu8v1A$M+CH}FelX)^9cJP_&-1&V`_J$DKId7_bGG+#ljY?m%XU5!gwDdu ztc{tOF}s};Gsx_4p=29gFoVgJ*~51lbA)dq8w}rO-raQB(%kefX2Fc6r)&U>>A4&H z_UC=!_gX#_ekZc-rhdYeOS_1O7O5FYg1 z(i*UQ;B{0P2kQ}YU8f+_A&rQ%VL2GTo7+T0&`=YLs)FHksutM}HQ~{=k#dYv4DY*_qF{QqkreXVB zM4w$l+d+-?iBRLR12ZsQW6f=JtvqawVQY@qpmgadMgMp_5v8~j572T(J+`hk{?tBz z$@$DJ_=<)PFx1ij(G8~A=RScDavs|#o7Y2*j0>O8W#dmqoX^i!Php&b8?P{G#;yCP zi~QvfN_KZoqwdLrmnhwMlz=+FC!Yzw)}hY&*&fs#fAIhZxBl*I4mkU^1}C=akAGl> zp)F^@#Ps=d88aL%W0+12*D)|Ls9%}0hwXta3Md+Ru^MKy20E%=|D;i3>Z{5jbrmD-azFg`2&*T=-*YfG{)jmCgQ4uXY*D!ojgT zVH`vM#P8T&$apW-fE?qaY?5MQ2<9Znq%G#(SBiL26vWjAOAk^w;<_&vW{k)8&W0dq&><)5XJo|+D zutesiMO)ChDJlu7Uo9tJWO`YbE840L*0GIf9ht(Mkusgd1Lf>Ip~ySqxV1Vglf|H> zDx2Y6RU7iyCX}ZXXtQuAW_wY-vW>mNd}ntu1IiuC*%XvRE0`1dZQjRhk^8IJdF<-S zQ>+p7#s>Br>3U9Eg>e^|JNj?9%;J#j8goZ`k4J1Q93VCMIl~R48eg&;CBj4}@q^lD@j%;?}&B7A5Sk(OHHUg4-;&Mp^>#CX$;Ci&M8_W-4d5x}o zHmA*)o3~Ww4wl1Z_GQ?N0mJxYG^}vr^=KG5l2@YKWi+n_(u%6EqU&%l*uYbeOQj%+(#4+#1aeWpTVF)iXJ~3-V4b zFG8-A{4~;SE8mTLT*NzLg&#`!R4bs*0e-g=(B%v-#d0p);;%7%{V%*1+}di>Gwz9g z{eI&|;WAR2UUFMx>sLG-nf-=mAZ_1sod7y~99~t07Neolfd)jLP$=}{RkLzj}id@86|=N?==K064M}VwWT6Y zFA^g`!K1}wfM2wj3fLP>0pCZ9i6D6{7T$o|#ZV?a_!w~55)lokSRxhxlo&Au0(v+q z^7|Mu3Pyg25rKftOEIpg-U$>-HN{ejZ5|878e~8$m3JUk7(n_EE0zJGmr)gGmr+gn z+S86bVJ3JNjGg{#DDz~xmU0x;}* zYDWRVRKG!y?c*q5V4Mg8r;~9a6wq@uA#Jr-2-3UNl*||}d_XGH@FJe7b6bOeM_-Yp zYiNlctPy@-HYh=ihlHyW#B{)|1ezy2{YJ2EtWjh_q8J2bhZ3n~izML-Qcx0g-{oQacu{rH-CkOOte52LTOot%iH+aIWz7E7EH{>>q>7TTioxKLGPUnzn(gYd26N zi)50*k}28IWE!+ep$fuMD9gzd8tjrvbDd8xSwBPP}elrAhH+&Zj*6gAs zZrMeljAc|zP8qfG*D^X!<93UgkaWjxlHiTRyCbMv%mu*XI0pa^p(2Oup?;+9fqMk1 z-y`M&W>nBE*ib=sy(`INRVAIW8ydddOH#Uqry538(O_W}UdQrH6&<~a`)F-8D5*YNQm6l9bWs_B%LRYR-k eee(vm*O0Wa23lj3w`-s$M%lNP9O7%m. + */ +package org.diylc.swing.plugins.tree; - DIY Layout Creator (DIYLC). - Copyright (c) 2009-2018 held jointly by the individual authors. +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; - This file is part of DIYLC. +import javax.swing.AbstractAction; +import javax.swing.Icon; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JSeparator; +import javax.swing.JTextField; +import javax.swing.JTree; +import javax.swing.SwingUtilities; +import javax.swing.ToolTipManager; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeSelectionModel; - DIYLC is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. +import org.apache.log4j.Logger; +import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.appframework.miscutils.IConfigListener; +import org.diylc.common.ComponentType; +import org.diylc.common.IBlockProcessor.InvalidBlockException; +import org.diylc.common.IPlugInPort; +import org.diylc.core.IDIYComponent; +import org.diylc.core.Template; +import org.diylc.images.IconLoader; +import org.diylc.presenter.ComponentProcessor; +import org.diylc.swing.plugins.toolbox.ComponentButtonFactory; - DIYLC is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +public class TreePanel extends JPanel { - You should have received a copy of the GNU General Public License - along with DIYLC. If not, see . + private static final long serialVersionUID = 1L; -*/ -package org.diylc.swing.plugins.tree; - -import java.awt.AlphaComposite; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.FocusAdapter; -import java.awt.event.FocusEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import javax.swing.AbstractAction; -import javax.swing.Icon; -import javax.swing.JMenu; -import javax.swing.JMenuItem; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JSeparator; -import javax.swing.JTextField; -import javax.swing.JTree; -import javax.swing.SwingUtilities; -import javax.swing.ToolTipManager; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.event.PopupMenuEvent; -import javax.swing.event.PopupMenuListener; -import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeCellRenderer; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreePath; -import javax.swing.tree.TreeSelectionModel; - -import org.apache.log4j.Logger; -import org.diylc.appframework.miscutils.ConfigurationManager; -import org.diylc.appframework.miscutils.IConfigListener; -import org.diylc.common.ComponentType; -import org.diylc.common.IBlockProcessor.InvalidBlockException; -import org.diylc.common.IPlugInPort; -import org.diylc.core.IDIYComponent; -import org.diylc.core.Template; -import org.diylc.images.IconLoader; -import org.diylc.presenter.ComponentProcessor; -import org.diylc.swing.plugins.toolbox.ComponentButtonFactory; - -public class TreePanel extends JPanel { - - private static final long serialVersionUID = 1L; - - private static final Logger LOG = Logger.getLogger(TreePanel.class); - - public static final String COMPONENT_SHORTCUT_KEY = "componentShortcuts"; - - private DefaultTreeModel treeModel; - private JTree tree; - private JScrollPane treeScroll; - private JTextField searchField; - private DefaultMutableTreeNode recentNode; - private DefaultMutableTreeNode blocksNode; - private List recentComponents; - private List blocks; - - private IPlugInPort plugInPort; - - private JPopupMenu popup; - - public TreePanel(IPlugInPort plugInPort) { - this.plugInPort = plugInPort; - setLayout(new GridBagLayout()); - - GridBagConstraints gbc = new GridBagConstraints(); - gbc.gridx = 0; - gbc.gridy = 0; - gbc.fill = GridBagConstraints.HORIZONTAL; - gbc.weighty = 0; - gbc.gridwidth = 1; - - add(getSearchField(), gbc); - - gbc.gridy++; - - gbc.fill = GridBagConstraints.BOTH; - gbc.weighty = 1; - gbc.weightx = 1; - - add(getTreeScroll(), gbc); - - setPreferredSize(new Dimension(240, 200)); - - ConfigurationManager.getInstance().addConfigListener(IPlugInPort.RECENT_COMPONENTS_KEY, new IConfigListener() { - - @SuppressWarnings("unchecked") - @Override - public void valueChanged(String key, Object value) { - List newComponents = (List) value; - if (newComponents != null - && !new HashSet(newComponents).equals(new HashSet(TreePanel.this.recentComponents))) { - LOG.info("Detected recent component change"); - refreshRecentComponents(newComponents); - } else - LOG.info("Detected no recent component change"); - TreePanel.this.recentComponents = new ArrayList(newComponents); - } - }); - - ConfigurationManager.getInstance().addConfigListener(IPlugInPort.BLOCKS_KEY, new IConfigListener() { - - @SuppressWarnings("unchecked") - @Override - public void valueChanged(String key, Object value) { - Map>> newBlocks = (Map>>) value; - if (newBlocks != null) { - List blockNames = new ArrayList(newBlocks.keySet()); - Collections.sort(blockNames); - if (!blockNames.equals(TreePanel.this.blocks)) { - LOG.info("Detected block change"); - refreshBlocks(blockNames); - } else - LOG.info("Detected no block change"); - } else - LOG.info("Detected no block change"); - } - }); - - getTree().expandRow(0); - } - - public JScrollPane getTreeScroll() { - if (treeScroll == null) { - treeScroll = new JScrollPane(getTree()); - treeScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - } - return treeScroll; - } - - public DefaultMutableTreeNode getRecentNode() { - if (this.recentNode == null) { - this.recentNode = new DefaultMutableTreeNode(new Payload("(Recently Used)", null), true); - @SuppressWarnings("unchecked") - List recent = - (List) ConfigurationManager.getInstance().readObject(IPlugInPort.RECENT_COMPONENTS_KEY, null); - if (recent != null) { - this.recentComponents = new ArrayList(recent); - refreshRecentComponents(recent); - } else { - this.recentComponents = new ArrayList(); - } - } - return this.recentNode; - } - - public DefaultMutableTreeNode getBlocksNode() { - if (this.blocksNode == null) { - this.blocksNode = new DefaultMutableTreeNode(new Payload("(Building Blocks)", null), true); - @SuppressWarnings("unchecked") - Map>> newBlocks = - (Map>>) ConfigurationManager.getInstance().readObject( - IPlugInPort.BLOCKS_KEY, null); - if (newBlocks != null) { - List blockNames = new ArrayList(newBlocks.keySet()); - Collections.sort(blockNames); - refreshBlocks(blockNames); - this.blocks = blockNames; - } else { - this.blocks = new ArrayList(); - } - } - return this.blocksNode; - } - - @SuppressWarnings("unchecked") - private void refreshRecentComponents(List recentComponentClassList) { - getRecentNode().removeAllChildren(); - for (String componentClassName : recentComponentClassList) { - final ComponentType componentType; - try { - componentType = - ComponentProcessor.getInstance().extractComponentTypeFrom( - (Class>) Class.forName(componentClassName)); - Payload payload = new Payload(componentType, new MouseAdapter() { - - @Override - public void mouseClicked(MouseEvent e) { - plugInPort.setNewComponentTypeSlot(componentType, null); - } - }); - final DefaultMutableTreeNode componentNode = new DefaultMutableTreeNode(payload, false); - String text = getSearchField().getText(); - boolean visible = - text.trim().length() == 0 || componentType.getName().toLowerCase().contains(text.toLowerCase()) - || componentType.getDescription().toLowerCase().contains(text.toLowerCase()) - || componentType.getCategory().toLowerCase().contains(text.toLowerCase()); - payload.setVisible(visible); - getRecentNode().add(componentNode); - } catch (ClassNotFoundException e) { - LOG.error("Could not create recent component button for " + componentClassName, e); - } - } - getTreeModel().nodeStructureChanged(getRecentNode()); - } - - private void refreshBlocks(List blocks) { - getBlocksNode().removeAllChildren(); - for (final String block : blocks) { - Payload payload = new Payload(block, new MouseAdapter() { - - @Override - public void mouseClicked(MouseEvent e) { - if (e == null || SwingUtilities.isLeftMouseButton(e)) { - try { - plugInPort.loadBlock(block); - } catch (InvalidBlockException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } - } - } - }); - final DefaultMutableTreeNode componentNode = new DefaultMutableTreeNode(payload, false); - String text = getSearchField().getText(); - boolean visible = text.trim().length() == 0 || block.toLowerCase().contains(text.toLowerCase()); - payload.setVisible(visible); - getBlocksNode().add(componentNode); - } - getTreeModel().nodeStructureChanged(getBlocksNode()); - } - - public DefaultTreeModel getTreeModel() { - if (treeModel == null) { - final DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Components", true); - rootNode.add(getRecentNode()); - rootNode.add(getBlocksNode()); - Map> componentTypes = plugInPort.getComponentTypes(); - List categories = new ArrayList(componentTypes.keySet()); - Collections.sort(categories); - for (String category : categories) { - final DefaultMutableTreeNode categoryNode = new DefaultMutableTreeNode(new Payload(category, null)); - rootNode.add(categoryNode); - for (final ComponentType type : componentTypes.get(category)) { - final DefaultMutableTreeNode componentNode = new DefaultMutableTreeNode(new Payload(type, new MouseAdapter() { - - @Override - public void mouseClicked(MouseEvent e) { - plugInPort.setNewComponentTypeSlot(type, null); - } - }), false); - categoryNode.add(componentNode); - } - } - treeModel = new DefaultTreeModel(rootNode); - } - return treeModel; - } - - public JTree getTree() { - if (tree == null) { - tree = new JTree(getTreeModel()); - tree.setRootVisible(false); - tree.setCellRenderer(new ComponentCellRenderer()); - tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); - tree.setRowHeight(0); - ToolTipManager.sharedInstance().registerComponent(tree); - - tree.addTreeSelectionListener(new TreeSelectionListener() { - - @Override - public void valueChanged(TreeSelectionEvent e) { - DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getPath().getLastPathComponent(); - if (node != null && node.getUserObject() != null) { - Payload payload = (Payload) node.getUserObject(); - if (payload.getClickListener() != null) { - payload.getClickListener().mouseClicked(null); - } - } - } - }); - - tree.addMouseListener(new MouseAdapter() { - - @Override - public void mouseClicked(MouseEvent e) { - if (e.getClickCount() != 1) - return; - - if (SwingUtilities.isRightMouseButton(e)) { - int row = tree.getClosestRowForLocation(e.getX(), e.getY()); - tree.setSelectionRow(row); - getPopup().show(e.getComponent(), e.getX(), e.getY()); - } - } - }); - } - return tree; - } - - public JPopupMenu getPopup() { - if (popup == null) { - popup = new JPopupMenu(); - popup.add("Loading..."); - popup.addPopupMenuListener(new PopupMenuListener() { - - @Override - public void popupMenuWillBecomeVisible(PopupMenuEvent e) { - popup.removeAll(); - - DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); - - if (selectedNode == null || selectedNode.getUserObject() == null) - return; - - Payload payload = (Payload) selectedNode.getUserObject(); - - final ComponentType componentType = payload.getComponentType(); - - final String identifier = - componentType == null ? "block:" + payload.toString() : componentType.getInstanceClass() - .getCanonicalName(); - - JMenu shortcutSubmenu = new JMenu("Assign Shortcut"); - final JMenuItem noneItem = new JMenuItem("None"); - noneItem.addActionListener(new ActionListener() { - - @SuppressWarnings("unchecked") - @Override - public void actionPerformed(ActionEvent e) { - HashMap map = - (HashMap) ConfigurationManager.getInstance().readObject(COMPONENT_SHORTCUT_KEY, null); - if (map == null) - map = new HashMap(); - - Iterator> it = map.entrySet().iterator(); - while (it.hasNext()) { - Entry item = it.next(); - if (item.getValue().equals(identifier)) - it.remove(); - } - - ConfigurationManager.getInstance().writeValue(COMPONENT_SHORTCUT_KEY, map); - - TreePanel.this.invalidate(); - TreePanel.this.repaint(); - } - - }); - - shortcutSubmenu.add(noneItem); - - for (int i = 1; i <= 12; i++) { - final JMenuItem item = new JMenuItem("F" + i); - item.addActionListener(new ActionListener() { - - @SuppressWarnings("unchecked") - @Override - public void actionPerformed(ActionEvent e) { - HashMap map = - (HashMap) ConfigurationManager.getInstance().readObject(COMPONENT_SHORTCUT_KEY, - null); - if (map == null) - map = new HashMap(); - - if (map.containsKey(item.getText())) - map.remove(item.getText()); - - Iterator> it = map.entrySet().iterator(); - while (it.hasNext()) { - Entry item = it.next(); - if (item.getValue().equals(identifier)) - it.remove(); - } - - map.put(item.getText(), identifier); - - ConfigurationManager.getInstance().writeValue(COMPONENT_SHORTCUT_KEY, map); - - TreePanel.this.invalidate(); - TreePanel.this.repaint(); - } - }); - shortcutSubmenu.add(item); - } - - if (componentType != null) { - popup.add(new SelectAllAction(plugInPort)); - popup.add(shortcutSubmenu); - popup.add(new JSeparator()); - - List