/*
* Copyright 2003,2004 Colin Crist
*
* 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 hermes.browser.dialog;
import hermes.Domain;
import hermes.Hermes;
import hermes.browser.HermesBrowser;
import hermes.browser.model.DestinationConfigTableModel;
import hermes.browser.tasks.EditDestinationPropertiesTask;
import hermes.config.ConnectionConfig;
import hermes.config.DestinationConfig;
import hermes.config.FactoryConfig;
import hermes.config.SessionConfig;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.naming.NamingException;
import javax.swing.BorderFactory;
import javax.swing.JFileChooser;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import org.apache.log4j.Category;
import com.jidesoft.grid.SortableTable;
/**
* @author colincrist@hermesjms.com
* @version $Id: DestinationConfigPanel.java,v 1.7 2004/07/30 17:25:15
* colincrist Exp $
*/
public class DestinationConfigPanel extends JPanel
{
/**
*
*/
private static final long serialVersionUID = -9161130471970874426L;
private static final String IMPORT = "Import...";
private static final String REMOVE = "Remove";
private static final String ADD_SIMPLE = "Add...";
private static final String EDIT_SIMPLE = "Edit...";
private static final String DESTINATIONS = "Destinations";
private static final Category cat = Category.getInstance(DestinationConfigPanel.class);
private static File lastImportDirectory = null;
private PreferencesDialog dialog;
private FactoryConfig factoryConfig;
private SortableTable destinationTable = new SortableTable();
private JScrollPane destinationTableSP = new JScrollPane();
private DestinationConfigTableModel destinationTableModel;
private MouseAdapter mouseAdapter;
private Map configs = new HashMap();
public DestinationConfigPanel(PreferencesDialog dialog)
{
this.dialog = dialog;
init();
}
public void reset() {
while(destinationTableModel.getRowCount() > 0) {
destinationTableModel.removeRow(0);
}
updateModel();
}
public void init()
{
Border border = BorderFactory.createBevelBorder(BevelBorder.RAISED);
setBorder(BorderFactory.createTitledBorder(border, DESTINATIONS));
setLayout(new GridLayout(1, 1));
destinationTableSP.setViewportView(destinationTable);
destinationTable.setSortable(true);
add(destinationTableSP);
final JPopupMenu popupMenu = new JPopupMenu();
final JMenuItem add1Item = new JMenuItem(ADD_SIMPLE);
final JMenuItem removeItem = new JMenuItem(REMOVE);
final JMenuItem importItem = new JMenuItem(IMPORT);
popupMenu.add(add1Item);
popupMenu.add(removeItem);
popupMenu.add(importItem);
importItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
if (JOptionPane.showConfirmDialog(DestinationConfigPanel.this, "The input file must contain a single topic or queue name per line",
"Import topics/queues", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION)
{
JFileChooser fileChooser;
if (lastImportDirectory == null)
{
fileChooser = new JFileChooser();
}
else
{
fileChooser = new JFileChooser(lastImportDirectory);
}
if (fileChooser.showOpenDialog(dialog) == JFileChooser.APPROVE_OPTION)
{
lastImportDirectory = new File(fileChooser.getSelectedFile().getPath());
try
{
LineNumberReader reader = new LineNumberReader(new FileReader(fileChooser.getSelectedFile()));
String line;
while ((line = reader.readLine()) != null)
{
DestinationConfig dConfig = new DestinationConfig();
dConfig.setName(line.trim());
dConfig.setDomain(Domain.QUEUE.getId());
destinationTableModel.addItem(dConfig);
}
}
catch (IOException e)
{
cat.error(e.getMessage(), e);
}
}
dialog.setDirty();
}
}
});
add1Item.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
try
{
ConnectionConfig cConfig = (ConnectionConfig) factoryConfig.getConnection().get(0);
SessionConfig sConfig = (SessionConfig) cConfig.getSession().get(0);
DestinationConfig dConfig = new DestinationConfig() ;
dConfig.setDomain(Domain.QUEUE.getId()) ;
dConfig.setName("NEW") ;
destinationTableModel.addItem(dConfig) ;
doEdit(sConfig.getId(), dConfig);
dialog.setDirty();
}
catch (Exception ex)
{
cat.error(ex.getMessage(), ex);
}
}
});
removeItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
for (int row : destinationTable.getSelectedRows())
{
if (row >= 0)
{
int realRow = destinationTable.getActualRowAt(row);
destinationTableModel.removeRow(realRow);
dialog.setDirty();
}
}
}
});
mouseAdapter = new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
if (SwingUtilities.isRightMouseButton(e))
{
if (e.getComponent() == destinationTableSP)
{
removeItem.setEnabled(false);
}
else
{
removeItem.setEnabled(true);
}
popupMenu.show(e.getComponent(), e.getX(), e.getY());
}
else if (e.getClickCount() == 2)
{
int row = destinationTable.getActualRowAt(destinationTable.getSelectedRow());
if (row >= 0)
{
ConnectionConfig cConfig = (ConnectionConfig) factoryConfig.getConnection().get(0);
SessionConfig sConfig = (SessionConfig) cConfig.getSession().get(0);
doEdit(sConfig.getId(), destinationTableModel.getRowConfig(row));
}
}
}
};
destinationTable.addMouseListener(mouseAdapter);
destinationTableSP.addMouseListener(mouseAdapter);
destinationTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
}
public void setFactoryConfig(FactoryConfig factoryConfig)
{
this.factoryConfig = factoryConfig;
destinationTableModel = new DestinationConfigTableModel(factoryConfig.getDestination());
destinationTable.setModel(destinationTableModel);
}
public void doEdit(String hermesId, DestinationConfig dConfig)
{
try
{
Hermes.ui.getThreadPool().invokeLater(
new EditDestinationPropertiesTask((Hermes) HermesBrowser.getBrowser().getLoader().getContext().lookup(hermesId), dConfig, new Runnable()
{
public void run()
{
// Hack.
destinationTableModel.fireTableDataChanged() ;
}
}));
}
catch (NamingException e)
{
HermesBrowser.getBrowser().showErrorDialog(e);
}
}
public Collection getDestinations()
{
return destinationTableModel == null ? Collections.EMPTY_LIST : destinationTableModel.getRows();
}
public void updateModel()
{
if (factoryConfig != null)
{
factoryConfig.getDestination().clear();
factoryConfig.getDestination().addAll(destinationTableModel.getRows());
}
else
{
cat.error("updateModel() factoryConfig is null");
}
}
}