/* * Copyright to the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.rioproject.tools.ui.discovery; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Vector; import javax.swing.*; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableColumn; import net.jini.discovery.DiscoveryGroupManagement; import net.jini.discovery.DiscoveryManagement; import org.rioproject.impl.discovery.RecordingDiscoveryListener; import org.rioproject.impl.discovery.ReggieStat; /** * Discovery group selector */ public class GroupSelector extends JPanel { private JTable groupTable; private GroupModel model; public GroupSelector(final DiscoveryManagement dMgr, final RecordingDiscoveryListener rdl, final JDialog dialog) { super(new BorderLayout(8, 8)); if(rdl==null) throw new IllegalArgumentException("rdl is null"); groupTable = new JTable(); JButton okay = new JButton(); JButton apply = new JButton(); JButton dismiss = new JButton(); JButton refresh = new JButton(); okay.setText("OK"); okay.setToolTipText("Apply choices and close the dialog"); apply.setText("Apply"); apply.setToolTipText("Apply choices"); dismiss.setText("Close"); dismiss.setToolTipText("Close the dialog"); refresh.setText("Refresh"); refresh.setToolTipText("Refresh list of groups"); groupTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); groupTable.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { int row = groupTable.getSelectedRow(); GroupModel model = (GroupModel)groupTable.getModel(); Boolean b = (Boolean)model.getValueAt(row, 0); GroupItem gi = (GroupItem)model.getItem(row); gi.include = !b; model.setValueAt(gi, row); } }); model = new GroupModel(); groupTable.setModel(model); groupTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); TableColumn col = groupTable.getColumnModel().getColumn(0); col.setPreferredWidth(60); col.setMaxWidth(60); fillGroups(dMgr, rdl); refresh.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { fillGroups(dMgr, rdl); } }); okay.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { setGroups(dMgr); dialog.dispose(); } }); apply.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { setGroups(dMgr); } }); dismiss.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { dialog.dispose(); } }); JPanel buttons = new JPanel(); buttons.add(apply); buttons.add(okay); buttons.add(refresh); buttons.add(dismiss); JLabel groupsLabel = new JLabel(); groupsLabel.setText("Advertised Groups Available:"); add(groupsLabel, BorderLayout.NORTH); add(new JScrollPane(groupTable), BorderLayout.CENTER); add(buttons, BorderLayout.SOUTH); } private void fillGroups(DiscoveryManagement dMgr, RecordingDiscoveryListener rdl) { String[] configured = ((DiscoveryGroupManagement)dMgr).getGroups(); boolean allGroups = false; if(configured == DiscoveryGroupManagement.ALL_GROUPS) { allGroups = true; } if(((DiscoveryGroupManagement)rdl.getDiscoveryManagement()).getGroups() != DiscoveryGroupManagement.NO_GROUPS) { ReggieStat[] rStats = rdl.getReggieStats(ReggieStat.DISCOVERED); List<String> list = new ArrayList<String>(); for (ReggieStat rStat : rStats) { String[] groups = rStat.getGroups(); for (String group1 : groups) { String group = group1; if (group==null) group = "ALL_GROUPS"; if (list.contains(group)) continue; list.add(group); } } for (String group : list) { GroupItem gi = new GroupItem(group); if (!allGroups) { boolean include = false; for (String aConfigured : configured) { if (group.equals(aConfigured)) { include = true; break; } } gi.include = include; } if (!model.hasItem(gi)) model.addItem(gi); } } } private void setGroups(final DiscoveryManagement dMgr) { final Runnable doSetGroup = new Runnable() { public void run() { try { GroupModel model = (GroupModel)groupTable.getModel(); ((DiscoveryGroupManagement)dMgr).setGroups( model.getSelectedGroups()); } catch(IOException e) { e.printStackTrace(); } } }; new Thread() { public void run() { try { SwingUtilities.invokeAndWait(doSetGroup); } catch(Exception e) { e.printStackTrace(); } } }.start(); } /** * Get the dialog for the Group selector * * @param frame The parent frame * @param dMgr The DiscoveryManagement to use * @param rdl The RecordingDiscoveryListener * @return The JDialog which will encapsulate the ReggieStatPanel */ public static JDialog getDialog(JFrame frame, DiscoveryManagement dMgr, RecordingDiscoveryListener rdl) { JDialog dialog = new JDialog(frame, "Discovery Group Selection", true); GroupSelector gs = new GroupSelector(dMgr, rdl, dialog); dialog.getContentPane().add(gs); int width = 380; int height = 340; dialog.pack(); dialog.setSize(width, height); //dialog.setResizable(false); dialog.setModal(true); dialog.setLocationRelativeTo(frame); return (dialog); } class GroupModel extends AbstractTableModel { Vector<GroupItem> tableData = new Vector<GroupItem>(); final String[] columnNames = {"Include", "Group Name"}; public Object getValueAt(int index, int columnIndex) { try { GroupItem gi = tableData.elementAt(index); switch(columnIndex) { case 0: return (gi.include); case 1: return (gi.name); default: return (null); } } catch(Exception e) { e.printStackTrace(); } return (null); } public String[] getSelectedGroups() { List<String> list = new ArrayList<String>(); GroupItem[] gis = getItems(); for (GroupItem gi : gis) { if (gi.include) list.add(gi.name); } return list.toArray(new String[list.size()]); } GroupItem[] getItems() { return tableData.toArray(new GroupItem[tableData.size()]); } boolean hasItem(GroupItem item) { return(tableData.contains(item)); } public void addItem(GroupItem item) { int rowNum = tableData.size(); tableData.insertElementAt(item, rowNum); fireTableRowsInserted(rowNum, rowNum); } public Object getItem(int row) { return (tableData.elementAt(row)); } public int getColumnCount() { return (columnNames.length); } public int getRowCount() { return (tableData.size()); } public String getColumnName(int column) { return (columnNames[column]); } public void setValueAt(GroupItem item, int rowNum) { tableData.setElementAt(item, rowNum); fireTableRowsUpdated(rowNum, rowNum); } public Class getColumnClass(int c) { if(c == 0) return (Boolean.class); return (super.getColumnClass(c)); } public boolean isCellEditable(int row, int col) { return ((col == 0)); } } class GroupItem { String name; Boolean include = true; GroupItem(String name) { this.name = name; } public int hashCode() { return(name.hashCode()); } public boolean equals(Object o) { return this == o || !(o == null || getClass() != o.getClass()) && (name.equals(((GroupItem) o).name)); } } }