org.csstudio.debugging.jmsmonitor.GUI.java Source code

Java tutorial

Introduction

Here is the source code for org.csstudio.debugging.jmsmonitor.GUI.java

Source

/*******************************************************************************
 * Copyright (c) 2010 Oak Ridge National Laboratory.
 * 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
 ******************************************************************************/
package org.csstudio.debugging.jmsmonitor;

import org.csstudio.apputil.ui.workbench.OpenViewAction;
import org.csstudio.ui.util.MinSizeTableColumnLayout;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IWorkbenchPartSite;

/** JMS monitor GUI
 *  @author Kay Kasemir
 */
public class GUI implements ModelListener {
    /** JMS Connection parameters */
    final private String url, user, password;

    private Model model = null;

    private TableViewer table_viewer;

    private Text topic;

    private Button clear;

    private Label server_name;

    /** Initialize
     *  @param url JMS server URL
     *  @param user JMS user name or <code>null</code>
     *  @param password JMS password or <code>null</code>
     *  @param parent Parent widget
     */
    public GUI(IWorkbenchPartSite site, final String url, final String user, final String password,
            final Composite parent) {
        this.url = url;
        this.user = user;
        this.password = password;

        createGUI(parent);

        topic.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
                setTopic(getTopic());
            }
        });

        clear.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                if (model != null)
                    model.clear();
            }
        });

        parent.addDisposeListener(new DisposeListener() {
            @Override
            public void widgetDisposed(DisposeEvent e) {
                if (model != null)
                    model.close();
            }
        });

        // Publish the current selection to the site
        // (to allow context menu extensions based on the selection)
        if (site != null)
            site.setSelectionProvider(table_viewer);
    }

    /** Create the GUI elements
     *  @param parent Parent widget
     */
    private void createGUI(final Composite parent) {
        final GridLayout layout = new GridLayout();
        layout.numColumns = 3;
        parent.setLayout(layout);

        // URL:   ____url ____
        Label l = new Label(parent, 0);
        l.setText(Messages.URLLabel);
        l.setLayoutData(new GridData());

        l = new Label(parent, 0);
        l.setText(NLS.bind(Messages.URLLabelFmt, new Object[] { url, user, password }));
        l.setLayoutData(new GridData(SWT.LEFT, 0, true, false, 2, 1));

        // Topic: ____topic ____ [Clear]
        l = new Label(parent, 0);
        l.setText(Messages.TopicLabel);
        l.setLayoutData(new GridData());

        topic = new Text(parent, SWT.BORDER);
        topic.setToolTipText(Messages.Topic_TT);
        topic.setLayoutData(new GridData(SWT.FILL, 0, true, false));

        clear = new Button(parent, SWT.PUSH);
        clear.setText(Messages.Clear);
        clear.setToolTipText(Messages.ClearTT);
        clear.setLayoutData(new GridData());

        // Server: ____server_name____
        l = new Label(parent, 0);
        l.setText(Messages.Server);
        l.setLayoutData(new GridData());

        server_name = new Label(parent, 0);
        server_name.setText(Messages.Disconnected);
        server_name.setLayoutData(new GridData(SWT.FILL, 0, true, false, 2, 1));

        // Message table
        // TableColumnLayout requires table to be only child of its parent
        final Composite table_parent = new Composite(parent, 0);
        table_parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, layout.numColumns, 1));
        final TableColumnLayout table_layout = new MinSizeTableColumnLayout(10);
        table_parent.setLayout(table_layout);

        table_viewer = new TableViewer(table_parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
        // Some tweaks to the underlying table widget
        final Table table = table_viewer.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        TableViewerColumn view_col = new TableViewerColumn(table_viewer, 0);
        TableColumn col = view_col.getColumn();
        col.setText(Messages.DateColumn);
        col.setMoveable(true);
        table_layout.setColumnData(col, new ColumnWeightData(5, 200));
        view_col.setLabelProvider(new DateLabelProvider());

        view_col = new TableViewerColumn(table_viewer, 0);
        col = view_col.getColumn();
        col.setText(Messages.TypeColumn);
        col.setMoveable(true);
        table_layout.setColumnData(col, new ColumnWeightData(5, 50));
        view_col.setLabelProvider(new TypeLabelProvider());

        view_col = new TableViewerColumn(table_viewer, 0);
        col = view_col.getColumn();
        col.setText(Messages.ContentColumn);
        col.setMoveable(true);
        table_layout.setColumnData(col, new ColumnWeightData(100, 400));
        view_col.setLabelProvider(new ContentLabelProvider());

        table_viewer.setContentProvider(new ReceivedMessageProvider());

        ColumnViewerToolTipSupport.enableFor(table_viewer, ToolTip.NO_RECREATE);

        // Double-click on message opens detail
        table_viewer.getTable().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseDoubleClick(MouseEvent e) {
                new OpenViewAction(IPageLayout.ID_PROP_SHEET).run();
            }
        });

        // Context menu
        final MenuManager manager = new MenuManager();
        manager.add(new OpenViewAction(IPageLayout.ID_PROP_SHEET, Messages.ShowProperties));
        table.setMenu(manager.createContextMenu(table));

        clear();
    }

    /** Set initial focus */
    public void setFocus() {
        topic.setFocus();
    }

    /** @return SelectionProvider (TableViewer) for selected messages */
    public ISelectionProvider getSelectionProvider() {
        return table_viewer;
    }

    /** @return Currently selected topic */
    public String getTopic() {
        return topic.getText().trim();
    }

    /** Select topic: Connect to JMS, subscribe to topic, ...
     *  @param topic_name Name of topic
     */
    public void setTopic(final String topic_name) {
        try {
            if (!topic.getText().equals(topic_name))
                topic.setText(topic_name);
            if (model != null)
                model.close();
            clear();
            if (topic_name.length() <= 0 || Messages.EnterTopicMsg.equals(topic_name))
                return;
            model = new Model(url, user, password, topic_name);
            modelChanged(model);
            model.addListener(this);
        } catch (Exception ex) {
            showError(ex.getMessage());
        }
    }

    /** Set messages to something that indicates "no messages" */
    private void clear() {
        table_viewer.setInput(new ReceivedMessage[0]);
    }

    /** Set messages to something that show error message
     *  @param message Error message text
     */
    private void showError(final String message) {
        table_viewer.setInput(new ReceivedMessage[] { ReceivedMessage.createErrorMessage(message) });
    }

    /** @see ModelListener */
    @Override
    public void modelChanged(final Model model) {
        table_viewer.getTable().getDisplay().asyncExec(new Runnable() {
            @Override
            public void run() {
                if (server_name.isDisposed())
                    return;
                server_name.setText(model.getServerName());
                table_viewer.setInput(model.getMessages());
                table_viewer.refresh();
            }
        });
    }
}