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

admin.astor.Astor 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;

import admin.astor.statistics.StatisticsPanel;
import admin.astor.tango_release.JTangoVersion;
import admin.astor.tools.*;
import fr.esrf.Tango.DevFailed;
import fr.esrf.TangoApi.*;
import fr.esrf.TangoDs.Except;
import fr.esrf.tangoatk.widget.util.ATKGraphicsUtils;
import fr.esrf.tangoatk.widget.util.ErrorPane;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;

import static admin.astor.AstorDefs.*;


/**
 *	This class is the Astor main panel
 *	containing the Jtree used to display hosts.
 *
 * @author verdier
 */

@SuppressWarnings("MagicConstant")
public class Astor extends JFrame implements AstorDefs {
    /**
     * JTree object to display control system.
     */
    public AstorTree tree = null;
    /**
     * JTree state
     */
    private boolean expanded = false;

    /**
     * JTree Container
     */
    private JScrollPane scrollPane;

    private static DevBrowser devBrowser = null;
    static long t0;
    private String tango_host = "";
    private MultiServerCommand multiServerCommand = null;
    private static int jarUsed;
    public static int rwMode = READ_WRITE;
    
    public Astor() throws DevFailed {
        this(null);
    }
    //======================================================================
    /**
     * Creates new Astor form
     *
     * @throws DevFailed in case of database connection failed
     */
    //======================================================================
    public Astor(String tangoHost) throws DevFailed {
        t0 = System.currentTimeMillis();
        initComponents();
        customizeMenu();

        setTitle(AstorUtil.getInstance().getApplicationName());
        setControlSystemTitle();
        buildTree();
        setIconImage(Utils.getAstorIcon().getImage());

        jarUsed = JTangoVersion.getInstance().getJarFileType();
        tangorbBtn.setText(JTangoVersion.JarUsed[jarUsed] + " Version");

        centerWindow();
        if (tangoHost == null) {
            try {
                tango_host = ApiUtil.get_db_obj().get_tango_host();
            } catch (DevFailed e) {
                /* do nothing */
            }
        } else {
            tango_host = tangoHost;
        }
    }
	//===========================================================
    /**
     * Move the window to the center of the screen
     */
	//===========================================================
    private void centerWindow() {
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension scrsize = toolkit.getScreenSize();
        Dimension appsize = getSize();
        Point p = new Point();
        p.x = (scrsize.width - appsize.width) / 2;
        p.y = (scrsize.height - appsize.height) / 2;
        setLocation(p);
    }
    //======================================================================
    //======================================================================
    private void setControlSystemTitle() throws DevFailed {
        //  Get control system name if any
        String  name = AstorUtil.getControlSystemName();
        if (name!=null && name.length()>0) {
            titleLabel.setText(name);
            topPanel.setVisible(true);
        }
        else
            topPanel.setVisible(false);
    }
    //======================================================================
    //======================================================================
    private void buildTree() throws DevFailed {

        try {
            //	Stop threads if already started (updating tree)
            if (tree != null) {
                tree.stopThreads();
                scrollPane.remove(tree);
                remove(scrollPane);
            }

            //	Build tree and start threads to update tree
            tree = new AstorTree(this, this.miniSplashProgressBar, this.miniSplashLabel);
            scrollPane = new JScrollPane();
            scrollPane.setPreferredSize(AstorUtil.getPreferredSize());
            scrollPane.setViewportView(tree);
            getContentPane().add(scrollPane, BorderLayout.CENTER);
            expanded = false;
            pack();

            //  Access control management
            manageAccessControlMenu(tree.isAccessControlled());
        } catch (DevFailed e) {
            miniSplashProgressBar.setVisible(false);
            miniSplashLabel.setVisible(false);
            throw e;
        }
    }
    //======================================================================
    //======================================================================
    Dimension getTreeSize() {
        //return scrollPane.getSize();
        return scrollPane.getPreferredSize();
    }
    //======================================================================
    //======================================================================
    void setTreeSize(Dimension d) {
        scrollPane.setPreferredSize(d);
        pack();
    }
    //======================================================================
    //======================================================================
    private void customizeMenu() {
        //	File menu
        fileMenu.setMnemonic('F');
        exitBtn.setMnemonic('E');
        exitBtn.setAccelerator(KeyStroke.getKeyStroke('Q', MouseEvent.CTRL_MASK));

        ctrlPreferenceBtn.setMnemonic('P');
        ctrlPreferenceBtn.setAccelerator(KeyStroke.getKeyStroke('P', MouseEvent.CTRL_MASK));
        String s = System.getProperty("NO_PREF");
        if (s != null && s.toLowerCase().equals("true"))
            ctrlPreferenceBtn.setEnabled(false);
        ctrlPreferenceBtn.setEnabled(rwMode==READ_WRITE);
        usePreferenceBtn.setEnabled(rwMode==READ_WRITE);

        changeTgHostBtn.setMnemonic('T');
        changeTgHostBtn.setAccelerator(KeyStroke.getKeyStroke('T', MouseEvent.CTRL_MASK));

        //	View menu
        viewMenu.setMnemonic('V');
        newBranchBtn.setMnemonic('N');
        newBranchBtn.setAccelerator(KeyStroke.getKeyStroke('N', MouseEvent.CTRL_MASK));

        deviceBrowserBtn.setMnemonic('B');
        deviceBrowserBtn.setAccelerator(KeyStroke.getKeyStroke('B', MouseEvent.CTRL_MASK));

        expandBtn.setMnemonic('E');
        expandBtn.setAccelerator(KeyStroke.getKeyStroke('E', MouseEvent.CTRL_MASK));

        //	Search menu
        toolsMenu.setMnemonic('T');
        multiServersCmdItem.setAccelerator(KeyStroke.getKeyStroke('M', MouseEvent.CTRL_MASK));
        jiveMenuItem.setAccelerator(KeyStroke.getKeyStroke('J', MouseEvent.CTRL_MASK));
        logviewerMenuItem.setAccelerator(KeyStroke.getKeyStroke('L', MouseEvent.CTRL_MASK));
        multiServersCmdItem.setEnabled(rwMode==READ_WRITE);
        jiveMenuItem.setEnabled(rwMode!=READ_ONLY);
        accessControlBtn.setEnabled(rwMode!=READ_ONLY);

        //	Command menu
        cmdMenu.setMnemonic('C');
        cmdMenu.setEnabled(rwMode!=READ_ONLY);

        newHostBtn.setAccelerator(KeyStroke.getKeyStroke('H', MouseEvent.CTRL_MASK));

        nb_def_tools = toolsMenu.getItemCount();
        buildToolsItems();
        buildAdditionalHelps();

        expandBtn.setVisible(false);

        modeLabel.setText(strMode[rwMode]);
        modeLabel.setVisible(rwMode!=READ_WRITE);
    }
    //======================================================================
    //======================================================================
    private void manageAccessControlMenu(boolean isAccessControlled) {
        if (isAccessControlled) {
            accessControlBtn.setMnemonic('A');
            accessControlBtn.setAccelerator(KeyStroke.getKeyStroke('A', MouseEvent.CTRL_MASK));
            accessControlBtn.setVisible(true);
            System.out.println("AccessControl is active");
        } else {   //  Service does not exist !
            accessControlBtn.setVisible(false);
        }
    }
    //======================================================================
    //======================================================================
    private String[] htmlHelps = null;
    private void buildAdditionalHelps() {
        htmlHelps = AstorUtil.getHtmlHelps();
        if (htmlHelps == null) return;
        if (htmlHelps.length == 0) return;

        helpMenu.add(new JSeparator());

        for (int i = 0; i < htmlHelps.length / 2; i++) {
            JMenuItem mi = new JMenuItem();
            mi.setText(htmlHelps[2 * i]);
            mi.addActionListener(this::htmlHelpsItemActionPerformed);
            helpMenu.add(mi);
        }
    }
    //======================================================================
    //======================================================================
    private void htmlHelpsItemActionPerformed(java.awt.event.ActionEvent evt) {
        String str = evt.getActionCommand();
        String cmd = null;
        for (int i = 0; i < htmlHelps.length; i++)
            if (str.equals(htmlHelps[i]))
                if (i < htmlHelps.length - 1)
                    cmd = htmlHelps[i + 1];
        if (cmd == null)
            Utils.popupError(this, "No command found for item  \'" + str + "\'");
        System.out.println(cmd);

        AstorUtil.showInHtmBrowser(cmd);
    }
    //======================================================================

    /**
     * Remove Optional tools if any and add new ones.
     */
    //======================================================================
    private void buildToolsItems() {
        //  Remove items if any
        for (int i = toolsMenu.getItemCount(); i > nb_def_tools; i--) {
            JMenuItem mi = toolsMenu.getItem(i - 1);
            mi.removeActionListener(tools_al.get(i - nb_def_tools - 1));
            toolsMenu.remove(i - 1);
        }
        app_tools.clear();
        tools_al.clear();

        //	Add JMenuItem for tools
        String[] str_tools = AstorUtil.getTools();
        if (str_tools != null) {
            for (int i = 0; i < str_tools.length; i += 2) {
                OneTool t = new OneTool(str_tools[i], str_tools[i + 1]);
                app_tools.add(t);
                JMenuItem mi = new JMenuItem();
                mi.setText(t.name);
                ActionListener al;
                mi.addActionListener(al = this::toolsItemActionPerformed);
                tools_al.add(al);
                toolsMenu.add(mi);
            }
        }
    }

    private int nb_def_tools = 1;
    private List app_tools = new ArrayList<>();
    private List tools_al = new ArrayList<>();
    //======================================================================
    /**
     * This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    //======================================================================
    // //GEN-BEGIN:initComponents
    private void initComponents() {

        topPanel = new javax.swing.JPanel();
        titleLabel = new javax.swing.JLabel();
        bottomPanel = new javax.swing.JPanel();
        modeLabel = new javax.swing.JLabel();
        miniSplashLabel = new javax.swing.JLabel();
        miniSplashProgressBar = new javax.swing.JProgressBar();
        javax.swing.JMenuBar menuBar = new javax.swing.JMenuBar();
        fileMenu = new javax.swing.JMenu();
        changeTgHostBtn = new javax.swing.JMenuItem();
        ctrlPreferenceBtn = new javax.swing.JMenuItem();
        usePreferenceBtn = new javax.swing.JMenuItem();
        exitBtn = new javax.swing.JMenuItem();
        viewMenu = new javax.swing.JMenu();
        deviceBrowserBtn = new javax.swing.JMenuItem();
        javax.swing.JMenuItem refreshBtn = new javax.swing.JMenuItem();
        expandBtn = new javax.swing.JMenuItem();
        javax.swing.JMenuItem startupErrorBtn = new javax.swing.JMenuItem();
        cmdMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem startServersBtn = new javax.swing.JMenuItem();
        javax.swing.JMenuItem stopServersBtn = new javax.swing.JMenuItem();
        newHostBtn = new javax.swing.JMenuItem();
        newBranchBtn = new javax.swing.JMenuItem();
        toolsMenu = new javax.swing.JMenu();
        javax.swing.JMenu findMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem findHostItem = new javax.swing.JMenuItem();
        javax.swing.JMenuItem findObjectByFilterItem = new javax.swing.JMenuItem();
        javax.swing.JMenuItem tangoStatBtn = new javax.swing.JMenuItem();
        multiServersCmdItem = new javax.swing.JMenuItem();
        javax.swing.JMenuItem serverUsageMenuItem = new javax.swing.JMenuItem();
        jiveMenuItem = new javax.swing.JMenuItem();
        accessControlBtn = new javax.swing.JMenuItem();
        javax.swing.JMenuItem statisticsBtn = new javax.swing.JMenuItem();
        logviewerMenuItem = new javax.swing.JMenuItem();
        helpMenu = new javax.swing.JMenu();
        principleHelpBtn = new javax.swing.JMenuItem();
        tangorbBtn = new javax.swing.JMenuItem();
        distributionBtn = new javax.swing.JMenuItem();
        starterEventsItem = new javax.swing.JMenuItem();
        starterNoEventsItem = new javax.swing.JMenuItem();
        javax.swing.JMenuItem faultyListItem = new javax.swing.JMenuItem();
        releaseNoteBtn = new javax.swing.JMenuItem();
        aboutBtn = new javax.swing.JMenuItem();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        titleLabel.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        topPanel.add(titleLabel);

        getContentPane().add(topPanel, java.awt.BorderLayout.NORTH);

        bottomPanel.setLayout(new java.awt.BorderLayout());

        modeLabel.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        bottomPanel.add(modeLabel, java.awt.BorderLayout.NORTH);

        miniSplashLabel.setText("Splash message");
        bottomPanel.add(miniSplashLabel, java.awt.BorderLayout.CENTER);
        bottomPanel.add(miniSplashProgressBar, java.awt.BorderLayout.SOUTH);

        getContentPane().add(bottomPanel, java.awt.BorderLayout.SOUTH);

        fileMenu.setText("File");

        changeTgHostBtn.setText("Change Tango Host");
        changeTgHostBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                changeTgHostBtnActionPerformed(evt);
            }
        });
        fileMenu.add(changeTgHostBtn);

        ctrlPreferenceBtn.setText("Ctrl System Preferences");
        ctrlPreferenceBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ctrlPreferenceBtnActionPerformed(evt);
            }
        });
        fileMenu.add(ctrlPreferenceBtn);

        usePreferenceBtn.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_U, java.awt.event.InputEvent.CTRL_DOWN_MASK));
        usePreferenceBtn.setMnemonic('U');
        usePreferenceBtn.setText("User Preferences");
        usePreferenceBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                usePreferenceBtnActionPerformed(evt);
            }
        });
        fileMenu.add(usePreferenceBtn);

        exitBtn.setText("Exit");
        exitBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                exitBtnActionPerformed(evt);
            }
        });
        fileMenu.add(exitBtn);

        menuBar.add(fileMenu);

        viewMenu.setText("View");

        deviceBrowserBtn.setText("Event Manager");
        deviceBrowserBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                deviceBrowserBtnActionPerformed(evt);
            }
        });
        viewMenu.add(deviceBrowserBtn);

        refreshBtn.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F5, 0));
        refreshBtn.setText("Update Tree from database");
        refreshBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                refreshBtnActionPerformed(evt);
            }
        });
        viewMenu.add(refreshBtn);

        expandBtn.setText("Expand Tree");
        expandBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                expandBtnActionPerformed(evt);
            }
        });
        viewMenu.add(expandBtn);

        startupErrorBtn.setText("Startup Errors");
        startupErrorBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                startupErrorBtnActionPerformed(evt);
            }
        });
        viewMenu.add(startupErrorBtn);

        menuBar.add(viewMenu);

        cmdMenu.setText("Command");

        startServersBtn.setText("Start All Controlled Servers");
        startServersBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                startServersBtnActionPerformed(evt);
            }
        });
        cmdMenu.add(startServersBtn);

        stopServersBtn.setText("Stop All Controlled Servers");
        stopServersBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                stopServersBtnActionPerformed(evt);
            }
        });
        cmdMenu.add(stopServersBtn);

        newHostBtn.setText("Add a New Host");
        newHostBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                newHostBtnActionPerformed(evt);
            }
        });
        cmdMenu.add(newHostBtn);

        newBranchBtn.setText("Add a New Branch");
        newBranchBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                newBranchBtnActionPerformed(evt);
            }
        });
        cmdMenu.add(newBranchBtn);

        menuBar.add(cmdMenu);

        toolsMenu.setText("Tools");

        findMenu.setText("Find");

        findHostItem.setText("Host by Name");
        findHostItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                findHostItemActionPerformed(evt);
            }
        });
        findMenu.add(findHostItem);

        findObjectByFilterItem.setText("Device/Server/Class by Filter");
        findObjectByFilterItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                findObjectByFilterItemActionPerformed(evt);
            }
        });
        findMenu.add(findObjectByFilterItem);

        toolsMenu.add(findMenu);

        tangoStatBtn.setText("Ctrl System Info");
        tangoStatBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tangoStatBtnActionPerformed(evt);
            }
        });
        toolsMenu.add(tangoStatBtn);

        multiServersCmdItem.setText("Multi Servers Command");
        multiServersCmdItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                multiServersCmdItemActionPerformed(evt);
            }
        });
        toolsMenu.add(multiServersCmdItem);

        serverUsageMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_U, java.awt.event.InputEvent.CTRL_DOWN_MASK));
        serverUsageMenuItem.setText("Server Usage");
        serverUsageMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                serverUsageMenuItemActionPerformed(evt);
            }
        });
        toolsMenu.add(serverUsageMenuItem);

        jiveMenuItem.setText("Jive");
        jiveMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jiveMenuItemActionPerformed(evt);
            }
        });
        toolsMenu.add(jiveMenuItem);

        accessControlBtn.setText("Access Control");
        accessControlBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                accessControlBtnActionPerformed(evt);
            }
        });
        toolsMenu.add(accessControlBtn);

        statisticsBtn.setText("Server Statistics");
        statisticsBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                statisticsBtnActionPerformed(evt);
            }
        });
        toolsMenu.add(statisticsBtn);

        logviewerMenuItem.setText("LogViewer");
        logviewerMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                logviewerMenuItemActionPerformed(evt);
            }
        });
        toolsMenu.add(logviewerMenuItem);

        menuBar.add(toolsMenu);

        helpMenu.setText("Help");

        principleHelpBtn.setText("Principle and State Help");
        principleHelpBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                helpActionPerformed(evt);
            }
        });
        helpMenu.add(principleHelpBtn);

        tangorbBtn.setText("TangORB revision");
        tangorbBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                helpActionPerformed(evt);
            }
        });
        helpMenu.add(tangorbBtn);

        distributionBtn.setText("Servers Distribution");
        distributionBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                helpActionPerformed(evt);
            }
        });
        helpMenu.add(distributionBtn);

        starterEventsItem.setText("Hosts Controlled on Events");
        starterEventsItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                helpActionPerformed(evt);
            }
        });
        helpMenu.add(starterEventsItem);

        starterNoEventsItem.setText("Hosts Controlled on Polling");
        starterNoEventsItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                helpActionPerformed(evt);
            }
        });
        helpMenu.add(starterNoEventsItem);

        faultyListItem.setText("Faulty Host List");
        faultyListItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                faultyListItemhelpActionPerformed(evt);
            }
        });
        helpMenu.add(faultyListItem);

        releaseNoteBtn.setText("Release Note");
        releaseNoteBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                helpActionPerformed(evt);
            }
        });
        helpMenu.add(releaseNoteBtn);

        aboutBtn.setText("About");
        aboutBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                helpActionPerformed(evt);
            }
        });
        helpMenu.add(aboutBtn);

        menuBar.add(helpMenu);

        setJMenuBar(menuBar);

        pack();
    }// //GEN-END:initComponents

    //======================================================================
    //======================================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void ctrlPreferenceBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ctrlPreferenceBtnActionPerformed
        try {
            PreferenceDialog dialog = new PreferenceDialog(this);
            dialog.setVisible(true);
            setControlSystemTitle();    //  Something could have changed.

            //  If last collections changed -> read tree from DB
            if (dialog.isLastCollectionsChanged())
                refreshBtnActionPerformed(null);
        } catch (DevFailed e) {
            System.err.println(e.errors[0].desc);
        }

    }//GEN-LAST:event_ctrlPreferenceBtnActionPerformed
    //======================================================================
    //======================================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void usePreferenceBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_usePreferenceBtnActionPerformed
        List knownTangoHosts = AstorUtil.getAllKnownTangoHosts();
        GetTextDialog dlg = new GetTextDialog(this,
                "List of User Tango Hosts", null, knownTangoHosts);
        if (dlg.showDialog() == JOptionPane.OK_OPTION) {
            knownTangoHosts = dlg.getTextLines();
            try {
                AstorUtil.saveUserKnownTangoHost(knownTangoHosts);
            }
            catch(DevFailed e) {
                ErrorPane.showErrorMessage(this, null, e);
            }
        }
    }//GEN-LAST:event_usePreferenceBtnActionPerformed

    //======================================================================
    //======================================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void startupErrorBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_startupErrorBtnActionPerformed

        if (tree.subscribeErrWindow == null)
            Utils.popupMessage(this, "No error at startup.");
        else
            tree.subscribeErrWindow.setVisible(true);
    }//GEN-LAST:event_startupErrorBtnActionPerformed

    //======================================================================
    //======================================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void accessControlBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_accessControlBtnActionPerformed
        tree.startTACpanel();
    }//GEN-LAST:event_accessControlBtnActionPerformed

    //======================================================================
    //======================================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void changeTgHostBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_changeTgHostBtnActionPerformed
        try {
            final String newTangoHost;
            List knownTangoHosts = AstorUtil.getAllKnownTangoHosts();
            Selector tangoHostSelector = new Selector(this,
                    "Tango Host  (e.g.  hal:2001)", knownTangoHosts, tango_host);
            ATKGraphicsUtils.centerDialog(tangoHostSelector);
            newTangoHost = tangoHostSelector.showDialog();

            if (newTangoHost == null || newTangoHost.isEmpty()) {
                return;
            }

            //	Check if connection OK
            String[] tgh_arr = ApiUtil.parseTangoHost(newTangoHost);
            if (tgh_arr.length != 2) {
                Utils.popupError(this, "Input syntax error\n" + newTangoHost + "\n is not a valid TANGO_HOST");
                return;
            }
            Database db = ApiUtil.get_db_obj(tgh_arr[0], tgh_arr[1]);
            
            if (tango_host.equals(newTangoHost))
                return;

            //  Set the rw mode for new astor
            final String rights;
            switch (rwMode) {
                case READ_WRITE:
                    rights = "-rw";
                    break;
                case DB_READ_ONLY:
                    rights = "-db_ro";
                    break;
                default:
                    rights = "-ro";
                    break;
            }
            //  Start a new shell because TANGO_HOST is for the JVM
            //  Start it in a tread to do not block this one
            this.dispose();
            
            AstorUtil.setTangoHost(newTangoHost);
            
            ApiUtil.change_db_obj(tgh_arr[0], tgh_arr[1]);
            
            startAstor(newTangoHost);
            
            
        } catch (DevFailed e) {
            ErrorPane.showErrorMessage(this, "Cannot change TANGO_HOST", e);
        } catch (Exception ex) {
            ErrorPane.showErrorMessage(this, "Cannot change TANGO_HOST", ex);
        }
    }//GEN-LAST:event_changeTgHostBtnActionPerformed

    //======================================================================
    //======================================================================
    private fr.esrf.logviewer.Main logviewer = null;

    @SuppressWarnings({"UnusedDeclaration"})
    private void logviewerMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_logviewerMenuItemActionPerformed
        if (logviewer == null)
            logviewer = new fr.esrf.logviewer.Main(this);
        logviewer.setVisible(true);
        logviewer.toFront();
    }//GEN-LAST:event_logviewerMenuItemActionPerformed

    //======================================================================
    //======================================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void jiveMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jiveMenuItemActionPerformed
        tree.displayJiveAppli();
    }//GEN-LAST:event_jiveMenuItemActionPerformed

    //======================================================================
    //======================================================================
    static private String searched_host = "";

    @SuppressWarnings({"UnusedDeclaration"})
    private void findHostItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_findHostItemActionPerformed

        //	Ask for host's name
        String hostname = (String) JOptionPane.showInputDialog(this,
                "Host Name ?",
                "Input Dialog",
                JOptionPane.INFORMATION_MESSAGE,
                null, null, searched_host);

        //	if host has been typed,
        //	select it on tree and open control panel
        if (hostname != null) {
            try {
                tree.setSelectionRoot();
                tree.setSelectionPath(hostname);
                tree.displayHostInfo();
                searched_host = hostname;
            }
            catch (DevFailed e) {
                ErrorPane.showErrorMessage(this, null, e);
            }
        }

    }//GEN-LAST:event_findHostItemActionPerformed

    //======================================================================
    //======================================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void tangoStatBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tangoStatBtnActionPerformed

        //	Ask to confirm
        if (JOptionPane.showConfirmDialog(this,
                "The System Information needs to browse Database\n" +
                        "        and it could take a long time !\n\n" +
                        "Start it any way ?",
                "Confirm Dialog",
                JOptionPane.YES_NO_OPTION) == JOptionPane.OK_OPTION) {

            new DeviceTreeDialog(this);

            // ToDo
            /*
             * Really too slow And too much threads
            try {
                 new TangoReleaseDialog(this).setVisible(true);
                 new CtrlSystemInfo(this);
            }
            catch (DevFailed e) {
                ErrorPane.showErrorMessage(this, null, e);
            }
            */
        }
    }//GEN-LAST:event_tangoStatBtnActionPerformed

    //======================================================================
    /**
     * Start tools found in Astor/Tools property
     *
     * @param evt mouse event
     */
    //======================================================================
    private void toolsItemActionPerformed(java.awt.event.ActionEvent evt) {
        String toolName = evt.getActionCommand();
        try {
            OneTool toolApplication = getToolApplication(toolName);
            System.out.println("Starting " + toolApplication.classname);

            //	Check if tool is already instanced.
            if (toolApplication.jframe != null) {
                toolApplication.jframe.setVisible(true);
            }
            else {
                //	Retrieve class name
                Class	_class = Class.forName(toolApplication.classname);
                boolean found = false;

                //	And build object
                Constructor[] constructors = _class.getDeclaredConstructors();
                for (Constructor constructor : constructors) {
                    Class[] parameterTypes = constructor.getParameterTypes();
                    if (parameterTypes.length==1 && parameterTypes[0]==JFrame.class) {
                        toolApplication.setJFrame((JFrame) constructor.newInstance(this));
                        toolApplication.jframe.setVisible(true);
                        found = true;
                    }
                }
                if (!found)
                    throw new Exception("Cannot find constructor for " + toolApplication.classname);
            }
        } catch (Exception e) {
            ErrorPane.showErrorMessage(this, null, e);
        }
    }

    //======================================================================
    //======================================================================
    private OneTool getToolApplication(String name) throws Exception {
        for (OneTool oneTool : app_tools)
            if (oneTool.name.equals(name))
                return oneTool;
        throw new Exception(name + " tool not found");
    }
    //======================================================================
    //======================================================================
    void removeHost(String hostname) {
        if (JOptionPane.showConfirmDialog(this,
                "Are you sure to want to remove " + hostname,
                "Confirm Dialog",
                JOptionPane.YES_NO_OPTION) != JOptionPane.OK_OPTION)
            return;

        String serverName  = "Starter/" + hostname;
        String adminDevice = "dserver/" + serverName;
        String deviceName  = AstorUtil.getStarterDeviceHeader() + hostname;

        //	Ask to confirm
        try {
            //	Remove properties
            DeviceProxy dev = new DeviceProxy(deviceName);
            dev.delete_property("StartDsPath");
            dev.delete_property(AstorDefs.collec_property);
            dev.delete_property(AstorDefs.usage_property);
            dev.delete_property("UseEvents");

            //	Remove devices and server
            Database db = ApiUtil.get_db_obj(AstorUtil.getInstance().getTangoHost());
            db.delete_server(serverName);
            db.delete_device(deviceName);
            db.delete_device(adminDevice);

            JOptionPane.showMessageDialog(this,
                    hostname + " has been removed !",
                    "Command Done",
                    JOptionPane.INFORMATION_MESSAGE);
        } catch (DevFailed e) {
            ErrorPane.showErrorMessage(this,
                    "Cannot remove host", e);
        }
        try {
            buildTree();
        } catch (DevFailed e) {
            ErrorPane.showErrorMessage(this, null, e);
        }
    }

    //======================================================================
    //======================================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void newHostBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newHostBtnActionPerformed
        addNewHost(null);
    }//GEN-LAST:event_newHostBtnActionPerformed

    //======================================================================
    //======================================================================
    void addNewHost(TangoHost h) {
        NewStarterDialog dialog
                = new NewStarterDialog(this, h, tree.getCollectionList(), tree.hosts, true);
        dialog.setVisible(true);
        if (dialog.getValue() == JOptionPane.OK_OPTION) {
            try {
                buildTree();
            } catch (DevFailed e) {
                ErrorPane.showErrorMessage(this, null, e);
            }
        }
    }

    //======================================================================
    //======================================================================
    void editHostProperties(TangoHost host) {
        NewStarterDialog dialog
                = new NewStarterDialog(this, host, tree.getCollectionList(), tree.hosts, false);
        dialog.setVisible(true);
    }

    //======================================================================
    //======================================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void stopServersBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_stopServersBtnActionPerformed
        new ServerCmdThread(this, tree.hosts, StopAllServers).start();
    }//GEN-LAST:event_stopServersBtnActionPerformed

    //======================================================================
    //======================================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void startServersBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_startServersBtnActionPerformed
        new ServerCmdThread(this, tree.hosts, StartAllServers).start();
    }//GEN-LAST:event_startServersBtnActionPerformed

    //======================================================================
    //======================================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void newBranchBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newBranchBtnActionPerformed

        String branch_name = (String) JOptionPane.showInputDialog(this,
                "New Branch Name",
                "Input Dialog",
                JOptionPane.INFORMATION_MESSAGE,
                null, null, "");
        if (branch_name != null) {
            tree.addBranch(branch_name);
        }
    }//GEN-LAST:event_newBranchBtnActionPerformed

    //======================================================================
    //======================================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void helpActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_helpActionPerformed
        JMenuItem item = (JMenuItem) evt.getSource();

        if (item == principleHelpBtn)
            new PrincipleAndHelp(this).setVisible(true);
        else if (item == distributionBtn)
            new HostsScanThread(this, tree.hosts).start();
        else if (item == releaseNoteBtn)
            new PopupHtml(this).show(ReleaseNotes.htmlString);
        else if (item == tangorbBtn)
            displayTangORBversion();
        else if (item == aboutBtn)
            displayAboutAstor();
        else if (item == starterEventsItem)
            displaySubscribedHostList(true);
        else if (item == starterNoEventsItem)
            displaySubscribedHostList(false);
        else
            Utils.popupMessage(this, "Not implemented yet !");
    }//GEN-LAST:event_helpActionPerformed

    //======================================================================
    //======================================================================
	private void displayTangORBversion() {

        String message;
        int width  = 400;
        int height = 275;
        if (jarUsed==JTangoVersion.JTANGO) {
            message = JTangoVersion.getInstance().toString();
            String jarName = JTangoVersion.getInstance().getJarFileName();
            int size = jarName.length()*9;
            if (size>width)
                width = size;
        }
        else {
            TangORBversion tangorb;
            try {
                tangorb = new TangORBversion();
            } catch (DevFailed | IOException e) {
                ErrorPane.showErrorMessage(this,
                        "Cannot check TangORB revision", e);
                return;
            }
            message = tangorb.jarfile + ":\n\n" + tangorb;
        }
        PopupText txt = new PopupText(this,tangorbBtn.getText());
        txt.setFont(new java.awt.Font("Courier", 1, 14));
        txt.show(message, width, height);
    }
    //======================================================================
    //======================================================================
	private void displayAboutAstor() {
        String message =
                "
" + AstorUtil.getInstance().getApplicationName() + " (Tango Manager)

" + "This programme is used to control, start and stop
" + "the TANGO device servers.

" + "Powered by Java version "+ System.getProperty("java.version") +"
" + "Use "+ JTangoVersion.getInstance().getSimpleJarFileName() + "

" + "Pascal Verdier - Accelerator Controls Units - ESRF
" + "Nicolas Tappret - Accelerator Controls Units - ESRF " + "
"; Utils.popupMessage(this, message, Utils.getTangoClassIcon()); } //====================================================================== //====================================================================== private void displaySubscribedHostList(boolean onEvt) { List hostsList = new ArrayList<>(); for (TangoHost host : tree.hosts) { if (onEvt) { if (host.onEvents) { hostsList.add(host.getName()); } } else { if (!host.onEvents) { hostsList.add(host.getName()); } } } String title; StringBuilder message = new StringBuilder(); if (hostsList.isEmpty()) { title = "There is no host controlled " + TangoHost.controlMethod(onEvt); } else if (hostsList.size() == tree.hosts.length) { title = "All hosts are controlled " + TangoHost.controlMethod(onEvt); } else { title = "On " + tree.hosts.length + " hosts,\n" + hostsList.size() + " are controlled " + TangoHost.controlMethod(onEvt); hostsList.forEach(hostName -> { message.append(hostName).append('\n'); }); } if (message.length()==0) Utils.popupMessage(this, title); else { PopupText ppt = new PopupText(this); ppt.setTitle(title); ppt.addText(message.toString()); ppt.setSize(360, 400); ppt.pack(); ppt.setVisible(true); } } //====================================================================== //====================================================================== @SuppressWarnings({"UnusedDeclaration"}) private void expandBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_expandBtnActionPerformed expanded = !expanded; tree.expand(expanded); if (expanded) expandBtn.setText("Collapse Tree"); else expandBtn.setText("Expand Tree"); }//GEN-LAST:event_expandBtnActionPerformed //====================================================================== //====================================================================== @SuppressWarnings({"UnusedDeclaration"}) private void deviceBrowserBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deviceBrowserBtnActionPerformed if (devBrowser == null) devBrowser = new DevBrowser(this); devBrowser.setVisible(true); }//GEN-LAST:event_deviceBrowserBtnActionPerformed //====================================================================== //====================================================================== @SuppressWarnings({"UnusedDeclaration"}) private void refreshBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshBtnActionPerformed try { buildTree(); } catch (DevFailed e) { ErrorPane.showErrorMessage(this, null, e); } }//GEN-LAST:event_refreshBtnActionPerformed //====================================================================== //====================================================================== @SuppressWarnings({"UnusedDeclaration"}) private void exitBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitBtnActionPerformed doExit(); }//GEN-LAST:event_exitBtnActionPerformed //====================================================================== //====================================================================== @SuppressWarnings({"UnusedDeclaration"}) private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm doExit(); }//GEN-LAST:event_exitForm //====================================================================== //====================================================================== private WideSearchDialog wide_search_dlg = null; @SuppressWarnings({"UnusedDeclaration"}) private void findObjectByFilterItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_findObjectByFilterItemActionPerformed if (wide_search_dlg == null) wide_search_dlg = new WideSearchDialog(this); wide_search_dlg.setVisible(true); }//GEN-LAST:event_findObjectByFilterItemActionPerformed //====================================================================== //====================================================================== @SuppressWarnings({"UnusedDeclaration"}) private void multiServersCmdItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_multiServersCmdItemActionPerformed try { if (multiServerCommand == null) { multiServerCommand = new MultiServerCommand(this); } multiServerCommand.setVisible(true); } catch (DevFailed e) { ErrorPane.showErrorMessage(this, null, e); } }//GEN-LAST:event_multiServersCmdItemActionPerformed //====================================================================== //====================================================================== @SuppressWarnings({"UnusedDeclaration"}) private void statisticsBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_statisticsBtnActionPerformed StatisticsPanel statisticsPanel = new StatisticsPanel(this); statisticsPanel.readAndDisplayStatistics(null); // On all Servers statisticsPanel.setVisible(true); }//GEN-LAST:event_statisticsBtnActionPerformed //====================================================================== //====================================================================== @SuppressWarnings({"UnusedDeclaration"}) private void serverUsageMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_serverUsageMenuItemActionPerformed try { new ServerUsageDialog(this).setVisible(true); } catch (DevFailed e) { ErrorPane.showErrorMessage(this, null, e); } }//GEN-LAST:event_serverUsageMenuItemActionPerformed //====================================================================== //====================================================================== @SuppressWarnings({"UnusedDeclaration"}) private void faultyListItemhelpActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_faultyListItemhelpActionPerformed // TODO add your handling code here: StringBuilder sb = new StringBuilder(); for (TangoHost host : tree.hosts) { if (host.state==faulty) sb.append(host.getName()).append('\n'); } PopupText popupText = new PopupText(this); popupText.setTitle("Faulty host list"); popupText.addText(sb.toString()); popupText.setSize(360, 400); popupText.setVisible(true); }//GEN-LAST:event_faultyListItemhelpActionPerformed //====================================================================== //====================================================================== private void stopThreads() { System.out.println("Astor exiting...."); // Stop all host controlled if (tree != null && tree.hosts != null) { for (TangoHost host : tree.hosts) { // Display a little timer during unsubscribe host.stopThread(); if (host.onEvents) { try { Thread.sleep(20); } catch (InterruptedException e) {/* Do nothing */} } } } System.out.println(); } //====================================================================== //====================================================================== public void doExit() { if (devBrowser != null && devBrowser.isVisible()) setVisible(false); else { setVisible(false); stopThreads(); System.exit(0); } } //====================================================================== //====================================================================== //====================================================================== // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JMenuItem aboutBtn; private javax.swing.JMenuItem accessControlBtn; private javax.swing.JPanel bottomPanel; private javax.swing.JMenuItem changeTgHostBtn; private javax.swing.JMenu cmdMenu; private javax.swing.JMenuItem ctrlPreferenceBtn; private javax.swing.JMenuItem deviceBrowserBtn; private javax.swing.JMenuItem distributionBtn; private javax.swing.JMenuItem exitBtn; private javax.swing.JMenuItem expandBtn; private javax.swing.JMenu fileMenu; private javax.swing.JMenu helpMenu; private javax.swing.JMenuItem jiveMenuItem; private javax.swing.JMenuItem logviewerMenuItem; private javax.swing.JLabel miniSplashLabel; private javax.swing.JProgressBar miniSplashProgressBar; private javax.swing.JLabel modeLabel; private javax.swing.JMenuItem multiServersCmdItem; private javax.swing.JMenuItem newBranchBtn; private javax.swing.JMenuItem newHostBtn; private javax.swing.JMenuItem principleHelpBtn; private javax.swing.JMenuItem releaseNoteBtn; private javax.swing.JMenuItem starterEventsItem; private javax.swing.JMenuItem starterNoEventsItem; private javax.swing.JMenuItem tangorbBtn; private javax.swing.JLabel titleLabel; private javax.swing.JMenu toolsMenu; private javax.swing.JPanel topPanel; private javax.swing.JMenuItem usePreferenceBtn; private javax.swing.JMenu viewMenu; // End of variables declaration//GEN-END:variables //====================================================================== //====================================================================== /** * @param args the command line arguments */ //====================================================================== public static void main(String[] args) { // Check if line command if (args.length > 0) { switch (args[0]) { case "-ro": System.out.println("Astor is in READ_ONLY mode !!!"); rwMode = READ_ONLY; break; case "-db_ro": System.out.println("Astor is in DB_READ_ONLY mode !!!"); rwMode = DB_READ_ONLY; break; case "-rw": System.out.println("Astor is in READ_WRITE mode !!!"); rwMode = READ_WRITE; break; default: try { new AstorCmdLine(args); } catch (DevFailed e) { Except.print_exception(e); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } System.exit(0); } } // Else start application startAstor(null); } public static void startAstor(String tangoHost){ SwingUtilities.invokeLater(() -> { long t1 = System.currentTimeMillis(); // First time, Open a simple Tango window try { Astor astor = new Astor(tangoHost); astor.setVisible(true); } catch (DevFailed e) { System.err.println(e.errors[0].desc); if (e.errors[0].desc.indexOf("Controlled access service defined in Db but unreachable") > 0) e.errors[0].desc = "Controlled access service defined in Db but unreachable\n" + "Astor cannot be configured from database !"; ErrorPane.showErrorMessage(new JFrame(), null, e); System.exit(-1); } catch (InternalError| HeadlessException e) { System.err.println(e.getMessage()); } long t2 = System.currentTimeMillis(); System.out.println("Build GUI :" + (t2 - t1) + " ms"); }); } //=============================================================== //=============================================================== //=============================================================== /** * A thread class to execute a hosts scan */ //=============================================================== private static class HostsScanThread extends Thread { private final JFrame parent; private final TangoHost[] hosts; //=============================================================== HostsScanThread(JFrame parent, TangoHost[] hosts) { this.parent = parent; this.hosts = hosts; } //=============================================================== @Override public void run() { String[][] pairs = new String[hosts.length][2]; String message = "Scanning hosts..."; Monitor monitor = new Monitor(parent, message); double ratio = 0.01; monitor.setProgressValue(ratio, "Starting..."); try { sleep(500); } catch (InterruptedException e) { /* */} try { int nbServers = 0; for (int i = 0; i < hosts.length; i++) { ratio = (1 + 1.0 * i) / hosts.length; monitor.setProgressValue(ratio, "Reading " + hosts[i].getName()); String[] servers = hosts[i].getServerAttribute(); pairs[i][0] = hosts[i].getName(); pairs[i][1] = "" + servers.length; nbServers += servers.length; } // Format results String title = nbServers + " servers on " + hosts.length + " hosts"; String[] cols = new String[]{"Names", "Nb Servers"}; PopupTable table = new PopupTable(parent, title, cols, pairs); table.setColumnWidth(new int[]{200, 100}); table.setVisible(true); } catch (DevFailed e) { ErrorPane.showErrorMessage(parent, null, e); } } } public void setTangoHost(String tangoHost){ tango_host = tangoHost; } public String getTangoHost(){ return tango_host; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy