/*
* 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.components;
import hermes.Domain;
import hermes.Hermes;
import hermes.HermesException;
import hermes.HermesRuntimeException;
import hermes.JNDIContextFactory;
import hermes.browser.HermesBrowser;
import hermes.browser.actions.AbstractEditedMessageHandler;
import hermes.browser.dialog.BindToolDialog;
import hermes.browser.dialog.message.MessageEditorDialog;
import hermes.browser.model.BrowserTreeModel;
import hermes.browser.model.tree.DestinationConfigTreeNode;
import hermes.browser.model.tree.HermesTreeNode;
import hermes.browser.model.tree.MessageStoreDestinationTreeNode;
import hermes.browser.model.tree.MessageStoreTreeNode;
import hermes.browser.model.tree.MessageStoreURLTreeNode;
import hermes.browser.model.tree.NamingConfigTreeNode;
import hermes.browser.model.tree.RepositoryTreeNode;
import hermes.browser.tasks.AddToMessageStoreTask;
import hermes.browser.tasks.SendMessageTask;
import hermes.browser.transferable.BrowserTreeTransferHandler;
import hermes.browser.transferable.HermesAdministeredObjectTransferable;
import hermes.browser.transferable.HermesConfigGroup;
import hermes.browser.transferable.JMSAdministeredObjectTransferable;
import hermes.browser.transferable.JMSMessagesTransferable;
import hermes.browser.transferable.MessageGroup;
import hermes.browser.transferable.MessagesTransferable;
import hermes.config.DestinationConfig;
import hermes.config.FactoryConfig;
import hermes.impl.HTMLBeanHelper;
import hermes.store.MessageStore;
import hermes.swing.actions.ActionRegistry;
import hermes.swing.actions.BrowseDestinationOrContextAction;
import hermes.util.TextUtils;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TooManyListenersException;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.naming.NamingException;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JTree;
import javax.swing.TransferHandler;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import org.apache.log4j.Logger;
import com.jidesoft.document.DocumentComponent;
import com.jidesoft.swing.JideSwingUtilities;
import com.xduke.xswing.DataTipManager;
/**
* The main tree holding sessions, queues, topics, contexts etc etc.
*
* @author colincrist@hermesjms.com
* @version $Id: BrowserTree.java,v 1.57 2007/02/18 16:13:39 colincrist Exp $
*/
public class BrowserTree extends JTree implements TreeSelectionListener, DropTargetListener {
/**
*
*/
private static final long serialVersionUID = -4898641148498137544L;
private static final Logger log = Logger.getLogger(BrowserTree.class);
private List<JMenuItem> menuItems = new ArrayList<JMenuItem>();
private BrowserTreeModel model;
private DataFlavor[] myFlavours;
private JPopupMenu popupMenu;
private HermesTreeNode lastSelectedHermesTreeNode;
private int lastDndAction;
/**
* BrowserTree constructor comment.
*/
public BrowserTree() throws HermesException {
super();
model = new BrowserTreeModel();
setModel(model);
setTransferHandler(new BrowserTreeTransferHandler());
setDragEnabled(true);
}
public int getLastDndAction() {
return lastDndAction;
}
public void setLastDnDAction(int lastDndAction) {
this.lastDndAction = lastDndAction;
}
/**
* Get the model correctly typed.
*
* @return
*/
public BrowserTreeModel getBrowserModel() {
return (BrowserTreeModel) getModel();
}
public Collection<MessageStore> getMessageStores() {
return model.getMessageStores();
}
public void remove(MessageStoreURLTreeNode node) {
MutableTreeNode parent = (MutableTreeNode) node.getParent();
node.close();
parent.remove(node);
getBrowserModel().nodeStructureChanged(parent);
}
public void remove(MessageStoreTreeNode node) {
MutableTreeNode parent = (MutableTreeNode) node.getParent();
node.close();
parent.remove(node);
getBrowserModel().nodeStructureChanged(parent);
}
/**
* Is there a selection in the tree?
*
* @return true if there is a selection, false if none.
*/
public boolean hasSelection() {
return getSelectionPath() != null && getSelectionPath().getLastPathComponent() != null;
}
/**
* Returns the last object in the lead selection
*/
public Object getLastSelectedPathComponent() {
return getSelectionPath().getLastPathComponent();
}
public DestinationConfigTreeNode getFirstSelectedDestinationNode() {
List<DestinationConfigTreeNode> nodes = getSelectedDestinationNodes();
if (nodes.size() > 0) {
return nodes.get(0);
} else {
return null;
}
}
/**
* If there is queue or topic in the selection path, return it, otherwise
* return null.
*/
public List<DestinationConfigTreeNode> getSelectedDestinationNodes() {
final TreePath[] paths = getSelectionPaths();
final List<DestinationConfigTreeNode> rval = new ArrayList<DestinationConfigTreeNode>();
if (paths != null) {
for (int i = 0; i < paths.length; i++) {
if (paths[i].getLastPathComponent() instanceof DestinationConfigTreeNode) {
rval.add((DestinationConfigTreeNode) paths[i].getLastPathComponent());
}
}
}
return rval;
}
public Destination getSelectedMessageStoreDestination() {
if (getSelectionPath() != null && getSelectionPath().getLastPathComponent() instanceof MessageStoreDestinationTreeNode) {
return ((MessageStoreDestinationTreeNode) getSelectionPath().getLastPathComponent()).getDestination();
} else {
return null;
}
}
public MessageStore getSelectedMessageStore() {
if (getSelectionPath() != null) {
if (getSelectionPath().getLastPathComponent() instanceof MessageStoreTreeNode) {
return ((MessageStoreTreeNode) getSelectionPath().getLastPathComponent()).getMessageStore();
} else if (getSelectionPath().getLastPathComponent() instanceof MessageStoreDestinationTreeNode) {
MessageStoreDestinationTreeNode dNode = (MessageStoreDestinationTreeNode) getSelectionPath().getLastPathComponent();
return ((MessageStoreTreeNode) dNode.getParent()).getMessageStore();
} else if (getSelectionPath().getLastPathComponent() instanceof RepositoryTreeNode) {
RepositoryTreeNode dNode = (RepositoryTreeNode) getSelectionPath().getLastPathComponent();
return dNode.getRepository();
}
}
return null;
}
public Hermes getHermesAsMessageFactory() throws HermesException {
if (!TextUtils.isEmpty(HermesBrowser.getBrowser().getConfig().getMessageStoreMessageFactory())) {
try {
Hermes hermes = (Hermes) HermesBrowser.getBrowser().getContext().lookup(HermesBrowser.getBrowser().getConfig().getMessageStoreMessageFactory());
if (hermes != null) {
return hermes;
}
} catch (NamingException ex) {
log.info("cannot find configured message store message factory, using one from the tree instead: " + ex.getMessage(), ex);
}
}
if (getLastSelectedHermesTreeNode() == null) {
return getBrowserModel().getFirstHermesTreeNode().getHermes();
} else {
return getLastSelectedHermesTreeNode().getHermes();
}
}
/**
* Returns the last Hermes session node that was in a selection path.
*/
public HermesTreeNode getLastSelectedHermesTreeNode() {
if (lastSelectedHermesTreeNode == null) {
return model.getFirstHermesTreeNode();
} else {
return lastSelectedHermesTreeNode;
}
}
/**
* If there is a Hermes node in the current selection path return it,
* otherwise return null.
*/
public HermesTreeNode getSelectedHermesNode() {
if (getSelectionPath() != null) {
if (getSelectionPath().getLastPathComponent() instanceof HermesTreeNode) {
return (HermesTreeNode) getSelectionPath().getLastPathComponent();
} else if (getSelectionPath().getLastPathComponent() instanceof DestinationConfigTreeNode) {
DestinationConfigTreeNode destinationNode = (DestinationConfigTreeNode) getSelectionPath().getLastPathComponent();
return (HermesTreeNode) destinationNode.getHermesTreeNode();
}
}
return null;
}
private boolean doJavaFileTransfer(List files) {
List<DestinationConfigTreeNode> nodes = getSelectedDestinationNodes();
if (nodes.size() > 0) {
final StringBuffer question = new StringBuffer();
final DestinationConfigTreeNode node = nodes.get(0);
question.append("Are you sure you want to upload ");
if (files.size() == 1) {
question.append(" this file to " + node.getDestinationName());
} else {
question.append(" these " + files.size() + " files to " + node.getDestinationName());
}
question.append(" ?");
if (JOptionPane.showConfirmDialog(HermesBrowser.getBrowser(), question.toString(), "Please confirm.", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
HermesBrowser
.getBrowser()
.getActionFactory()
.createSimpleSendMessageAction(getSelectedHermesNode().getHermes(), node.getDestinationName(), node.getDomain(), files,
SendMessageTask.MAYBE_XML, false);
} else {
Hermes.ui.getDefaultMessageSink().add("File upload cancelled.");
}
}
return false;
}
private boolean doTextMessageTransfer(Collection messages) {
List<DestinationConfigTreeNode> nodes = getSelectedDestinationNodes();
lastDndAction = TransferHandler.COPY;
if (nodes.size() > 0 && messages.size() > 0) {
final DestinationConfigTreeNode destinationNode = nodes.get(0);
final HermesTreeNode hermesNode = getSelectedHermesNode();
if (hermesNode != null && destinationNode != null) {
HermesBrowser
.getBrowser()
.getActionFactory()
.createMessageCopyAction(hermesNode.getHermes(), destinationNode.getDestinationName(), destinationNode.getDomain(), messages, true,
true);
}
}
return true;
}
private boolean doBytesMessageTransfer(Collection<byte[]> messages) {
List<DestinationConfigTreeNode> nodes = getSelectedDestinationNodes();
lastDndAction = TransferHandler.COPY;
if (nodes.size() > 0 && messages.size() > 0) {
final DestinationConfigTreeNode destinationNode = nodes.get(0);
final HermesTreeNode hermesNode = getSelectedHermesNode();
if (hermesNode != null && destinationNode != null) {
HermesBrowser
.getBrowser()
.getActionFactory()
.createMessageCopyAction(hermesNode.getHermes(), destinationNode.getDestinationName(), destinationNode.getDomain(), messages, true,
true);
}
}
return true;
}
private boolean doMessagesTransfer(MessageGroup messages, int action) {
List<DestinationConfigTreeNode> nodes = getSelectedDestinationNodes();
if (nodes.size() > 0) {
final DestinationConfigTreeNode destinationNode = nodes.get(0);
final HermesTreeNode hermesNode = getSelectedHermesNode();
if (hermesNode != null && destinationNode != null) {
Collection<Message> selected = messages.getSelectedMessages();
Message[] messagesArray = messages.getSelectedMessages().toArray(new Message[selected.size()]);
if (selected.size() == 1 && action == TransferHandler.COPY && MessageEditorDialog.canEdit(messagesArray[0])) {
try {
Message message = selected.iterator().next();
MessageEditorDialog dialog = new MessageEditorDialog(message, destinationNode.getDestinationName(), destinationNode.getDomain(),
new AbstractEditedMessageHandler(hermesNode.getHermes()) {
@Override
public void onMessage(Message message) {
HermesBrowser
.getBrowser()
.getActionFactory()
.createMessageCopyAction(hermesNode.getHermes(), destinationNode.getDestinationName(),
destinationNode.getDomain(), new ArrayList(Arrays.asList(message)), false, true);
}
});
dialog.setLocationRelativeTo(HermesBrowser.getBrowser());
dialog.setVisible(true);
} catch (JMSException ex) {
HermesBrowser.getBrowser().showErrorDialog(ex);
}
} else {
if (action == TransferHandler.COPY) {
HermesBrowser
.getBrowser()
.getActionFactory()
.createMessageCopyAction(hermesNode.getHermes(), destinationNode.getDestinationName(), destinationNode.getDomain(), selected,
true, true);
} else {
HermesBrowser.getBrowser().getActionFactory()
.createMessageMoveAction(hermesNode.getHermes(), destinationNode.getDestinationName(), destinationNode.getDomain(), selected);
}
}
}
} else {
if (getSelectionPath() != null) {
if (getSelectionPath().getLastPathComponent() instanceof RepositoryTreeNode) {
final RepositoryTreeNode node = (RepositoryTreeNode) getSelectionPath().getLastPathComponent();
try {
node.getRepository().addMessages(messages.getHermes(), messages.getSelectedMessages());
} catch (JMSException e) {
throw new HermesRuntimeException(e);
}
} else if (getSelectionPath().getLastPathComponent() instanceof MessageStoreTreeNode) {
final MessageStoreTreeNode node = (MessageStoreTreeNode) getSelectionPath().getLastPathComponent();
HermesBrowser.getBrowser().getThreadPool().invokeLater(new AddToMessageStoreTask(node.getMessageStore(), messages.getSelectedMessages()));
}
} else {
HermesBrowser.getBrowser().showErrorDialog("No session/destination selected for copy");
}
}
return true;
}
private boolean doContextContentTransfer(HermesConfigGroup transferData) throws NamingException, JMSException {
if (transferData.getDestinations().size() != 0 && transferData.getFactories().size() != 0) {
HermesBrowser.getBrowser().showErrorDialog("Can only drop ConnectionFactories or Destinations, not both");
return false;
}
if (transferData.getDestinations().size() > 0) {
Hermes hermes = null;
if (transferData.getHermesId() != null) {
hermes = (Hermes) HermesBrowser.getBrowser().getContext().lookup(transferData.getHermesId());
} else if (getSelectedHermesNode() != null) {
hermes = getSelectedHermesNode().getHermes();
}
if (hermes != null) {
StringBuffer question = new StringBuffer();
if (transferData.getDestinations().size() == 1) {
question.append("Do you want to add this destination to " + hermes.getId() + " ?");
} else {
question.append("Do you want to add these " + transferData.getDestinations().size() + " destinations to " + hermes.getId() + " ?");
}
if (JOptionPane.showConfirmDialog(HermesBrowser.getBrowser(), question.toString(), "Please confirm.", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
for (Iterator iter = transferData.getDestinations().iterator(); iter.hasNext();) {
DestinationConfig dConfig = (DestinationConfig) iter.next();
if (dConfig.getDomain() == Domain.UNKNOWN.getId()) {
Object options[] = { "Queue", "Topic" };
int n = JOptionPane.showOptionDialog(HermesBrowser.getBrowser(), "The destination " + dConfig.getName()
+ " implements both Queue and Topic interfaces, please select the domain you wish to use it in.", "Select domain",
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]);
if (n == JOptionPane.YES_OPTION) {
dConfig.setDomain(Domain.QUEUE.getId());
HermesBrowser.getBrowser().addDestinationConfig(hermes, dConfig);
} else if (n == JOptionPane.NO_OPTION) {
dConfig.setDomain(Domain.TOPIC.getId());
HermesBrowser.getBrowser().addDestinationConfig(hermes, dConfig);
} else {
// NOP
}
} else {
HermesBrowser.getBrowser().addDestinationConfig(hermes, dConfig);
}
}
HermesBrowser.getBrowser().saveConfig();
}
} else {
Hermes.ui.getDefaultMessageSink().add("No session selected for drop target");
}
} else {
final String newName = JOptionPane.showInputDialog(HermesBrowser.getBrowser(), "Session name:", "");
if (newName != null && !newName.equals("")) {
if (!getAllHermesIds().contains(newName)) {
FactoryConfig fConfig = (FactoryConfig) transferData.getFactories().iterator().next();
HermesBrowser.getConfigDAO().renameSession(fConfig, newName);
HermesBrowser.getBrowser().getConfig().getFactory().add(fConfig);
HermesBrowser.getBrowser().saveConfig();
HermesBrowser.getBrowser().loadConfig();
} else {
HermesBrowser.getBrowser().showErrorDialog("Session " + newName + " is already in use.");
}
}
}
return true;
}
private boolean doLocalTransfer(Transferable t, int action) {
if (HermesBrowser.getBrowser().isRestrictedWithWarning()) {
return false;
}
try {
if (t.isDataFlavorSupported(JMSMessagesTransferable.FLAVOR)) {
return doMessagesTransfer((MessageGroup) t.getTransferData(JMSMessagesTransferable.FLAVOR), action);
}
if (t.isDataFlavorSupported(JMSAdministeredObjectTransferable.FLAVOR)) {
return doContextContentTransfer((HermesConfigGroup) t.getTransferData(JMSAdministeredObjectTransferable.FLAVOR));
}
if (t.isDataFlavorSupported(MessagesTransferable.BYTE_FLAVOR)) {
return doBytesMessageTransfer((Collection<byte[]>) t.getTransferData(MessagesTransferable.BYTE_FLAVOR));
}
if (t.isDataFlavorSupported(HermesAdministeredObjectTransferable.FLAVOR)) {
if (getSelectionPath().getLastPathComponent() instanceof NamingConfigTreeNode) {
final NamingConfigTreeNode namingConfigTreeNode = (NamingConfigTreeNode) getSelectionPath().getLastPathComponent();
final Collection objects = (Collection) t.getTransferData(HermesAdministeredObjectTransferable.FLAVOR);
final JNDIContextFactory contextFactory = new JNDIContextFactory(namingConfigTreeNode.getConfig());
final BindToolDialog bindTool = new BindToolDialog(HermesBrowser.getBrowser(), contextFactory, "", objects);
bindTool.pack();
JideSwingUtilities.centerWindow(bindTool);
bindTool.show();
return true;
}
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
JOptionPane.showMessageDialog(this, "During transfer: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
return false;
}
/**
* Handle a data transfer into the tree - this can be initiated via dnd or
* directly.
*
* @@TODO DnD - it works but is all messed up and needs doing PROPERLY.
*/
public boolean doTransfer(Transferable t, int action) {
try {
log.debug(t.getTransferDataFlavors()[0]);
if (t.getTransferDataFlavors()[0].isMimeTypeEqual("application/x-java-file-list")) {
return doJavaFileTransfer((List) t.getTransferData(DataFlavor.javaFileListFlavor));
} else {
return doLocalTransfer(t, action);
}
} catch (UnsupportedFlavorException e) {
log.error(e.getMessage(), e);
} catch (IOException e) {
log.error(e.getMessage(), e);
}
return false;
}
public void dragEnter(DropTargetDragEvent dtde) {
// NOP
}
public void dragExit(DropTargetEvent dte) {
// NOP
}
public void dragOver(DropTargetDragEvent dtde) {
/*
* The idea here is to change the selection path as the user drags an
* item over - it works but it does not seem to expand...
*/
final TreePath path = getPathForLocation(dtde.getLocation().x, dtde.getLocation().y);
if (path != null) {
final TreeNode leafNode = (TreeNode) path.getLastPathComponent();
if (leafNode.getChildCount() > 0) {
final TreePath newPath = path.pathByAddingChild(leafNode.getChildAt(0));
expandPath(newPath);
setSelectionPath(path);
repaint();
}
}
}
public void drop(DropTargetDropEvent dtde) {
// NOP
}
public void dropActionChanged(DropTargetDragEvent dtde) {
// NOP
}
public Collection<String> getAllHermesIds() {
return model.getAllHermesIds();
}
private String getDestinationTooltip(Hermes hermes, DestinationConfig dConfig) throws JMSException, NamingException {
Map map = hermes.getStatistics(dConfig);
return HTMLBeanHelper.format(map);
}
/**
* Returns all the administered objects nodes, i.e. queues, topics and
* connection factories in the selection paths.
*
* @return
*/
public Collection<TreeNode> getSelectedAdministeredObjectNodes() {
final TreePath paths[] = getSelectionModel().getSelectionPaths();
final Collection<TreeNode> rval = new ArrayList<TreeNode>();
if (paths != null) {
for (int i = 0; i < paths.length; i++) {
TreePath path = paths[i];
if (path.getLastPathComponent() instanceof DestinationConfigTreeNode) {
DestinationConfigTreeNode destinationNode = (DestinationConfigTreeNode) path.getLastPathComponent();
rval.add(destinationNode);
} else if (path.getLastPathComponent() instanceof HermesTreeNode) {
HermesTreeNode hermesNode = (HermesTreeNode) path.getLastPathComponent();
rval.add(hermesNode);
}
}
}
return rval;
}
/**
* Gets some nice text to display in a tooltip.
*/
public String getToolTipText(MouseEvent evt) {
if (getRowForLocation(evt.getX(), evt.getY()) == -1) {
return null;
}
TreePath curPath = getPathForLocation(evt.getX(), evt.getY());
Object component = curPath.getLastPathComponent();
if (component != null) {
if (component instanceof HermesTreeNode) {
try {
return ((HermesTreeNode) component).getHermes().getMetaData().getToolTipText();
} catch (JMSException ex) {
log.error(ex.getMessage(), ex);
}
}
if (component instanceof NamingConfigTreeNode) {
try {
NamingConfigTreeNode nNode = (NamingConfigTreeNode) component;
return nNode.getToolTipText();
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
}
if (component instanceof DestinationConfigTreeNode) {
return ((DestinationConfigTreeNode) component).getToolTipText();
}
if (component instanceof RepositoryTreeNode) {
return ((RepositoryTreeNode) component).getRepository().getToolTipText();
}
if (component instanceof MessageStoreTreeNode) {
return ((MessageStoreTreeNode) component).getMessageStore().getTooltipText();
}
if (component instanceof MessageStoreURLTreeNode) {
return ((MessageStoreURLTreeNode) component).getTooltipText();
}
}
return null;
}
public void init() {
getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) getCellRenderer();
setCellRenderer(new BrowserTreeCellRenderer());
//
// Keep up to date with whats clicked when....
getSelectionModel().addTreeSelectionListener(this);
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
maybeDoBrowse(e);
}
public void mousePressed(MouseEvent e) {
maybeDoPopup(e);
}
public void mouseReleased(MouseEvent e) {
maybeDoPopup(e);
}
});
DataTipManager.get().register(this);
try {
getDropTarget().addDropTargetListener(this);
} catch (TooManyListenersException e1) {
log.error(e1.getMessage(), e1);
}
popupMenu = PopupMenuFactory.createBrowserTreePopup(this);
}
public boolean isCurrentSelectionADestination() {
return getSelectionPath() != null && getSelectionPath().getLastPathComponent() instanceof DestinationConfigTreeNode;
}
public boolean isCurrentSelectionASession() {
return getSelectionPath() != null && getSelectionPath().getLastPathComponent() instanceof HermesTreeNode;
}
public void maybeDoBrowse(MouseEvent e) {
if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
TreePath path = getPathForLocation(e.getX(), e.getY());
if (path != null) {
// setSelectionPath(path);
ActionRegistry.getAction(BrowseDestinationOrContextAction.class).actionPerformed(null);
}
}
}
boolean maybeDoPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
popupMenu.show(e.getComponent(), e.getX(), e.getY());
}
return true;
}
public void nodeStructureChanged(TreeNode node) {
model.nodeStructureChanged(node);
}
private void maybeRefocusDocument(TreeNode treeNode) {
DocumentComponent found = null ;
if (treeNode instanceof DestinationConfigTreeNode) {
final DestinationConfigTreeNode node = (DestinationConfigTreeNode) treeNode;
found = HermesBrowser.getBrowser().getOpenQueueBrowser(node.getConfig());
} else if (treeNode instanceof MessageStoreTreeNode) {
final MessageStoreTreeNode node = (MessageStoreTreeNode) treeNode;
found = HermesBrowser.getBrowser().getOpenStoreBrowser(node.getMessageStore()) ;
}
if (found != null) {
HermesBrowser.getBrowser().getDocumentPane().setActiveDocument(found.getName());
}
}
/**
* Called whenever the value of the selection changes, we watch this to
* cache whenever HermesTreeNode is in the selection path and to change the
* components tooltip text.
*/
public void valueChanged(TreeSelectionEvent e) {
final TreePath treePath = e.getNewLeadSelectionPath();
try {
if (treePath != null) {
for (int i = 0; i < treePath.getPathCount(); i++) {
if (treePath.getPathComponent(i) instanceof HermesTreeNode) {
final HermesTreeNode node = (HermesTreeNode) treePath.getPathComponent(i);
lastSelectedHermesTreeNode = node;
setToolTipText(node.getHermes().getMetaData().getToolTipText());
} else if (treePath.getPathComponent(i) instanceof DestinationConfigTreeNode) {
final DestinationConfigTreeNode node = (DestinationConfigTreeNode) treePath.getPathComponent(i);
setToolTipText(node.getDestinationName());
maybeRefocusDocument(node);
} else if (treePath.getPathComponent(i) instanceof RepositoryTreeNode) {
final RepositoryTreeNode node = (RepositoryTreeNode) treePath.getPathComponent(i);
setToolTipText(node.getRepository().getId());
} else if (treePath.getPathComponent(i) instanceof MessageStoreTreeNode) {
final MessageStoreTreeNode node = (MessageStoreTreeNode) treePath.getPathComponent(i);
setToolTipText(node.getMessageStore().getTooltipText());
maybeRefocusDocument(node);
} else if (treePath.getPathComponent(i) instanceof MessageStoreURLTreeNode) {
final MessageStoreURLTreeNode node = (MessageStoreURLTreeNode) treePath.getPathComponent(i);
setToolTipText(node.getURL());
}
}
}
} catch (JMSException ex) {
Hermes.ui.getDefaultMessageSink().add(ex.getMessage());
}
}
}