com.nokia.cdt.internal.debug.launch.ui.ChooseProcessDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.cdt.internal.debug.launch.ui.ChooseProcessDialog.java

Source

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/
package com.nokia.cdt.internal.debug.launch.ui;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TrayDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SearchPattern;
import org.eclipse.ui.plugin.AbstractUIPlugin;

import com.freescale.cdt.debug.cw.core.os.OSProcess;
import com.freescale.cdt.debug.cw.core.os.OSProcess.ParsedProcess;
import com.nokia.cpp.internal.api.utils.core.Check;

public class ChooseProcessDialog extends TrayDialog {

    private class ProcessesLabelProvider extends LabelProvider implements ITableLabelProvider {

        public String getColumnText(Object element, int columnIndex) {
            if (element instanceof ParsedProcess) {
                ParsedProcess parsedProcess = (ParsedProcess) element;
                if (columnIndex == PROCESS_NAME_COLUMN)
                    return parsedProcess.getProcessName();
                else if (columnIndex == PROCESS_ID_COLUMN)
                    return parsedProcess.getProcessId();
            }
            return null;
        }

        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

    }

    public class ItemFilter extends ViewerFilter {

        private SearchPattern searchPattern;

        public ItemFilter() {
            searchPattern = new SearchPattern();
            searchPattern.setPattern(""); //$NON-NLS-1$
        }

        @Override
        public boolean select(Viewer viewer, Object parentElement, Object element) {
            return match(element.toString());
        }

        public boolean match(String str) {
            return searchPattern.matches(str);
        }

        public void setPattern(String pattern) {
            searchPattern.setPattern(pattern);
        }
    }

    private static final String AUTOTEST_UID = ".uid"; //$NON-NLS-1$
    private static final int PROCESS_ID_COLUMN = 0;
    private static final int PROCESS_NAME_COLUMN = 1;

    private OSProcess[] processesOnTarget;
    private OSProcess selectedProcess;
    private String defaultProcessName;
    private Text filterText;
    private ToolBarManager clearFilterToolBar;
    private ItemFilter nameFilter = new ItemFilter();
    private TableViewer viewer;
    private Map<ParsedProcess, OSProcess> parsedProcessMap;
    private int lastSortColumn = PROCESS_ID_COLUMN; // default
    private int sortDirection = 1; // default

    public static final ImageDescriptor clearImageDesc = AbstractUIPlugin
            .imageDescriptorFromPlugin(PlatformUI.PLUGIN_ID, "$nl$/icons/full/etool16/clear_co.gif"); //$NON-NLS-1$

    /**
     * @param processesOnTarget OSProcess[]
     * @param defaultProcessName String
     * @param parentShell Shell
     */
    public ChooseProcessDialog(OSProcess[] processesOnTarget, String defaultProcessName, Shell parentShell) {
        super(parentShell);
        setShellStyle(getShellStyle() | SWT.RESIZE);
        this.processesOnTarget = processesOnTarget;
        Check.checkContract(processesOnTarget.length > 0);
        this.defaultProcessName = defaultProcessName;
    }

    protected Control createDialogArea(Composite parent) {
        Composite dialogArea = (Composite) super.createDialogArea(parent);
        final Label label = new Label(dialogArea, SWT.NONE);
        label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        label.setText(Messages.getString("ChooseProcessDialog.Message")); //$NON-NLS-1$)

        Composite filterComposite = new Composite(dialogArea, SWT.NONE);
        final GridLayout gridLayout = new GridLayout();
        gridLayout.marginWidth = 0;
        gridLayout.marginTop = 5;
        gridLayout.marginHeight = 0;
        gridLayout.numColumns = 2;
        filterComposite.setLayout(gridLayout);

        filterText = new Text(filterComposite, SWT.SINGLE | SWT.BORDER | SWT.SEARCH | SWT.CANCEL);
        filterText.setText(Messages.getString("ChooseProcessDialog.NameFilterInitialText")); //$NON-NLS-1$
        filterText.setToolTipText(Messages.getString("ChooseProcessDialog.NameFilterToolTip")); //$NON-NLS-1$
        final GridData gd_filterText = new GridData(SWT.LEFT, SWT.CENTER, false, false);
        gd_filterText.widthHint = 200;
        filterText.setLayoutData(gd_filterText);
        filterText.addFocusListener(new FocusAdapter() {
            /*
             * (non-Javadoc)
             * 
             * @see org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt.events.FocusEvent)
             */
            public void focusGained(FocusEvent e) {
                /*
                 * Running in an asyncExec because the selectAll() does not
                 * appear to work when using mouse to give focus to text.
                 */
                Display display = filterText.getDisplay();
                display.asyncExec(new Runnable() {
                    public void run() {
                        if (!filterText.isDisposed()) {
                            filterText.selectAll();
                        }
                    }
                });
            }
        });

        filterText.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                FilterItems();
                clearFilterToolBar.getControl().setVisible(filterText.getText().length() > 0);
            }
        });
        clearFilterToolBar = new ToolBarManager(SWT.FLAT | SWT.HORIZONTAL);
        clearFilterToolBar.createControl(filterComposite);

        IAction clearTextAction = new Action("", IAction.AS_PUSH_BUTTON) {//$NON-NLS-1$
            public void run() {
                filterText.setText(""); //$NON-NLS-1$
                FilterItems();
            }
        };
        clearTextAction.setToolTipText(Messages.getString("ChooseProcessDialog.ClearToolTip")); //$NON-NLS-1$
        clearTextAction.setImageDescriptor(clearImageDesc);
        clearTextAction.setDisabledImageDescriptor(clearImageDesc);
        clearFilterToolBar.add(clearTextAction);
        clearFilterToolBar.update(false);
        // initially there is no text to clear
        clearFilterToolBar.getControl().setVisible(false);

        viewer = new TableViewer(dialogArea, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);
        Table table = viewer.getTable();
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        table.setData(AUTOTEST_UID, "table"); //$NON-NLS-1$

        // process id column
        TableColumn processIdColumn = new TableColumn(table, SWT.LEFT);
        processIdColumn.setText(Messages.getString("ChooseProcessDialog.IDLabel")); //$NON-NLS-1$
        processIdColumn.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                updateSortDirection(PROCESS_ID_COLUMN);
                ViewerComparator comparator = getViewerComparator(PROCESS_ID_COLUMN);
                viewer.setComparator(comparator);
                setColumnSorting((TableColumn) e.getSource(), sortDirection);
            }
        });
        processIdColumn.setData(AUTOTEST_UID, "processIdColumn"); //$NON-NLS-1$

        // process name column
        TableColumn processNameColumn = new TableColumn(table, SWT.LEFT);
        processNameColumn.setText(Messages.getString("ChooseProcessDialog.NameLabel")); //$NON-NLS-1$
        processNameColumn.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                updateSortDirection(PROCESS_NAME_COLUMN);
                ViewerComparator comparator = getViewerComparator(PROCESS_NAME_COLUMN);
                viewer.setComparator(comparator);
                setColumnSorting((TableColumn) e.getSource(), sortDirection);
            }
        });
        processNameColumn.setData(AUTOTEST_UID, "processNameColumn"); //$NON-NLS-1$

        viewer.setContentProvider(new ArrayContentProvider());
        viewer.setLabelProvider(new ProcessesLabelProvider());
        parseProcesses();
        viewer.setInput(parsedProcessMap.keySet());

        viewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                Object object = selection.getFirstElement();
                Check.checkState(object instanceof ParsedProcess);
                selectedProcess = parsedProcessMap.get(object);
                okPressed();
            }
        });

        viewer.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(SelectionChangedEvent event) {
                Button okButton = getButton(IDialogConstants.OK_ID);
                if (okButton != null) {
                    okButton.setEnabled(!event.getSelection().isEmpty());
                }
            }

        });

        setColumnSorting(processIdColumn, sortDirection);
        table.setHeaderVisible(true);

        TableColumn[] columns = viewer.getTable().getColumns();
        for (TableColumn tableColumn : columns) {
            tableColumn.pack();
        }
        OSProcess defaultProcess = findProcessByName(defaultProcessName);
        if (defaultProcess == null)
            defaultProcess = processesOnTarget[0];
        viewer.setSelection(new StructuredSelection(defaultProcess), true);

        return dialogArea;
    }

    private OSProcess findProcessByName(String defaultProcessName) {
        for (OSProcess process : processesOnTarget) {
            ParsedProcess parsedProcess = process.parseProcess();
            if (parsedProcess != null && defaultProcessName.equals(process.parseProcess().second))
                return process;
        }

        return null;
    }

    private void parseProcesses() {
        parsedProcessMap = new HashMap<ParsedProcess, OSProcess>();
        for (OSProcess process : processesOnTarget) {
            ParsedProcess parsedProcess = process.parseProcess();
            if (parsedProcess != null)
                parsedProcessMap.put(parsedProcess, process);
        }
    }

    private ViewerComparator getViewerComparator(int column) {
        switch (column) {
        case PROCESS_NAME_COLUMN:
            return new ViewerComparator() {
                public int compare(Viewer viewer, Object e1, Object e2) {
                    String p1 = ((ParsedProcess) e1).getProcessName();
                    String p2 = ((ParsedProcess) e2).getProcessName();
                    if (p1 == null || p2 == null)
                        return 0;
                    return p1.compareToIgnoreCase(p2) * sortDirection;
                }
            };
        case PROCESS_ID_COLUMN:
            return new ViewerComparator() {
                public int compare(Viewer viewer, Object e1, Object e2) {
                    String p1 = ((ParsedProcess) e1).getProcessId();
                    String p2 = ((ParsedProcess) e2).getProcessId();
                    int i1 = 0;
                    int i2 = 0;
                    try {
                        i1 = Integer.parseInt(p1);
                        i2 = Integer.parseInt(p2);
                    } catch (Exception e) {
                        // ignore, just return 0
                    }
                    return (i1 - i2) * sortDirection;
                }
            };
        }
        return null;
    }

    private void updateSortDirection(int column) {
        if (lastSortColumn == column) {
            sortDirection *= -1;
        } else {
            sortDirection = 1;
            lastSortColumn = column;
        }
    }

    private void setColumnSorting(TableColumn column, int order) {
        Table table = viewer.getTable();
        table.setSortColumn(column);
        table.setSortDirection(order > 0 ? SWT.UP : SWT.DOWN);
    }

    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setText(Messages.getString("ChooseProcessDialog.Title")); //$NON-NLS-1$
        PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell, LaunchTabHelpIds.ATTACH_CHOOSE_PROCESS);
    }

    @Override
    protected void okPressed() {
        StructuredSelection selectedItems = (StructuredSelection) viewer.getSelection();
        Check.checkState(!selectedItems.isEmpty());
        Object object = selectedItems.getFirstElement();
        Check.checkState(object instanceof ParsedProcess);
        selectedProcess = parsedProcessMap.get(object);
        super.okPressed();
    }

    public OSProcess getSelectedProcess() {
        return selectedProcess;
    }

    @Override
    protected Point getInitialSize() {
        return new Point(300, 375);
    }

    private void FilterItems() {
        String pattern = filterText.getText();

        if (pattern.length() == 0)
            // This will call viewer.refresh().
            viewer.removeFilter(nameFilter);
        else {
            nameFilter.setPattern(pattern);

            if (viewer.getFilters().length == 0)
                // This will call viewer.refresh().
                viewer.addFilter(nameFilter);
            else
                viewer.refresh();
        }
    }

    @Override
    protected Control createButtonBar(Composite parent) {
        Control control = super.createButtonBar(parent);

        // disable the ok button.  it will be enabled when they select something
        getButton(IDialogConstants.OK_ID).setEnabled(false);

        return control;
    }
}