All Downloads are FREE. Search and download functionalities are using the official Maven repository.

admin.astor.tools.PoolThreadsTree Maven / Gradle / Ivy

//+======================================================================
// $Source:  $
//
// Project:   Tango
//
// Description:  java source code for Tango manager tool..
//
// $Author$
//
// Copyright (C) :      2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,
//						European Synchrotron Radiation Facility
//                      BP 220, Grenoble 38043
//                      FRANCE
//
// This file is part of Tango.
//
// Tango 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.
// 
// Tango 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 Tango.  If not, see .
//
// $Revision$
//
//-======================================================================


package admin.astor.tools;

import admin.astor.TangoServer;
import fr.esrf.Tango.DevFailed;
import fr.esrf.TangoApi.DbDatum;
import fr.esrf.TangoDs.TangoConst;
import fr.esrf.tangoatk.widget.util.ErrorPane;

import javax.swing.*;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.util.StringTokenizer;
import java.util.ArrayList;
import java.util.List;


public class PoolThreadsTree extends JTree implements TangoConst {
    static ImageIcon tango_icon;
    static ImageIcon class_icon;
    static ImageIcon cmd_icon;

    private DefaultTreeModel treeModel;
    private DefaultMutableTreeNode root;
    private JDialog parent;
    private PoolThreadsInfo threadsInfo;
    private TangoRenderer renderer;

    private TangoServer server;
    private static final Color background = Color.WHITE;
    private static final             String[]    propertyNames = {
            "polling_threads_pool_size",
            "polling_threads_pool_conf",
    };
    private static final int NB_THREADS = 0;
    private static final int THREADS_CONFIG = 1;
    private static final int LINE_MAX_LENGTH = 256;
    //===============================================================
    //===============================================================
    public PoolThreadsTree(JDialog parent, TangoServer server) throws DevFailed {
        super();
        this.parent = parent;
        this.server = server;
        setBackground(background);

        threadsInfo = new PoolThreadsInfo(server);
        buildTree();
        expandChildren(root);
        setSelectionPath(null);

        //	Enable Drag and Drop
        this.setDragEnabled(true);
        setTransferHandler(new TransferHandler("Text"));
    }
    //===============================================================
    //===============================================================
    private void buildTree() {
        //  Create the nodes.
        root = new DefaultMutableTreeNode(server);
        createThreadsNodes();

        //	Create the tree that allows one selection at a time.
        getSelectionModel().setSelectionMode
                (TreeSelectionModel.SINGLE_TREE_SELECTION);

        //	Create Tree and Tree model
        treeModel = new DefaultTreeModel(root);
        setModel(treeModel);

        //Enable tool tips.
        ToolTipManager.sharedInstance().registerComponent(this);

        //  Set the icon for leaf nodes.
        renderer = new TangoRenderer();
        setCellRenderer(renderer);

        //	Listen for collapse tree
        addTreeExpansionListener(new TreeExpansionListener() {
            public void treeCollapsed(TreeExpansionEvent e) {
                //collapsedPerformed(e);
            }

            public void treeExpanded(TreeExpansionEvent e) {
                //expandedPerformed(e);
            }
        });
        //	Add Action listener
        addMouseListener(new java.awt.event.MouseAdapter() {

            public void mousePressed(java.awt.event.MouseEvent evt) {
                treeMousePressed(evt);
            }

            public void mouseReleased(java.awt.event.MouseEvent evt) {
                treeMouseReleased(evt);
            }

            /*
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                treeMouseClicked(evt);
            }
            */
        });
    }

    //======================================================
    /*
     *	Manage event on clicked mouse on JTree object.
     */
    //======================================================
        /*
    private void treeMouseClicked(java.awt.event.MouseEvent evt) {
        //	Set selection at mouse position
        TreePath selectedPath = getPathForLocation(evt.getX(), evt.getY());
        if (selectedPath == null)
            return;
        int mask = evt.getModifiers();

        //  Check button clicked
        if (evt.getClickCount() == 2 && (mask & MouseEvent.BUTTON1_MASK) != 0) {
        } else if ((mask & MouseEvent.BUTTON3_MASK) != 0) {
        }
    }
        */

    //===============================================================
    //===============================================================
    private void createThreadsNodes() {
        for (int i = 0; i < threadsInfo.size(); i++) {
            PollThread thread = threadsInfo.threadAt(i);
            //	Build node for class with all commansdds as leaf
            DefaultMutableTreeNode node =
                    new DefaultMutableTreeNode(thread);
            root.add(node);
            for (Object obj : thread)
                node.add(new DefaultMutableTreeNode(obj));
        }
    }

    //======================================================
    //======================================================
    private DefaultMutableTreeNode getSelectedNode() {
        return (DefaultMutableTreeNode) getLastSelectedPathComponent();
    }

    //======================================================
    //======================================================
    private Object getSelectedObject() {
        DefaultMutableTreeNode node = getSelectedNode();
        if (node == null)
            return null;
        return node.getUserObject();
    }

    //===============================================================
    //===============================================================
    boolean selectedObjectIsThread() {
        return (getSelectedObject() instanceof PollThread);
    }

    //===============================================================
    //===============================================================
    private void expandChildren(DefaultMutableTreeNode node) {
        boolean level_done = false;
        for (int i = 0; i < node.getChildCount(); i++) {
            DefaultMutableTreeNode child =
                    (DefaultMutableTreeNode) node.getChildAt(i);
            if (child.isLeaf()) {
                if (!level_done) {
                    expandNode(child);
                    level_done = true;
                }
            } else
                expandChildren(child);
        }
    }

    //===============================================================
    //===============================================================
    private void expandNode(DefaultMutableTreeNode node) {
        List nodeList = new ArrayList<>();
        nodeList.add(node);
        while (node != root) {
            node = (DefaultMutableTreeNode) node.getParent();
            nodeList.add(0, node);
        }
        TreeNode[] tn = new DefaultMutableTreeNode[nodeList.size()];
        for (int i = 0; i < nodeList.size(); i++)
            tn[i] = nodeList.get(i);
        TreePath tp = new TreePath(tn);
        setSelectionPath(tp);
        scrollPathToVisible(tp);
    }

    //===============================================================
    //===============================================================
    private DefaultMutableTreeNode getFutureSelectedNode(DefaultMutableTreeNode node) {
        //	Get the future selected node, after remove.
        DefaultMutableTreeNode parent_node =
                (DefaultMutableTreeNode) node.getParent();
        DefaultMutableTreeNode ret_node = parent_node;
        for (int i = 0; i < parent_node.getChildCount(); i++) {
            DefaultMutableTreeNode child_node =
                    (DefaultMutableTreeNode) parent_node.getChildAt(i);
            if (child_node == node) {
                if (i == parent_node.getChildCount() - 1) {
                    if (i > 0)
                        ret_node = (DefaultMutableTreeNode) parent_node.getChildAt(i - 1);
                } else
                    ret_node = (DefaultMutableTreeNode) parent_node.getChildAt(i + 1);
            }
        }
        return ret_node;
    }

    //===============================================================
    //===============================================================
    void removeThread() {
        DefaultMutableTreeNode node = getSelectedNode();

        if (node != null) {
            Object obj = node.getUserObject();
            if (obj instanceof PollThread) {
                //	Check if device(s) associated.
                if (node.getChildCount() == 0) {
                    //	get future selected node
                    DefaultMutableTreeNode next_node = getFutureSelectedNode(node);
                    //	Remove selected one
                    treeModel.removeNodeFromParent(node);
                    PollThread pt = (PollThread) obj;
                    threadsInfo.remove(pt);
                    //	And select the found node
                    TreeNode[] tree_node = next_node.getPath();
                    TreePath path = new TreePath(tree_node);
                    setSelectionPath(path);
                    scrollPathToVisible(path);
                } else
                    Utils.popupError(parent, "Cannot remove a not empty thread !");
            }
        }
    }

    //===============================================================
    //===============================================================
    DefaultMutableTreeNode addThreadNode() {

        PollThread new_thread = new PollThread(getNextThreadNum());
        DefaultMutableTreeNode node =
                new DefaultMutableTreeNode(new_thread);
        treeModel.insertNodeInto(node, root, root.getChildCount());
        return node;
    }

    //===============================================================
    //===============================================================
    private int getNextThreadNum() {
        int num = 0;
        for (int i = 0; i < root.getChildCount(); i++) {
            DefaultMutableTreeNode th_node =
                    (DefaultMutableTreeNode) root.getChildAt(i);
            num = ((PollThread) th_node.getUserObject()).num;
        }
        return ++num;
    }

    //===============================================================
    //===============================================================
    private List manageMaxLength(List lines) {
        List   list = new ArrayList<>();
        for (String line : lines) {
            while (line.length()>LINE_MAX_LENGTH) {
                list.add(line.substring(0, LINE_MAX_LENGTH-1)+'\\');
                line = line.substring(LINE_MAX_LENGTH-1);
            }
            list.add(line);
        }
        return list;
    }
    //===============================================================
    //===============================================================
    void putPoolThreadInfo() {
        //  ToDo
        //	Get configuration from tree
        int nbThreads = root.getChildCount();
        List lines = new ArrayList<>();
        for (int i=0 ; i 0) {
                String s = "";
                for (int j=0 ; j 10) {
            selectedPath = getPathForLocation(x, y);
            y -= 10;
        }
        return selectedPath;
    }

    //======================================================
    //======================================================
    private void treeMouseReleased(java.awt.event.MouseEvent evt) {
        int mask = evt.getModifiers();
        if ((mask & MouseEvent.BUTTON1_MASK) != 0) {
            if (dragged_node == null)
                return;
            TreePath selectedPath = getPathForLocation(evt.getX(), evt.getY());
            if (selectedPath == null)
                if ((selectedPath = getUpperPath(evt.getX(), evt.getY())) == null)
                    return;
            DefaultMutableTreeNode node =
                    (DefaultMutableTreeNode) selectedPath.getPathComponent(selectedPath.getPathCount() - 1);
            Object o = node.getUserObject();
            int pos = 0;
            if (o instanceof String) {
                DefaultMutableTreeNode p_node
                        = (DefaultMutableTreeNode) node.getParent();
                pos = p_node.getIndex(node);
                node = p_node;
            }
            moveLeaf(node, dragged_node, pos);
            dragged_node = null;
            Cursor cursor = new Cursor(Cursor.DEFAULT_CURSOR);
            parent.setCursor(cursor);
        }
    }

    //======================================================
    //======================================================
    private void treeMousePressed(java.awt.event.MouseEvent evt) {
        int mask = evt.getModifiers();
        if ((mask & MouseEvent.BUTTON1_MASK) != 0) {
            TreePath selectedPath = getPathForLocation(evt.getX(), evt.getY());
            if (selectedPath == null)
                return;
            DefaultMutableTreeNode node =
                    (DefaultMutableTreeNode) selectedPath.getPathComponent(selectedPath.getPathCount() - 1);
            Object o = node.getUserObject();
            if (o instanceof String) {
                TransferHandler transfer = this.getTransferHandler();
                transfer.exportAsDrag(this, evt, TransferHandler.COPY);
                dragged_node = node;
                parent.setCursor(renderer.getNodeCursor(node));
            }
        }
    }

    //===============================================================
    //===============================================================
    private void moveLeaf(DefaultMutableTreeNode collec_node, DefaultMutableTreeNode leaf_node, int pos) {
        Object obj = collec_node.getUserObject();
        if (obj instanceof PollThread) {
            treeModel.removeNodeFromParent(leaf_node);
            if (pos < 0)
                treeModel.insertNodeInto(leaf_node, collec_node, collec_node.getChildCount());
            else
                treeModel.insertNodeInto(leaf_node, collec_node, pos);

            expandNode(leaf_node);
        }
    }
    //===============================================================
    //===============================================================
    PoolThreadsTree(String serverName) throws DevFailed {
        //  Just to be used for threads pool info without display
        server = new TangoServer(serverName);
        threadsInfo = new PoolThreadsInfo(new TangoServer(serverName));
    }
    //===============================================================
    //===============================================================
    public int getNbThreads() throws DevFailed {
        return threadsInfo.size();
    }
    //===============================================================
    //===============================================================


    //===============================================================
    /*
      *	Polling thread object
      */
    //===============================================================
    private class PollThread extends ArrayList {
        String name;
        int num;

        //===========================================================
        private PollThread(int num) {
            this.num = num;
            this.name = "Thread " + (num + 1);
        }

        //===========================================================
        public String toString() {
            return name;
        }
        //===========================================================
    }

    //===============================================================
    /*
      *	Pool of polling threads info object
      */
    //===============================================================
    private class PoolThreadsInfo extends ArrayList {

        //===========================================================
        private PoolThreadsInfo(TangoServer server) throws DevFailed {
            DbDatum[] data = server.get_property(propertyNames);
            String[] config = new String[0];
            int threadsNumber = 1;
            if (data[NB_THREADS].is_empty() && data[THREADS_CONFIG].is_empty()) {
                //	If no property --> get device list from db
                String[] s = server.queryDeviceFromDb();
                //	and set all for on thread
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < s.length; i++) {
                    sb.append(s[i]);
                    if (i < s.length - 1)
                        sb.append(',');
                }
                config = new String[]{ sb.toString() };
            }
            if (!data[NB_THREADS].is_empty())
                threadsNumber = data[NB_THREADS].extractLong();
            if (!data[THREADS_CONFIG].is_empty())
                config = data[THREADS_CONFIG].extractStringArray();
            buildConfig(config, threadsNumber);
        }

        //===========================================================
        private List rebuildLines(String[] config) {
            List   lines = new ArrayList<>();
            String line = config[0];
            for (int i=1 ; i   lines = rebuildLines(config);

            int threadCounter = 0;
            for (String line : lines) {
                StringTokenizer stk = new StringTokenizer(line, ",");
                PollThread thread = new PollThread(threadCounter++);
                while (stk.hasMoreTokens())
                    thread.add(stk.nextToken());
                add(thread);
            }
            for (int i=threadCounter ; i




© 2015 - 2025 Weber Informatics LLC | Privacy Policy