org.eclipse.linuxtools.lttng.ui.tracecontrol.wizards.KernelTraceChannelConfigurationPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.linuxtools.lttng.ui.tracecontrol.wizards.KernelTraceChannelConfigurationPage.java

Source

/*******************************************************************************
 * Copyright (c) 2011 Ericsson
 * 
 * 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
 * 
 * Contributors:
 *   Bernd Hufmann - Initial API and implementation
 *   
 *******************************************************************************/
package org.eclipse.linuxtools.lttng.ui.tracecontrol.wizards;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.linuxtools.lttng.tracecontrol.model.TraceResource.TraceState;
import org.eclipse.linuxtools.lttng.tracecontrol.model.config.TraceChannel;
import org.eclipse.linuxtools.lttng.tracecontrol.model.config.TraceChannels;
import org.eclipse.linuxtools.lttng.ui.LTTngUiPlugin;
import org.eclipse.linuxtools.lttng.ui.tracecontrol.Messages;
import org.eclipse.linuxtools.lttng.ui.tracecontrol.model.config.TraceChannelCellModifier;
import org.eclipse.linuxtools.lttng.ui.tracecontrol.model.config.TraceChannelTableContentProvider;
import org.eclipse.linuxtools.lttng.ui.tracecontrol.model.config.TraceChannelTableLabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
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.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;

/**
 * <b><u>KernelTraceChannelConfigurationPage</u></b>
 * <p>
 *  Wizard page implementation to configure the kernel trace channels.
 * </p>
 */
public class KernelTraceChannelConfigurationPage extends WizardPage implements ITraceChannelConfigurationPage {

    // ------------------------------------------------------------------------
    // Attributes
    // ------------------------------------------------------------------------
    private TraceChannels fChannels;
    private TraceState fTraceState;
    private Composite container;
    private TableViewer tableViewer;
    List<String> fColumnNames;

    Action enableAllAction;
    Action disableAllAction;
    Action setOverrideAllAction;
    Action resetOverideAllAction;
    Action setNumSubbufAction;
    Action setSubbufSizeAction;
    Action setChanTimerAction;

    private ColumnData[] columnDataList = new ColumnData[] { new ColumnData(Messages.ChannelConfigPage_ChannelName,
            150, SWT.LEFT, Messages.ChannelConfigPage_ChannelNameTooltip, new ViewerComparator() {
                @Override
                public int compare(Viewer viewer, Object e1, Object e2) {
                    TraceChannel chan1 = (TraceChannel) e1;
                    TraceChannel chan2 = (TraceChannel) e2;
                    return chan1.getName().compareTo(chan2.getName());
                }
            }),
            new ColumnData(Messages.ChannelConfigPage_ChannelEnabled, 150, SWT.LEFT,
                    Messages.ChannelConfigPage_ChannelEnabledTooltip, null),
            new ColumnData(Messages.ChannelConfigPage_ChannelOverride, 150, SWT.LEFT,
                    Messages.ChannelConfigPage_BufferOverrideTooltip, null),
            new ColumnData(Messages.ChannelConfigPage_NumSubBuf, 175, SWT.LEFT,
                    Messages.ChannelConfigPage_NumSubBufTooltip, null),
            new ColumnData(Messages.ChannelConfigPage_SubBufSize, 150, SWT.LEFT,
                    Messages.ChannelConfigPage_SubBufSizeTooltip, null),
            new ColumnData(Messages.ChannelConfigPage_ChannelTimer, 150, SWT.LEFT,
                    Messages.ChannelConfigPage_ChannelTimerTooltip, null) };

    // ------------------------------------------------------------------------
    // Constructors
    // ------------------------------------------------------------------------

    /**
     * Constructor
     * 
     * @param channels The current channels information
     * @param state The trace state
     */
    protected KernelTraceChannelConfigurationPage(TraceChannels channels, TraceState state) {
        super("TraceChannelConfigurationPage"); //$NON-NLS-1$
        fChannels = channels;
        fTraceState = state;
        setTitle(Messages.ChannelConfigPage_PageTitle);
    }

    // ------------------------------------------------------------------------
    // Operations
    // ------------------------------------------------------------------------

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public void createControl(Composite parent) {
        container = new Composite(parent, SWT.NULL);
        container.setLayout(new GridLayout());
        setControl(container);

        Composite headerComposite = new Composite(container, SWT.FILL);
        GridLayout headerLayout = new GridLayout(1, true);
        headerLayout.marginHeight = 0;
        headerLayout.marginWidth = 0;
        headerComposite.setLayout(headerLayout);
        headerComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        tableViewer = new TableViewer(headerComposite,
                SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
        tableViewer.setUseHashlookup(true);

        Table table = tableViewer.getTable();
        table.setHeaderVisible(true);

        fColumnNames = new ArrayList<String>();
        for (int i = 0; i < columnDataList.length; i++) {

            final ColumnData columnData = columnDataList[i];
            fColumnNames.add(columnData.header);
            final TableColumn tableColumn = new TableColumn(table, SWT.LEFT);
            tableColumn.setText(columnData.header);
            tableColumn.setWidth(columnData.width);
            tableColumn.setAlignment(columnData.alignment);
            tableColumn.setToolTipText(columnData.tooltip);
            tableColumn.setMoveable(false);
            if (columnData.comparator != null) {
                tableColumn.addSelectionListener(new SelectionAdapter() {
                    @Override
                    public void widgetSelected(SelectionEvent e) {
                        if (tableViewer.getTable().getSortDirection() == SWT.UP
                                || (tableViewer.getTable().getSortColumn() != tableColumn)) {
                            tableViewer.setComparator(columnData.comparator);
                            tableViewer.getTable().setSortDirection(SWT.DOWN);
                        } else {
                            tableViewer.setComparator(new ViewerComparator() {
                                @Override
                                public int compare(Viewer viewer, Object e1, Object e2) {
                                    return -1 * columnData.comparator.compare(viewer, e1, e2);
                                }
                            });
                            tableViewer.getTable().setSortDirection(SWT.UP);
                        }
                        tableViewer.getTable().setSortColumn(tableColumn);
                    }
                });
            }
        }

        tableViewer.setColumnProperties(fColumnNames.toArray(new String[0]));

        // Create the cell editors
        CellEditor[] editors = new CellEditor[columnDataList.length];

        // Column 1 : Completed (Checkbox)
        TextCellEditor textEditor = new TextCellEditor(table);
        editors[0] = textEditor;

        // Column 2 : Description (Free text)
        editors[1] = new CheckboxCellEditor(table);

        // Column 3 : Owner (Combo Box) 
        editors[2] = new CheckboxCellEditor(table);

        // Column 4 : Percent complete (Text with digits only)
        textEditor = new TextCellEditor(table);
        ((Text) textEditor.getControl()).addVerifyListener(

                new VerifyListener() {

                    @Override
                    public void verifyText(VerifyEvent e) {
                        e.doit = e.text.matches("[0-9]*"); //$NON-NLS-1$
                    }
                });
        editors[3] = textEditor;

        textEditor = new TextCellEditor(table);
        ((Text) textEditor.getControl()).addVerifyListener(

                new VerifyListener() {

                    @Override
                    public void verifyText(VerifyEvent e) {
                        e.doit = e.text.matches("[0-9]*"); //$NON-NLS-1$
                    }
                });
        editors[4] = textEditor;

        textEditor = new TextCellEditor(table);
        ((Text) textEditor.getControl()).addVerifyListener(

                new VerifyListener() {

                    @Override
                    public void verifyText(VerifyEvent e) {
                        e.doit = e.text.matches("[0-9]*"); //$NON-NLS-1$
                    }
                });
        editors[5] = textEditor;

        // Assign the cell editors to the viewer 
        tableViewer.setCellEditors(editors);
        tableViewer.setCellModifier(new TraceChannelCellModifier(this));

        tableViewer.setContentProvider(new TraceChannelTableContentProvider());
        tableViewer.setLabelProvider(new TraceChannelTableLabelProvider());

        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        makeActions();
        addContextMenu();
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.DialogPage#dispose()
     */
    @Override
    public void dispose() {
        super.dispose();
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)
     */
    @Override
    public void setVisible(boolean visible) {
        if (visible && (fChannels != null)) {
            // Get new channels configuration
            tableViewer.setInput(fChannels);

            Table table = tableViewer.getTable();
            TableItem[] items = table.getItems();
            for (int i = 0; i < items.length; i++) {
                if ((i % 2) != 0) {
                    items[i].setBackground(
                            Display.getDefault().getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND));
                }

                if ((fTraceState != TraceState.CREATED) && (fTraceState != TraceState.CONFIGURED)) {
                    items[i].setForeground(Display.getDefault().getSystemColor(SWT.COLOR_DARK_GRAY));
                }
            }

            container.layout();
        }
        super.setVisible(visible);
    }

    /**
     * Gets the list of column names.
     * 
     * @return list of column names
     */
    public List<String> getColumnProperties() {
        return fColumnNames;
    }

    /*
     * Refreshes the table.
     */
    public void refresh() {
        tableViewer.refresh();
    }

    /**
     * Gets the trace state.
     * 
     * @return trace state
     */
    public TraceState getTraceState() {
        return fTraceState;
    }

    /**
     * Gets if trace is a local trace (i.e. if trace output is stored on host 
     * where client is running)
     * 
     * @return isLocalTrace
     */
    public boolean isLocalTrace() {
        TraceConfigurationPage configPage = (TraceConfigurationPage) getPreviousPage();
        return configPage.isLocalTrace();
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.linuxtools.lttng.rse.ui.wizards.ITraceChannelConfigurationPage#getTraceChannels()
     */
    @Override
    public TraceChannels getTraceChannels() {
        return fChannels;
    }

    /*
     * Local class to configure table columns
     */
    final public class ColumnData {
        // Name of the column.
        public final String header;
        // Width of the column.
        public final int width;
        // Alignment of the column.
        public final int alignment;
        // Tooltip of the column.
        public final String tooltip;
        // Used to sort elements of this column. Can be null.
        public final ViewerComparator comparator;

        public ColumnData(String h, int w, int a, String t, ViewerComparator c) {
            header = h;
            width = w;
            alignment = a;
            tooltip = t;
            comparator = c;
        }
    };

    /*
     * Creates actions for context sensitive menu. 
     */
    private void makeActions() {

        // Create the context menu actions
        enableAllAction = new Action(Messages.ChannelConfigPage_EnableAll,
                LTTngUiPlugin.getDefault().getImageDescriptor(LTTngUiPlugin.ICON_ID_CHECKED)) {
            @Override
            public void run() {
                TableItem[] items = tableViewer.getTable().getItems();
                for (int i = 0; i < items.length; i++) {
                    TraceChannel chan = (TraceChannel) items[i].getData();
                    chan.setIsEnabled(true);
                }
                tableViewer.refresh();
            }
        };

        disableAllAction = new Action(Messages.ChannelConfigPage_DisableAll,
                LTTngUiPlugin.getDefault().getImageDescriptor(LTTngUiPlugin.ICON_ID_UNCHECKED)) {
            @Override
            public void run() {
                TableItem[] items = tableViewer.getTable().getItems();
                for (int i = 0; i < items.length; i++) {
                    TraceChannel chan = (TraceChannel) items[i].getData();
                    chan.setIsEnabled(false);
                }
                tableViewer.refresh();
            }
        };
        setOverrideAllAction = new Action(Messages.ChannelConfigPage_EnableAllBufferOverride,
                LTTngUiPlugin.getDefault().getImageDescriptor(LTTngUiPlugin.ICON_ID_CHECKED)) {
            @Override
            public void run() {
                TableItem[] items = tableViewer.getTable().getItems();
                for (int i = 0; i < items.length; i++) {
                    TraceChannel chan = (TraceChannel) items[i].getData();
                    chan.setIsChannelOverride(true);
                }
                tableViewer.refresh();
            }
        };
        resetOverideAllAction = new Action(Messages.ChannelConfigage_DisableAllBufferOverride,
                LTTngUiPlugin.getDefault().getImageDescriptor(LTTngUiPlugin.ICON_ID_UNCHECKED)) {
            @Override
            public void run() {
                TableItem[] items = tableViewer.getTable().getItems();
                for (int i = 0; i < items.length; i++) {
                    TraceChannel chan = (TraceChannel) items[i].getData();
                    chan.setIsChannelOverride(false);
                }
                tableViewer.refresh();
            }
        };
        setNumSubbufAction = new Action(Messages.ChannelConfigPage_SetAllNumSubBuf,
                LTTngUiPlugin.getDefault().getImageDescriptor(LTTngUiPlugin.ICON_ID_EDIT)) {
            @Override
            public void run() {
                TableItem[] items = tableViewer.getTable().getItems();
                SetDialog setDialog = new SetDialog(getShell(), Messages.ChannelConfigPage_NumSubBuf);
                if (setDialog.open() == Window.OK) {

                    for (int i = 0; i < items.length; i++) {
                        TraceChannel chan = (TraceChannel) items[i].getData();
                        chan.setSubbufNum(setDialog.getValue());
                    }

                    tableViewer.refresh();
                }
            }
        };
        setSubbufSizeAction = new Action(Messages.channelConfigPage_SetAllSubBufSize,
                LTTngUiPlugin.getDefault().getImageDescriptor(LTTngUiPlugin.ICON_ID_EDIT)) {
            @Override
            public void run() {
                TableItem[] items = tableViewer.getTable().getItems();
                SetDialog setDialog = new SetDialog(getShell(), Messages.ChannelConfigPage_SubBufSize);
                if (setDialog.open() == Window.OK) {

                    for (int i = 0; i < items.length; i++) {
                        TraceChannel chan = (TraceChannel) items[i].getData();
                        chan.setSubbufSize(setDialog.getValue());
                    }

                    tableViewer.refresh();
                }
            }
        };
        setChanTimerAction = new Action(Messages.ChannelConfigPage_SetAllChannelTimer,
                LTTngUiPlugin.getDefault().getImageDescriptor("ICON_ID_EDIT")) { //$NON-NLS-1$
            @Override
            public void run() {
                TableItem[] items = tableViewer.getTable().getItems();
                SetDialog setDialog = new SetDialog(getShell(), Messages.ChannelConfigPage_ChannelTimer);
                if (setDialog.open() == Window.OK) {

                    for (int i = 0; i < items.length; i++) {
                        TraceChannel chan = (TraceChannel) items[i].getData();
                        chan.setTimer(setDialog.getValue());
                    }

                    tableViewer.refresh();
                }
            }
        };
    }

    /*
     * Adds context sensitive menu to table.
     */
    private void addContextMenu() {
        MenuManager manager = new MenuManager("configChanPopupMenu"); //$NON-NLS-1$
        manager.setRemoveAllWhenShown(true);
        manager.addMenuListener(new IMenuListener() {

            @Override
            public void menuAboutToShow(IMenuManager manager) {

                if ((fTraceState != TraceState.CREATED) && (fTraceState != TraceState.CONFIGURED)) {
                    return;
                }
                manager.add(enableAllAction);
                manager.add(disableAllAction);
                manager.add(setOverrideAllAction);
                manager.add(resetOverideAllAction);
                manager.add(setNumSubbufAction);
                manager.add(setSubbufSizeAction);
                manager.add(setChanTimerAction);
            }
        });

        Menu menu = manager.createContextMenu(tableViewer.getControl());
        tableViewer.getControl().setMenu(menu);
    }

    /**
     * Local class dialog box implementation for setting values for all
     * rows for a given column  
     */
    public class SetDialog extends Dialog {

        // ------------------------------------------------------------------------
        // Attributes
        // ------------------------------------------------------------------------

        private String fWhat = null;
        private Text fValueText = null;
        private Long fValue = null;

        // ------------------------------------------------------------------------
        // Constructors
        // ------------------------------------------------------------------------

        public SetDialog(Shell parentShell, String what) {
            super(parentShell);
            fWhat = what;
        }

        // ------------------------------------------------------------------------
        // Operations
        // ------------------------------------------------------------------------

        /*
         * (non-Javadoc)
         * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
         */
        @Override
        protected void configureShell(Shell newShell) {
            super.configureShell(newShell);
            newShell.setText(Messages.ChannelConfigPage_SetAll);
            newShell.setImage(LTTngUiPlugin.getDefault().getImage(LTTngUiPlugin.ICON_ID_EDIT));
        }

        /*
         * (non-Javadoc)
         * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
         */
        @Override
        protected Control createDialogArea(Composite parent) {
            //Main dialog panel
            Composite composite = new Composite(parent, SWT.RESIZE);
            GridLayout mainLayout = new GridLayout(3, true);
            composite.setLayout(mainLayout);
            Label what = new Label(composite, SWT.LEFT);
            what.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));
            what.setText(fWhat);

            fValueText = new Text(composite, SWT.LEFT);
            fValueText.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));

            fValueText.addVerifyListener(new VerifyListener() {

                @Override
                public void verifyText(VerifyEvent e) {
                    e.doit = e.text.matches("[0-9]*"); //$NON-NLS-1$
                }
            });

            fValueText.addListener(SWT.Modify, new Listener() {
                @Override
                public void handleEvent(Event event) {
                    Button ok = getButton(IDialogConstants.OK_ID);
                    ok.setEnabled(validateInput(fValueText.getText()));
                }
            });

            return composite;
        }

        /*
         * (non-Javadoc)
         * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
         */
        @Override
        protected void createButtonsForButtonBar(Composite parent) {
            Button ok = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
            createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);

            ok.setEnabled(false);
        }

        /*
         * (non-Javadoc)
         * @see org.eclipse.jface.dialogs.Dialog#okPressed()
         */
        @Override
        protected void okPressed() {
            fValue = Long.valueOf(fValueText.getText());
            super.okPressed();
        }

        /*
         * Method to validate input.
         */
        private boolean validateInput(String path) {
            return (path.trim().length() > 0);
        }

        /**
         * Gets value that the user input. 
         * 
         * @return value
         */
        public Long getValue() {
            return fValue;
        }
    }
}