package org.jacorb.imr.util;
/*
* JacORB - a free Java ORB
*
* Copyright (C) 1999-2014 Gerald Brose / The JacORB Team.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.Serializable;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.ListSelectionModel;
import javax.swing.ToolTipManager;
import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import org.jacorb.imr.ImRInfo;
import org.jacorb.imr.POAInfo;
import org.jacorb.imr.ServerInfo;
/**
* The GUI'ed version of the ImRManager.
*
* @author Nicolas Noffke
*
*/
public class ImRManagerGUI
extends JFrame
{
private JMenuItem m_exit_mi;
private JMenuItem m_about_mi;
private JMenuItem m_refresh_all_mi;
private JMenuItem m_connect_mi;
private JMenuItem m_shutdown_mi;
private JMenuItem m_forcedown_mi;
private JMenuItem m_save_mi;
private JMenuItem m_add_mi;
private JMenuItem m_remove_mi;
private JMenuItem m_hold_mi;
private JMenuItem m_release_mi;
private JMenuItem m_setdown_mi;
private JMenuItem m_refresh_mi;
private JMenuItem m_auto_refresh_mi;
private EventHandler m_handler;
private ImRModel m_model;
private DefaultMutableTreeNode m_top_node;
private JTree m_tree;
private JPanel m_table_panel;
private JScrollPane m_server_view;
private JScrollPane m_poa_view;
private JScrollPane m_tree_view;
private JTable m_server_table;
private JTable m_poa_table;
private JPopupMenu m_context_menu;
private JMenuItem m_add_cmi;
private JMenuItem m_remove_cmi;
private JMenuItem m_hold_cmi;
private JMenuItem m_release_cmi;
private JMenuItem m_setdown_cmi;
private JMenuItem m_refresh_cmi;
/**
* The constructor. Instanciates all components and brings up the window.
*/
public ImRManagerGUI()
{
super("ImR Manager");
m_handler = new EventHandler();
m_model = new ImRModel();
try
{
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
}
catch (Exception e)
{ }
GridBagConstraints _constraints = new GridBagConstraints();
//Build menu bar
JMenuBar _menu_bar = new JMenuBar();
setJMenuBar(_menu_bar);
JMenu _manager_menu = new JMenu("Manager");
_menu_bar.add(_manager_menu);
JMenu _imr_menu = new JMenu("ImR");
_menu_bar.add(_imr_menu);
JMenu _server_menu = new JMenu("Server");
_menu_bar.add(_server_menu);
//build manager menu entries
m_about_mi = new JMenuItem("About...");
m_about_mi.addActionListener(m_handler);
_manager_menu.add(m_about_mi);
m_auto_refresh_mi = new JMenuItem("Automatic Refresh...");
m_auto_refresh_mi.addActionListener(m_handler);
_manager_menu.add(m_auto_refresh_mi);
m_exit_mi = new JMenuItem("Exit");
m_exit_mi.addActionListener(m_handler);
_manager_menu.add(m_exit_mi);
//build ImR menu entries
m_shutdown_mi = new JMenuItem("Shutdown");
m_shutdown_mi.addActionListener(m_handler);
_imr_menu.add(m_shutdown_mi);
m_forcedown_mi = new JMenuItem("Force Down");
m_forcedown_mi.addActionListener(m_handler);
_imr_menu.add(m_forcedown_mi);
m_save_mi = new JMenuItem("Save Server Table");
m_save_mi.addActionListener(m_handler);
_imr_menu.add(m_save_mi);
_imr_menu.addSeparator();
m_connect_mi = new JMenuItem("Connect...");
m_connect_mi.addActionListener(m_handler);
_imr_menu.add(m_connect_mi);
m_refresh_all_mi = new JMenuItem("Refresh all");
m_refresh_all_mi.addActionListener(m_handler);
_imr_menu.add(m_refresh_all_mi);
//build server menu entries
m_add_mi = new JMenuItem("Add...");
m_add_mi.addActionListener(m_handler);
_server_menu.add(m_add_mi);
m_remove_mi = new JMenuItem("Remove");
m_remove_mi.addActionListener(m_handler);
_server_menu.add(m_remove_mi);
m_hold_mi = new JMenuItem("Hold");
m_hold_mi.addActionListener(m_handler);
_server_menu.add(m_hold_mi);
m_release_mi = new JMenuItem("Release");
m_release_mi.addActionListener(m_handler);
_server_menu.add(m_release_mi);
m_setdown_mi = new JMenuItem("Set Down");
m_setdown_mi.addActionListener(m_handler);
_server_menu.add(m_setdown_mi);
_server_menu.addSeparator();
m_refresh_mi = new JMenuItem("Refresh");
m_refresh_mi.addActionListener(m_handler);
_server_menu.add(m_refresh_mi);
//build popup menu
m_context_menu = new JPopupMenu("Server manipulation");
m_context_menu.setVisible(true);
m_add_cmi = new JMenuItem("Add...");
m_add_cmi.addActionListener(m_handler);
m_context_menu.add(m_add_cmi);
m_remove_cmi = new JMenuItem("Remove");
m_remove_cmi.addActionListener(m_handler);
m_context_menu.add(m_remove_cmi);
m_context_menu.addSeparator();
m_hold_cmi = new JMenuItem("Hold");
m_hold_cmi.addActionListener(m_handler);
m_context_menu.add(m_hold_cmi);
m_release_cmi = new JMenuItem("Release");
m_release_cmi.addActionListener(m_handler);
m_context_menu.add(m_release_cmi);
m_setdown_cmi = new JMenuItem("Set Down");
m_setdown_cmi.addActionListener(m_handler);
m_context_menu.add(m_setdown_cmi);
m_context_menu.addSeparator();
m_refresh_cmi = new JMenuItem("Refresh");
m_refresh_cmi.addActionListener(m_handler);
m_context_menu.add(m_refresh_cmi);
JPanel _top_panel = new JPanel();
GridBagLayout _top_gbl = new GridBagLayout();
_top_panel.setLayout(_top_gbl);
m_tree = m_model.getTree();
m_tree.setEditable(false);
m_tree.setCellRenderer(new ImRTreeCellRenderer());
m_tree.addTreeSelectionListener(m_handler);
m_tree.addMouseListener(m_handler);
ToolTipManager.sharedInstance().registerComponent(m_tree);
m_tree_view = new JScrollPane(m_tree);
m_tree_view.addMouseListener(m_handler);
m_table_panel = new JPanel();
GridBagLayout _table_gbl = new GridBagLayout();
m_table_panel.setLayout(_table_gbl);
TableModel _server_model = m_model.getServerTableModel();
m_server_table = new JTable(_server_model);
m_server_table.addMouseListener(m_handler);
ListSelectionModel _selection_model = m_server_table.getSelectionModel();
_selection_model.addListSelectionListener(m_handler);
TableColumn _host_col = m_server_table.getColumnModel().getColumn(1);
_host_col.setCellEditor(new ImRTableCellEditor(m_model.getHostSelector()));
m_server_view = new JScrollPane(m_server_table);
m_server_view.setVisible(true);
buildConstraints(_constraints, 0, 0, 1, 1, 1, 1);
_constraints.fill = GridBagConstraints.BOTH;
_table_gbl.setConstraints(m_server_view, _constraints);
m_table_panel.add(m_server_view);
TableModel _poa_model = m_model.getPOATableModel();
m_poa_table = new JTable(_poa_model);
m_poa_view = new JScrollPane(m_poa_table);
m_poa_view.setVisible(false);
buildConstraints(_constraints, 0, 0, 1, 1, 1, 1);
_constraints.fill = GridBagConstraints.BOTH;
_table_gbl.setConstraints(m_poa_view, _constraints);
m_table_panel.add(m_poa_view);
JSplitPane _split_pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
m_tree_view, m_table_panel);
_split_pane.setOneTouchExpandable(true);
_split_pane.setDividerLocation(150);
buildConstraints(_constraints, 0, 0, 1, 1, 1, 1);
_constraints.fill = GridBagConstraints.BOTH;
_top_gbl.setConstraints(_split_pane, _constraints);
_top_panel.add(_split_pane);
getContentPane().add(_top_panel);
pack();
setVisible(true);
}
/**
* Shows the POA Table in right part of SplitPane.
*/
private void showPOATable(){
if (! m_poa_view.isVisible()){
m_server_view.setVisible(false);
m_poa_view.setVisible(true);
pack();
m_table_panel.repaint();
}
}
/**
* Shows the Server Table in right part of SplitPane.
*/
private void showServerTable(){
if (! m_server_view.isVisible()){
m_poa_view.setVisible(false);
m_server_view.setVisible(true);
pack();
m_table_panel.repaint();
}
}
/**
* Convenience method for setting up the GridBagConstraints.
*
* @param gbc a GridBagConstraint object.
* @param gx x value.
* @param gy y value.
* @param gw width.
* @param gh height.
* @param wx weight x.
* @param wy weight y.
*/
private void buildConstraints(GridBagConstraints gbc, int gx, int gy,
int gw, int gh, int wx, int wy){
gbc.gridx = gx;
gbc.gridy = gy;
gbc.gridwidth = gw;
gbc.gridheight = gh;
gbc.weightx = wx;
gbc.weighty = wy;
}
/**
* Main method. Brings the GUI up.
*/
public static void main(String[] args) {
new ImRManagerGUI();
}
/**
* This class handles all occuring events.
*/
private class EventHandler
implements MouseListener, ListSelectionListener, TreeSelectionListener, ActionListener, Serializable {
// implementation of java.awt.event.ActionListener interface
/**
* This method responds to menu selections.
*
* @param event
*/
public void actionPerformed(ActionEvent event) {
Object _source = event.getSource();
if (_source instanceof JMenuItem){
if ((JMenuItem) _source == m_exit_mi)
System.exit(0);
else if ((JMenuItem) _source == m_about_mi)
JOptionPane.showMessageDialog(new JFrame(), "FUB - Institute for Computer Sciences\n\n" +
"The man with the plan: Gerald Brose\n" +
"The imp to get along with the plans: Nicolas Noffke\n");
else if ((JMenuItem) _source == m_auto_refresh_mi)
new RefreshWindow(m_model);
else if ((JMenuItem) _source == m_refresh_all_mi){
m_model.fetchServers();
showServerTable();
}
else if ((JMenuItem) _source == m_connect_mi)
new ConnectWindow(m_model);
else if ((JMenuItem) _source == m_shutdown_mi)
m_model.imrShutdown(true);
else if ((JMenuItem) _source == m_forcedown_mi)
m_model.imrShutdown(false);
else if ((JMenuItem) _source == m_save_mi)
m_model.saveTable();
else if ((JMenuItem) _source == m_add_mi ||
(JMenuItem) _source == m_add_cmi)
new AddServerWindow(m_model);
else if ((JMenuItem) _source == m_remove_mi ||
(JMenuItem) _source == m_remove_cmi){
int _select = m_server_table.getSelectedRow();
if (_select > -1)
m_model.removeServer(_select);
else{
TreePath _selected_path = m_tree.getSelectionPath();
if (_selected_path != null){
DefaultMutableTreeNode _node = (DefaultMutableTreeNode)
_selected_path.getLastPathComponent();
Object _imr_node = _node.getUserObject();
if (_imr_node instanceof ServerInfo)
m_model.removeServer(((ServerInfo) _imr_node).name);
else
System.out.println("Please select a server node!");
}
else
System.out.println("Please select a server to remove!");
}
}
else if ((JMenuItem) _source == m_hold_mi ||
(JMenuItem) _source == m_hold_cmi){
int _select = m_server_table.getSelectedRow();
if (_select > -1)
m_model.holdServer(_select);
else{
TreePath _selected_path = m_tree.getSelectionPath();
if (_selected_path != null){
DefaultMutableTreeNode _node = (DefaultMutableTreeNode)
_selected_path.getLastPathComponent();
Object _imr_node = _node.getUserObject();
if (_imr_node instanceof ServerInfo)
m_model.holdServer(((ServerInfo) _imr_node).name);
else
System.out.println("Please select a server node!");
}
else
System.out.println("Please select a server to hold!");
}
}
else if ((JMenuItem) _source == m_refresh_mi ||
(JMenuItem) _source == m_refresh_cmi){
int _select = m_server_table.getSelectedRow();
if (_select > -1)
m_model.refreshServer(_select);
else{
TreePath _selected_path = m_tree.getSelectionPath();
if (_selected_path != null){
DefaultMutableTreeNode _node = (DefaultMutableTreeNode)
_selected_path.getLastPathComponent();
Object _imr_node = _node.getUserObject();
if (_imr_node instanceof ServerInfo)
m_model.refreshServer(((ServerInfo) _imr_node).name);
else
System.out.println("Please select a server node!");
}
else
System.out.println("Please select a server to refresh!");
}
}
else if ((JMenuItem) _source == m_release_mi ||
(JMenuItem) _source == m_release_cmi){
int _select = m_server_table.getSelectedRow();
if (_select > -1)
m_model.releaseServer(_select);
else{
TreePath _selected_path = m_tree.getSelectionPath();
if (_selected_path != null){
DefaultMutableTreeNode _node = (DefaultMutableTreeNode)
_selected_path.getLastPathComponent();
Object _imr_node = _node.getUserObject();
if (_imr_node instanceof ServerInfo)
m_model.releaseServer(((ServerInfo) _imr_node).name);
else
System.out.println("Please select a server node!");
}
else
System.out.println("Please select a server to release!");
}
}
else if ((JMenuItem) _source == m_setdown_mi ||
(JMenuItem) _source == m_setdown_cmi){
int _select = m_server_table.getSelectedRow();
if (_select > -1)
m_model.setServerDown(_select);
else{
TreePath _selected_path = m_tree.getSelectionPath();
if (_selected_path != null){
DefaultMutableTreeNode _node = (DefaultMutableTreeNode)
_selected_path.getLastPathComponent();
Object _imr_node = _node.getUserObject();
if (_imr_node instanceof ServerInfo)
m_model.setServerDown(((ServerInfo) _imr_node).name);
else
System.out.println("Please select a server node!");
}
else
System.out.println("Please select a server to set down!");
}
}
}
}
// implementation of javax.swing.event.TreeSelectionListener interface
/**
* Respond to node selections in tree. Shows brings up desired table,
* and deletes the previous selection in the tables.
*
* @param event
*/
public void valueChanged(TreeSelectionEvent event) {
DefaultMutableTreeNode _select =(DefaultMutableTreeNode) (event.getPath().getLastPathComponent());
Object _node_obj = _select.getUserObject();
if (_node_obj instanceof ServerInfo){
m_poa_table.clearSelection();
m_server_table.clearSelection();
showServerTable();
}
else if (_node_obj instanceof ImRInfo){
m_server_table.clearSelection();
showServerTable();
}
else if (_node_obj instanceof POAInfo){
m_server_table.clearSelection();
ServerInfo _parent = (ServerInfo) ((DefaultMutableTreeNode)
_select.getParent()).getUserObject();
m_model.poaTableForServer(_parent);
if (m_poa_table.getRowCount() > 1){
int _row = m_model.getRow(_parent, (POAInfo) _node_obj);
m_poa_table.clearSelection();
m_poa_table.setRowSelectionInterval(_row, _row);
}
showPOATable();
}
}
// implementation of javax.swing.event.ListSelectionListener interface
/**
* Delete selection in tree, if a table row has been selected.
*
* @param event
*/
public void valueChanged(ListSelectionEvent event) {
if (! ((ListSelectionModel)event.getSource()).isSelectionEmpty())
m_tree.clearSelection();
}
// implementation of java.awt.event.MouseListener interface
/**
* Bring up popup menu.
*
* @param event
*/
public void mouseClicked(MouseEvent event) {
maybeShowContextMenu(event);
}
/**
* NOT IMPLEMENTED
*/
public void mouseEntered(MouseEvent param1) {
// NOT IMPLEMENTED
}
/**
* NOT IMPLEMENTED
*/
public void mouseExited(MouseEvent param1) {
// NOT IMPLEMENTED
}
/**
* Bring up popup menu.
*/
public void mousePressed(MouseEvent event){
maybeShowContextMenu(event);
}
/**
* Bring up popup menu.
*/
public void mouseReleased(MouseEvent event) {
maybeShowContextMenu(event);
}
/**
* Test whether to bring up popup menu, or not.
* This is the case, when a server is selected
* (in the tree or in the table).
*/
private void maybeShowContextMenu(MouseEvent event){
if (event.isPopupTrigger()){
Component _source = event.getComponent();
if (_source == m_server_table){
if (m_server_table.getSelectedRow() > -1)
m_context_menu.show(_source, event.getX(), event.getY());
}
else if (_source == m_tree){
TreePath _selected_path = m_tree.getSelectionPath();
if (_selected_path != null){
DefaultMutableTreeNode _node = (DefaultMutableTreeNode)
_selected_path.getLastPathComponent();
if (_node.getUserObject() instanceof ServerInfo)
m_context_menu.show(_source, event.getX(), event.getY());
}
}
}
}
}//EventHandler
} // ImRManagerGUI