/*
* (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 com.fr3ts0n.pvs.ProcessVar;
import com.fr3ts0n.pvs.PvList;
import java.awt.Dimension;
import java.awt.ScrollPane;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.DropMode;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreePath;
public class PvExplorer extends JSplitPane implements TreeSelectionListener
{
/** unique serial version ID */
private static final long serialVersionUID = 182596839340890403L;
/** root process variable for tree and initial table display */
ProcessVar pvRoot;
/** PV tree display */
JTree pvTree;
/** PV table display */
PvTable pvTable;
/** PV List as container for single process variables to be displayed in table */
PvList tblList = new PvList();
/** PV transfer handler to handle data transfers within explorer */
PvTransferHandler xferHdlr = new PvTransferHandler();
public PvExplorer(ProcessVar pv)
{
setDividerSize(2);
setPreferredSize(new Dimension(640, 480));
pvTree = new JTree(new PvTreeNode(pv));
pvTree.getSelectionModel().addTreeSelectionListener(this);
pvTree.setDragEnabled(true);
pvTree.setDropMode(DropMode.ON_OR_INSERT);
pvTree.setTransferHandler(xferHdlr);
pvTable = new PvTable(pv);
pvTable.setDragEnabled(true);
pvTable.setDropMode(DropMode.ON_OR_INSERT);
pvTable.addMouseListener(tblMouseLstnr);
pvTable.setTransferHandler(xferHdlr);
JScrollPane spPvTree = new JScrollPane(pvTree);
add(spPvTree, JSplitPane.LEFT);
JScrollPane spPvTable = new JScrollPane(pvTable);
add(spPvTable, JSplitPane.RIGHT);
}
@Override
public void valueChanged(TreeSelectionEvent e)
{
TreePath selPath = e.getNewLeadSelectionPath();
if (selPath == null)
return;
ProcessVar pv = PvTreeNode.getPvFromTreePath(selPath);
if (pv instanceof PvList)
{
// if process var is a PV list itself then show it in table
pvTable.setProcessVar(pv);
} else
{
// ... otherwise create a list with PV as contained element
tblList.clear();
tblList.put(pv.getKeyValue(), pv);
pvTable.setProcessVar(tblList);
}
}
/**
* Listener for mouse events on table side
*/
MouseListener tblMouseLstnr = new MouseListener()
{
@Override
public void mouseClicked(MouseEvent e)
{
if (e.getClickCount() > 1)
{
// find the process var to selected row ...
ProcessVar pv = (ProcessVar) pvTable.getPvModel().getElementAt(pvTable.getSelectedRow());
// and show a detail panel about it ...
if (pv != null)
{
PvDetailPanel panDetail = new PvDetailPanel((ProcessVar) pv, true);
ScrollPane panScr = new ScrollPane();
panScr.setPreferredSize(new Dimension(640, 480));
panScr.add(panDetail);
JOptionPane.showMessageDialog(null, panScr);
}
}
}
@Override
public void mouseEntered(MouseEvent e)
{
}
@Override
public void mouseExited(MouseEvent e)
{
}
@Override
public void mousePressed(MouseEvent e)
{
}
@Override
public void mouseReleased(MouseEvent e)
{
}
};
}