/******************************************************************************* * Copyright (c) 2009, 2010 Progress Software Corporation. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html ******************************************************************************/ // Copyright (c) 2009 Progress Software Corporation. package org.fusesource.tools.messaging.editors; import java.util.Collection; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.dialogs.SaveAsDialog; import org.eclipse.ui.forms.DetailsPart; import org.eclipse.ui.forms.IDetailsPage; import org.eclipse.ui.forms.IDetailsPageProvider; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.MasterDetailsBlock; import org.eclipse.ui.forms.SectionPart; import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import org.fusesource.tools.core.message.Message; import org.fusesource.tools.message.editors.MessageEditorConstants; import org.fusesource.tools.message.extensions.IMessageType; import org.fusesource.tools.message.extensions.IMessageTypeUI; import org.fusesource.tools.message.extensions.IMessageViewerExtension; import org.fusesource.tools.message.utils.MessageExtensionsMgr; import org.fusesource.tools.message.utils.MessageManager; import org.fusesource.tools.messaging.MessageEvent; import org.fusesource.tools.messaging.cnf.actions.MessagesHistoryAction; import org.fusesource.tools.messaging.core.IListener; import org.fusesource.tools.messaging.core.IMessageChangeListener; import org.fusesource.tools.messaging.jms.JMSConstants; import org.fusesource.tools.messaging.ui.ImageConstants; import org.fusesource.tools.messaging.utils.ImagesUtil; public class MessagesMasterBlock extends MasterDetailsBlock implements IDetailsPageProvider { private final FormPage page; private MessageReceiverTable receiverTable; private Action saveAsAction = null; private Action deleteAllAction = null; private Action deleteAction = null; private TableViewer tableViewer = null; private IListener listener = null; private MessageEvent currentMessage; private IManagedForm managedForm; private SectionPart tableSection; private IToolBarManager toolBarManager; private IMessageViewerExtension currentViewerExt = null; public MessagesMasterBlock(FormPage page) { this.page = page; } @Override protected void createMasterPart(final IManagedForm managedForm, Composite parent) { this.managedForm = managedForm; buildTableSection(managedForm, parent); MessageEditorInput input = (MessageEditorInput) page.getEditor().getEditorInput(); listener = input.getListener(); if (listener != null) { showMessages(listener); } addTableListener(); addDelKeyListener(); } private void addTableListener() { tableViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { markAsRead(event); updateActions(); managedForm.fireSelectionChanged(tableSection, event.getSelection()); } }); } private void markAsRead(SelectionChangedEvent event) { currentMessage = (MessageEvent) ((StructuredSelection) event.getSelection()).getFirstElement(); if (currentMessage != null) { listener.getMessagesManager().resetFlag(currentMessage, IMessageChangeListener.MESSAGE_READ); } receiverTable.updateUI(); } protected void updateActions() { boolean b = !(tableViewer.getSelection().isEmpty()); saveAsAction.setEnabled(b); deleteAction.setEnabled(b); deleteAllAction.setEnabled(b); } /** * creates the message detail section * * @param managedForm * @param parent */ protected void buildTableSection(final IManagedForm managedForm, Composite parent) { FormToolkit toolkit = managedForm.getToolkit(); Section messageTableSection = toolkit .createSection(parent, Section.DESCRIPTION | ExpandableComposite.TITLE_BAR); messageTableSection.setText("Received Messages"); messageTableSection.setDescription(""); messageTableSection.marginWidth = 10; messageTableSection.marginHeight = 5; Composite tableComposite = toolkit.createComposite(messageTableSection, SWT.NONE); GridLayout tableSectionLayout = new GridLayout(); tableSectionLayout.numColumns = 1; messageTableSection.setLayout(tableSectionLayout); GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true); tableComposite.setLayoutData(gridData); tableComposite.setLayout(new FillLayout()); receiverTable = new MessageReceiverTable(); receiverTable.createControl(tableComposite, 200); tableViewer = receiverTable.getViewer(); messageTableSection.setClient(tableComposite); tableSection = new SectionPart(messageTableSection); managedForm.addPart(tableSection); } /** * creates the too bar * * @param managedForm */ @Override protected void createToolBarActions(IManagedForm managedForm) { final ScrolledForm form = managedForm.getForm(); sashForm.setOrientation(SWT.VERTICAL); form.reflow(true); addSaveAsAction(getToolBarManager()); addDeleteAction(getToolBarManager()); addDeleteAllAction(getToolBarManager()); addMessagesHistoryAction(getToolBarManager()); } private IToolBarManager getToolBarManager() { if (toolBarManager != null) { return toolBarManager; } final ScrolledForm form = managedForm.getForm(); toolBarManager = form.getToolBarManager(); return toolBarManager; } private void addMessagesHistoryAction(IToolBarManager toolBarManager) { toolBarManager.add(new MessagesHistoryAction()); } private void addDeleteAllAction(IToolBarManager toolBarManager) { deleteAllAction = new Action("Delete All", IAction.AS_PUSH_BUTTON) { @Override public void run() { clearMessages(); updateActions(); } }; deleteAllAction.setToolTipText("Delete All"); deleteAllAction.setImageDescriptor(ImagesUtil.getInstance().getImageDescriptor( ImageConstants.MESSAGE_DELETE_ALL)); deleteAllAction.setEnabled(false); toolBarManager.add(deleteAllAction); } private void addDeleteAction(IToolBarManager toolBarManager) { deleteAction = new Action("Delete", IAction.AS_PUSH_BUTTON) { @Override public void run() { deleteMessage(); updateActions(); } }; deleteAction.setToolTipText("Delete"); deleteAction.setImageDescriptor(ImagesUtil.getInstance().getImageDescriptor(ImageConstants.MESSAGE_DELETE)); deleteAction.setEnabled(false); toolBarManager.add(deleteAction); } private void addSaveAsAction(IToolBarManager toolBarManager) { saveAsAction = new Action("Save As", IAction.AS_PUSH_BUTTON) { @Override public void run() { saveMessage(); updateActions(); } }; saveAsAction.setToolTipText("Save As"); saveAsAction.setImageDescriptor(ImagesUtil.getInstance().getImageDescriptor(ImageConstants.MESSAGE_SAVE)); saveAsAction.setEnabled(false); toolBarManager.add(saveAsAction); } @Override protected void registerPages(DetailsPart detailsPart) { detailsPart.setPageProvider(this); } public void showMessages(IListener listener) { receiverTable.setInput(listener); } protected void clearMessages() { boolean answer = MessageDialog.openQuestion(Display.getCurrent().getActiveShell(), "Delete All", "Are you sure you want to delete all messages from the listener?"); if (!answer) { return; } listener.getMessagesManager().clearAllMessages(); receiverTable.reloadTableData(); } protected void deleteMessage() { ISelection selection = tableViewer.getSelection(); MessageEvent messageEvent = (MessageEvent) ((StructuredSelection) selection).getFirstElement(); if (messageEvent == null) { return; } boolean answer = MessageDialog.openQuestion(Display.getCurrent().getActiveShell(), "Delete", "Are you sure you want to delete the message from the listener?"); if (!answer) { return; } listener.getMessagesManager().removeMessage(messageEvent); tableViewer.setInput(listener.getMessagesManager().getMessages()); receiverTable.updateUI(); } protected void saveMessage() { Object obj = getSelectedItem(); if (obj != null) { try { SaveAsDialog dlg = new SaveAsDialog(Display.getCurrent().getActiveShell()); if (dlg.open() == Window.OK) { IPath path = dlg.getResult(); if (path.getFileExtension() == null) { path = path.addFileExtension(MessageEditorConstants.MESSAGE_FILE_EXTENSION); } if (path != null) { IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path); MessageEvent messageEvent = (MessageEvent) obj; String id = messageEvent.getSource().getDestination().getConnection().getProvider().getId(); IMessageType messageType = MessageExtensionsMgr.getInstance().getMessageTypeExtension( messageEvent.getMessage(), id); if (messageType == null) { // FIXME should fix this later, passing JMS id for now messageType = MessageExtensionsMgr.getInstance().getMessageTypeExtension( messageEvent.getMessage(), JMSConstants.DEFAULT_JMS_PROVIDER); } Message messageToSave = messageType.convertMessage(messageEvent.getMessage()); MessageManager.save(file, messageToSave, getProgressMonitor()); } } dlg.close(); } catch (Exception ex) { ex.printStackTrace(); // TODO : Fix this - show error dialog } } } protected Object getSelectedItem() { Object obj = ((StructuredSelection) getViewer().getSelection()).getFirstElement(); return obj; } public static IProgressMonitor getProgressMonitor() { return new NullProgressMonitor(); } public TableViewer getViewer() { return tableViewer; } public MessageEvent getCurrentMessage() { return currentMessage; } public IDetailsPage getPage(Object arg0) { if (arg0 instanceof IMessageTypeUI) { IMessageTypeUI messageTypeUI = (IMessageTypeUI) arg0; IMessageViewerExtension createViewerUI = messageTypeUI.getViewerExtension(); updateBlockOnSelectionChange(createViewerUI); return createViewerUI.getDetailsPage(); } return null; } public Object getPageKey(Object arg0) { Object keyObject = null; MessageEvent messageEvent = (MessageEvent) arg0; String id = messageEvent.getSource().getDestination().getConnection().getProvider().getId(); keyObject = MessageExtensionsMgr.getInstance().getMessageTypeUIExtension(messageEvent.getMessage(), id); if (keyObject == null) { keyObject = MessageExtensionsMgr.getInstance().getMessageTypeUIExtension(messageEvent.getMessage(), JMSConstants.DEFAULT_JMS_PROVIDER); } return keyObject; } public void updateBlockOnSelectionChange(IMessageViewerExtension newViewerExt) { IToolBarManager toolBar = getToolBarManager(); Collection<Action> actions = null; if (currentViewerExt != null) { actions = currentViewerExt.getActions(); for (Action action : actions) { toolBar.remove(new ActionContributionItem(action)); } } currentViewerExt = newViewerExt; actions = currentViewerExt.getActions(); for (Action action : actions) { toolBar.add(new ActionContributionItem(action)); } toolBar.update(true); } public void clearBlock() { if (receiverTable != null) { receiverTable.removeNotificationsListener(); } } private void addDelKeyListener() { tableViewer.getTable().addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { if (SWT.DEL == e.keyCode) { deleteMessage(); } } public void keyReleased(KeyEvent e) { } }); } }