/* * (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at> * * This program 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 2 of * the License, or (at your option) any later version. * * This program 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. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */ package com.fr3ts0n.pvs.gui; import java.util.Iterator; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import com.fr3ts0n.pvs.ProcessVar; import com.fr3ts0n.pvs.PvChangeEvent; import com.fr3ts0n.pvs.PvChangeListener; /** * @author se82wi * Tree node from a process variable */ public class PvTreeNode extends DefaultMutableTreeNode implements PvChangeListener { /** * ProcessVar tree node Renderer */ private static final long serialVersionUID = 8478304706986978587L; public PvTreeNode() { super(); } public PvTreeNode(Object userObject) { super(userObject); setUserObject(userObject); } /* * (non-Javadoc) * * @see * javax.swing.tree.DefaultMutableTreeNode#setUserObject(java.lang.Object) */ @SuppressWarnings("unchecked") @Override public void setUserObject(Object userObject) { super.setUserObject(userObject); if (userObject instanceof ProcessVar) { Object currVal; ProcessVar pv = (ProcessVar) userObject; // loop through attributes Iterator<Object> it = pv.values().iterator(); while (it.hasNext()) { currVal = it.next(); // if there is a child PV, then add it as a tree node if (currVal instanceof ProcessVar) add(new PvTreeNode(currVal)); } pv.addPvChangeListener(this, PvChangeEvent.PV_ADDED | PvChangeEvent.PV_DELETED | PvChangeEvent.PV_CLEARED | PvChangeEvent.PV_ELIMINATED); } } /** * get process variable from tree node * * @param path tree path to find object for * @return process variable, or null if no process variable found */ public static ProcessVar getPvFromTreePath(TreePath path) { PvTreeNode selNode = (PvTreeNode) path.getLastPathComponent(); if (selNode == null) return null; Object pvObj = selNode.getUserObject(); if (pvObj == null || !(pvObj instanceof ProcessVar)) return null; return (ProcessVar) pvObj; } /** * Find child node containing matching user Object * * @param userObject user object to match * @return matching child node, or * <pre>null</pre> if nothing has been found */ PvTreeNode findChild(Object userObject) { PvTreeNode currNode; // search through children for matching user object @SuppressWarnings("unchecked") Iterator<PvTreeNode> it = children.iterator(); while (it.hasNext()) { currNode = it.next(); if (userObject == currNode.userObject) return currNode; } // haven't found it -> return NULL return null; } /** * Handler for PvChangeEvents */ @Override public synchronized void pvChanged(PvChangeEvent pvchangeevent) { Object currVal = pvchangeevent.getValue(); if (!(currVal instanceof ProcessVar)) return; switch (pvchangeevent.getType()) { case PvChangeEvent.PV_ADDED: add(new PvTreeNode(currVal)); break; case PvChangeEvent.PV_CLEARED: removeAllChildren(); break; case PvChangeEvent.PV_DELETED: PvTreeNode pvNode = findChild(currVal); if (pvNode != null) pvNode.removeFromParent(); } } }