package hermes.browser.dialog.message;
import hermes.Domain;
import hermes.browser.HermesBrowser;
import hermes.browser.components.EditedMessageHandler;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.jms.BytesMessage;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.TextMessage;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import org.apache.log4j.Logger;
import com.jidesoft.swing.JideTabbedPane;
public class MessageEditorDialog extends JDialog {
private static final long serialVersionUID = 8270616550261160182L;
private static final Logger log = Logger.getLogger(MessageEditorDialog.class);
private final JPanel topPanel = new JPanel();
private final String destinationName;
private final Domain domain;
private final EditedMessageHandler onOK;
private final JideTabbedPane tabbedPane = new JideTabbedPane(JTabbedPane.TOP);
private JMSHeaderPropertyPanel headerPropertyPanel;
private UserHeaderPropertyPanel userHeaderPropertyPanel;
private MessageWriter messageWriter;
/**
* Launch the application.
*/
public static void main(String[] args) {
try {
MessageEditorDialog dialog = new MessageEditorDialog(null, null);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
public static boolean canEdit(Message message) {
return message == null || message instanceof Message || message instanceof TextMessage || message instanceof MapMessage || message instanceof BytesMessage;
}
/**
* Create the dialog.
*/
public MessageEditorDialog(final Message message, String destinationName, Domain domain, final EditedMessageHandler onOK) throws JMSException {
this("Send message to " + destinationName, message, destinationName, domain, onOK, "Send", "Done");
setModal(false);
}
public MessageEditorDialog(final Message message, final EditedMessageHandler onOK) throws JMSException {
this("Edit Message", message, null, null, onOK, "OK", "Cancel");
setModal(true);
}
public MessageEditorDialog(final String title, final Message message, String destinationName, Domain domain, final EditedMessageHandler onOK, String okText, String cancelText) throws JMSException {
super(HermesBrowser.getBrowser());
if (!canEdit(message)) {
throw new JMSException("Unsupported message type");
}
this.onOK = onOK;
this.destinationName = destinationName;
this.domain = domain;
setTitle(title);
setBounds(100, 100, 700, 400);
topPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
topPanel.setLayout(new BorderLayout(0, 0));
getContentPane().setLayout(new BorderLayout());
getContentPane().add(topPanel, BorderLayout.CENTER);
{
topPanel.add(tabbedPane);
{
headerPropertyPanel = new JMSHeaderPropertyPanel();
JPanel panel = new JPanel(new GridBagLayout());
panel.add(headerPropertyPanel);
tabbedPane.addTab("JMS Header", null, panel, null);
}
{
userHeaderPropertyPanel = new UserHeaderPropertyPanel(message);
tabbedPane.addTab("User Header", null, userHeaderPropertyPanel, null);
}
}
headerPropertyPanel.setMessage(message, destinationName, domain);
{
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
getContentPane().add(buttonPane, BorderLayout.SOUTH);
{
JButton okButton = new JButton(okText);
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (isModal()) {
MessageEditorDialog.this.dispose();
}
if (onOK != null) {
onOK();
}
}
});
okButton.setActionCommand("OK");
buttonPane.add(okButton);
getRootPane().setDefaultButton(okButton);
}
{
JButton cancelButton = new JButton(cancelText);
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
MessageEditorDialog.this.dispose();
}
});
cancelButton.setActionCommand("Cancel");
buttonPane.add(cancelButton);
}
}
if (message == null) {
messageWriter = new TextMessagePayloadPanel();
} else if (message instanceof TextMessage) {
messageWriter = new TextMessagePayloadPanel((TextMessage) message);
} else if (message instanceof MapMessage) {
messageWriter = new MapMessagePayloadPanel((MapMessage) message, true);
} else if (message instanceof BytesMessage) {
messageWriter = new BytesMessagePayloadPanel((BytesMessage) message);
} else {
messageWriter = new CannotEditMessageWriter(message);
}
tabbedPane.addTab("Payload", messageWriter);
headerPropertyPanel.getMessageTypeComboBox().getModel().addListDataListener(new ListDataListener() {
@Override
public void intervalRemoved(ListDataEvent e) {
}
@Override
public void intervalAdded(ListDataEvent e) {
}
@Override
public void contentsChanged(ListDataEvent e) {
MessageType type = (MessageType) headerPropertyPanel.getMessageTypeComboBox().getModel().getSelectedItem();
if (messageWriter != null) {
tabbedPane.remove(messageWriter);
}
try {
messageWriter = createWriterForType(type);
if (messageWriter != null) {
tabbedPane.addTab("Payload", messageWriter);
}
} catch (JMSException ex) {
HermesBrowser.getBrowser().showErrorDialog(ex);
}
}
});
}
private MessageWriter createWriterForType(MessageType type) throws JMSException {
switch (type) {
case TextMessage:
return new TextMessagePayloadPanel();
case MapMessage:
return new MapMessagePayloadPanel();
case BytesMessage:
return new BytesMessagePayloadPanel();
}
return new CannotEditMessageWriter();
}
protected void onOK() {
try {
Message newMessage = headerPropertyPanel.createMessage(onOK);
userHeaderPropertyPanel.setProperties(newMessage);
if (messageWriter != null) {
messageWriter.onMessage(newMessage);
}
onOK.onMessage(newMessage);
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
HermesBrowser.getBrowser().showErrorDialog(ex.getMessage(), ex);
}
}
}