
admin.astor.tango_release.TangoReleaseTree Maven / Gradle / Ivy
//+======================================================================
// $Source: $
//
// Project: Tango
//
// Description: java source code for display JTree
//
// $Author: pascal_verdier $
//
// Copyright (C) : 2004,2005,2006,2007,2008,2009,2009
// 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: 1.2 $
//
// $Log: $
//
//-======================================================================
package admin.astor.tango_release;
import admin.astor.Astor;
import admin.astor.AstorUtil;
import admin.astor.tools.Utils;
import fr.esrf.Tango.DevFailed;
import fr.esrf.TangoDs.TangoConst;
import fr.esrf.tangoatk.widget.util.ATKGraphicsUtils;
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.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;
public class TangoReleaseTree extends JTree implements TangoConst {
private JFrame appli;
private DefaultMutableTreeNode root;
private TangoReleaseTreePopupMenu menu;
private int mode;
private TangoServerReleaseList serverReleaseList;
private static JFileChooser fileChooser = null;
// ToDo add here new release to be checked.
private static final double[] tangoReleases = { 1.0, 2.0, 5.0, 5.2, 7.0, 8.0, 8.1 };
private static final int[] idlReleases = { 1, 2, 3, 4, 5, 6, 7, 8 };
private static ImageIcon networkIcon;
private static ImageIcon tangoIcon;
private static ImageIcon serverIcon;
private static ImageIcon classIcon;
//===============================================================
//===============================================================
public TangoReleaseTree(JFrame frame, String rootName,
TangoServerReleaseList serverReleaseList, int mode) {
this.appli = frame;
this.mode = mode;
this.serverReleaseList = serverReleaseList;
networkIcon = Utils.getResizedIcon(Utils.getTangoClassIcon(),0.33);
tangoIcon = Utils.getResizedIcon(Utils.getTangoClassIcon(),0.125);
serverIcon = Utils.getServerIcon();
classIcon = Utils.getClassIcon();
buildTree(rootName);
menu = new TangoReleaseTreePopupMenu(this);
//expandChildren(root);
setSelectionPath(null);
fileChooser = new JFileChooser(new File("").getAbsolutePath());
}
//===============================================================
//===============================================================
private void buildTree(String rootName) {
// Create the nodes.
root = new DefaultMutableTreeNode(rootName);
createCollectionClassNodes();
// Create the tree that allows one selection at a time.
getSelectionModel().setSelectionMode
(TreeSelectionModel.SINGLE_TREE_SELECTION);
// Create Tree and Tree model
DefaultTreeModel treeModel = new DefaultTreeModel(root);
setModel(treeModel);
//Enable tool tips.
ToolTipManager.sharedInstance().registerComponent(this);
// Set the icon for leaf nodes.
TangoRenderer 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 mouseClicked(java.awt.event.MouseEvent evt) {
treeMouseClicked(evt); // for tree clicked, menu,...
}
});
}
//======================================================
/*
* 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;
DefaultMutableTreeNode node =
(DefaultMutableTreeNode) selectedPath.getPathComponent(selectedPath.getPathCount() - 1);
Object userObject = node.getUserObject();
int mask = evt.getModifiers();
// Check button clicked
if ((mask & MouseEvent.BUTTON3_MASK) != 0) {
/*
if (node == root)
menu.showMenu(evt, (String) userObject);
else
*/
if (userObject instanceof ServerCollectionClass)
menu.showMenu(evt, (ServerCollectionClass) userObject);
else
if (userObject instanceof IdlCollectionClass)
menu.showMenu(evt, (IdlCollectionClass) userObject);
else
if (userObject instanceof Executable)
menu.showMenu(evt, (Executable) userObject);
else
if (userObject instanceof Instance)
if (appli instanceof Astor)
menu.showMenu(evt, (Instance) userObject);
}
}
//===============================================================
//===============================================================
@SuppressWarnings("UnusedParameters")
public void expandedPerformed(TreeExpansionEvent evt) {
}
//===============================================================
//===============================================================
private List initCollectionsByTangoRelease() {
List serverCollectionClasses = new ArrayList<>();
// Do it for specific release
for (double tangoRelease : tangoReleases) {
List servers =
serverReleaseList.getServersForTangoRelease(tangoRelease);
if (servers.size()>0) {
String text = "Tango-"+tangoRelease;
if (tangoRelease==7.0)
text = "Tango-7.x";
else
if (tangoRelease==5.2)
text += " or 6.x";
serverCollectionClasses.add(new ServerCollectionClass(text, servers));
}
}
// Do it for releases > 9.0 (the real release is now given by c++ lib)
for (int release=900 ; release<1500 ; release++) {
double tangoRelease = 0.01*release;
List servers =
serverReleaseList.getServersForTangoRelease(tangoRelease);
if (servers.size()>0) {
String text = "Tango-" + tangoRelease;
serverCollectionClasses.add(new ServerCollectionClass(text, servers));
}
}
// Add a collection for failed ones.
List onError = serverReleaseList.getServersOnError();
if (onError.size()>0)
serverCollectionClasses.add(new ServerCollectionClass("Failed", onError));
return serverCollectionClasses;
}
//===============================================================
//===============================================================
private List initCollectionsByIdlRelease() {
List idlCollectionClasses = new ArrayList<>();
for (int idlRelease : idlReleases) {
List servers =
serverReleaseList.getClassesForIdlRelease(idlRelease);
if (servers.size()>0)
idlCollectionClasses.add(new IdlCollectionClass("Device_"+idlRelease+"Impl", servers));
}
return idlCollectionClasses;
}
//===============================================================
//===============================================================
private void createCollectionClassNodes() {
// Build collections (depending on mode)
switch (mode) {
case TangoReleaseDialog.byTango:
List serverCollectionClasses = initCollectionsByTangoRelease();
// Build collection nodes
for (ServerCollectionClass serverCollectionClass : serverCollectionClasses) {
DefaultMutableTreeNode tangoNode =
new DefaultMutableTreeNode(serverCollectionClass);
root.add(tangoNode);
// Declare a map to split server name on executable/instance
HashMap executableNodes = new HashMap<>();
// Build server nodes
for (TangoServerRelease serverRelease : serverCollectionClass.servers) {
DefaultMutableTreeNode exeNode = executableNodes.get(serverRelease.exeName);
if (exeNode==null) {
exeNode = new DefaultMutableTreeNode(new Executable(serverRelease.exeName));
executableNodes.put(serverRelease.exeName, exeNode);
tangoNode.add(exeNode);
}
DefaultMutableTreeNode instanceNode = new DefaultMutableTreeNode(new Instance(serverRelease));
exeNode.add(instanceNode);
// Build class nodes.
for (TangoClassRelease classRelease : serverRelease) {
instanceNode.add(new DefaultMutableTreeNode(classRelease));
}
}
}
break;
case TangoReleaseDialog.byIDL:
List idlCollectionClasses = initCollectionsByIdlRelease();
for (IdlCollectionClass idlCollectionClass : idlCollectionClasses) {
DefaultMutableTreeNode idlNode =
new DefaultMutableTreeNode(idlCollectionClass);
root.add(idlNode);
for (TangoClassRelease classRelease : idlCollectionClass.classes) {
DefaultMutableTreeNode classNode =
new DefaultMutableTreeNode(classRelease);
idlNode.add(classNode);
classNode.add(new DefaultMutableTreeNode(classRelease.serverName));
}
}
break;
}
}
//======================================================
//======================================================
private DefaultMutableTreeNode getSelectedNode() {
return (DefaultMutableTreeNode) getLastSelectedPathComponent();
}
//======================================================
//======================================================
Object getSelectedObject() {
DefaultMutableTreeNode node = getSelectedNode();
if (node == null)
return null;
return node.getUserObject();
}
//===============================================================
//===============================================================
@SuppressWarnings("UnusedDeclaration")
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 list = new ArrayList<>();
list.add(node);
while (node != root) {
node = (DefaultMutableTreeNode) node.getParent();
list.add(0, node);
}
TreeNode[] tn = list.toArray(new TreeNode[list.size()]);
TreePath tp = new TreePath(tn);
setSelectionPath(tp);
scrollPathToVisible(tp);
}
//===============================================================
//===============================================================
private void saveCollection() {
if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
if (file != null) {
if (!file.isDirectory()) {
String fileName = file.getAbsolutePath();
if (new File(fileName).exists()) {
if (JOptionPane.showConfirmDialog(this,
"The File " + fileName + " Already Exists !\n\n" +
"Would you like to overwrite ?",
"information",
JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION)
return;
}
String title = getSelectedObject().toString();
String text = title + "\n\n" + getCollectionText();
try {
AstorUtil.writeFile(fileName, text);
}
catch (DevFailed e) {
ErrorPane.showErrorMessage(this, null, e);
}
}
}
}
}
//===============================================================
//===============================================================
private void displayCollection() {
String title = getSelectedObject().toString();
String text = getCollectionText();
admin.astor.tools.PopupText popupText =
new admin.astor.tools.PopupText(appli);
popupText.setTitle(title);
popupText.addText(text);
popupText.setSize(400, 500);
popupText.setVisible(true);
}
//===============================================================
//===============================================================
private String getCollectionText() {
DefaultMutableTreeNode node = getSelectedNode();
StringBuilder sb = new StringBuilder();
Object object = node.getUserObject();
if (object instanceof ServerCollectionClass) {
for (int i=0 ; i=1.0) {
String strRelease = String.format("%4.2f", server.releaseNumber);
if (strRelease.endsWith("0"))
strRelease = strRelease.substring(0, strRelease.length()-1);
name += " (Tango-"+ strRelease + ")";
}
else
name += " (" + server.error + ")";
}
//===========================================================
public String toString() {
return name;
}
//===========================================================
}
//===============================================================
/*
* ServerCollectionClass object definition
*/
//===============================================================
private class ServerCollectionClass {
String name;
List servers;
//===========================================================
private ServerCollectionClass(String name, List servers) {
this.name = name;
this.servers = servers;
}
//===========================================================
public String toString() {
return name + " (" + servers.size() + ")";
}
//===========================================================
}
//===============================================================
/*
* IdlCollectionClass object definition
*/
//===============================================================
private class IdlCollectionClass {
String name;
List classes;
//===========================================================
private IdlCollectionClass(String name, List classes) {
this.name = name;
this.classes = classes;
}
//===========================================================
public String toString() {
return name + " (" + classes.size() + ")";
}
//===========================================================
}
//===============================================================
/**
* Renderer Class
*/
//===============================================================
private class TangoRenderer extends DefaultTreeCellRenderer {
private final Font titleFont = new Font("Dialog", Font.BOLD, 18);
private final Font branchFont = new Font("Dialog", Font.BOLD, 14);
private final Font serverFont = new Font("Dialog", Font.BOLD, 12);
private final Font classFont = new Font("Dialog", Font.PLAIN, 12);
//===============================================================
//===============================================================
public Component getTreeCellRendererComponent(
JTree tree,
Object obj,
boolean sel,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {
super.getTreeCellRendererComponent(
tree, obj, sel,
expanded, leaf, row,
hasFocus);
setBackgroundNonSelectionColor(Color.white);
setForeground(Color.black);
setBackgroundSelectionColor(Color.lightGray);
if (obj==root) {
setFont(titleFont);
setIcon(networkIcon);
} else {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) obj;
if (node.getUserObject() instanceof ServerCollectionClass ||
node.getUserObject() instanceof IdlCollectionClass) {
setFont(branchFont);
setIcon(tangoIcon);
}
else
if (node.getUserObject() instanceof Executable ||
node.getUserObject() instanceof Instance) {
setFont(serverFont);
setIcon(serverIcon);
}
else
if (node.getUserObject() instanceof TangoClassRelease) {
setFont(classFont);
setIcon(classIcon);
}
}
return this;
}
}// End of Renderer Class
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
static private final int ROOT_OPTION = 0;
static private final int IN_TEXT_AREA = 1;
static private final int SAVE = 2;
static private final int OPEN_PANEL = 3;
static private final int OFFSET = 2; // Label And separator
static private String[] menuLabels = {
"Root Options",
"Display in Text Area",
"Save",
"Open server panel",
};
private class TangoReleaseTreePopupMenu extends JPopupMenu {
private JTree tree;
private JLabel title;
private TangoReleaseTreePopupMenu(JTree tree) {
this.tree = tree;
buildBtnPopupMenu();
}
//=======================================================
/**
* Create a Popup menu for host control
*/
//=======================================================
private void buildBtnPopupMenu() {
title = new JLabel();
title.setFont(new java.awt.Font("Dialog", Font.BOLD, 16));
add(title);
add(new JPopupMenu.Separator());
for (String menuLabel : menuLabels) {
if (menuLabel == null)
add(new Separator());
else {
JMenuItem btn = new JMenuItem(menuLabel);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
hostActionPerformed(evt);
}
});
add(btn);
}
}
}
//======================================================
/*
* Show menu on root
*/
//======================================================
public void showMenu(MouseEvent evt, String name) {
// Set selection at mouse position
TreePath selectedPath =
tree.getPathForLocation(evt.getX(), evt.getY());
if (selectedPath == null)
return;
tree.setSelectionPath(selectedPath);
title.setText(name);
// Reset all items
for (int i = 0; i < menuLabels.length; i++)
getComponent(OFFSET + i).setVisible(false);
//noinspection PointlessArithmeticExpression
getComponent(OFFSET + ROOT_OPTION).setVisible(true);
show(tree, evt.getX(), evt.getY());
}
//======================================================
/*
* Show menu on Collection of servers
*/
//======================================================
public void showMenu(MouseEvent evt, ServerCollectionClass serverCollectionClass) {
// Set selection at mouse position
TreePath selectedPath =
tree.getPathForLocation(evt.getX(), evt.getY());
if (selectedPath == null)
return;
tree.setSelectionPath(selectedPath);
title.setText(serverCollectionClass.toString());
// Reset all items
for (int i = 0; i < menuLabels.length; i++)
getComponent(OFFSET + i).setVisible(false);
getComponent(OFFSET + IN_TEXT_AREA).setVisible(true);
getComponent(OFFSET + SAVE).setVisible(true);
show(tree, evt.getX(), evt.getY());
}
//======================================================
/*
* Show menu on Collection of IDL
*/
//======================================================
public void showMenu(MouseEvent evt, IdlCollectionClass idlCollectionClass) {
// Set selection at mouse position
TreePath selectedPath =
tree.getPathForLocation(evt.getX(), evt.getY());
if (selectedPath == null)
return;
tree.setSelectionPath(selectedPath);
title.setText(idlCollectionClass.toString());
// Reset all items
for (int i = 0; i < menuLabels.length; i++)
getComponent(OFFSET + i).setVisible(false);
getComponent(OFFSET + IN_TEXT_AREA).setVisible(true);
getComponent(OFFSET + SAVE).setVisible(true);
show(tree, evt.getX(), evt.getY());
}
//======================================================
/*
* Show menu on Executable
*/
//======================================================
public void showMenu(MouseEvent evt, Executable executable) {
// Set selection at mouse position
TreePath selectedPath =
tree.getPathForLocation(evt.getX(), evt.getY());
if (selectedPath == null)
return;
tree.setSelectionPath(selectedPath);
title.setText(executable.toString());
// Reset all items
for (int i = 0; i < menuLabels.length; i++)
getComponent(OFFSET + i).setVisible(false);
getComponent(OFFSET + IN_TEXT_AREA).setVisible(true);
getComponent(OFFSET + SAVE).setVisible(true);
show(tree, evt.getX(), evt.getY());
}
//======================================================
/*
* Show menu on Device
*/
//======================================================
public void showMenu(MouseEvent evt, Instance instance) {
// Set selection at mouse position
TreePath selectedPath =
tree.getPathForLocation(evt.getX(), evt.getY());
if (selectedPath == null)
return;
tree.setSelectionPath(selectedPath);
title.setText(instance.server.name);
// Reset all items
for (int i = 0; i < menuLabels.length; i++)
getComponent(OFFSET + i).setVisible(false);
// Only if appli is Astor
getComponent(OFFSET + OPEN_PANEL).setVisible(true);
show(tree, evt.getX(), evt.getY());
}
//======================================================
private void hostActionPerformed(ActionEvent evt) {
// Check component source
Object obj = evt.getSource();
int commandIndex = 0;
for (int i = 0; i < menuLabels.length; i++)
if (getComponent(OFFSET + i) == obj)
commandIndex = i;
switch (commandIndex) {
case ROOT_OPTION:
break;
case IN_TEXT_AREA:
displayCollection();
break;
case SAVE:
saveCollection();
break;
case OPEN_PANEL:
{
Object object = getSelectedObject();
if (object instanceof Instance) {
String server = ((Instance) object).server.name;
if (appli instanceof Astor)
((Astor)appli).tree.displayHostInfo("dserver/"+server);
}
}
break;
}
}
//======================================================
}
//==========================================================
//==========================================================
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy