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

Java tutorial

Introduction

Here is the source code for com.nokia.cdt.internal.debug.launch.ui.ExecutablesBlock.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 org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.*;

import java.util.*;
import java.util.List;

/**
 * A composite that displays executables in a table. Executables can be enabled
 * and disabled for debugging.
 */
public class ExecutablesBlock {

    ExecutablesTab fLaunchTab;
    /**
     * This block's control
     */
    private Composite fControl;

    /**
     * Files being displayed
     */
    private List<ExeFileToDebug> fExeFiles = new ArrayList<ExeFileToDebug>();

    /**
     * The main list control
     */
    private CheckboxTableViewer fExeFileList;
    private ExeFileToDebug fMainExecutable;

    private final static Color GRAY = new Color(null, 128, 128, 128);

    /**
     * Label provider for executables table
     */
    class ExeFilesLabelProvider extends LabelProvider implements IColorProvider {

        @Override
        public String getText(Object element) {
            if (element instanceof ExeFileToDebug) {
                ExeFileToDebug file = (ExeFileToDebug) element;
                return file.getExePath();
            }
            return element.toString();
        }

        public Color getBackground(Object element) {
            return null;
        }

        public Color getForeground(Object element) {
            if (element == fMainExecutable)
                return GRAY;
            return null;
        }

    }

    ExecutablesBlock(ExecutablesTab launchTab) {
        fLaunchTab = launchTab;
    }

    /**
     * Creates this block's control in the given control.
     * 
     * @param ancestor
     *            containing control
     */
    public void createControl(Composite comp) {
        fControl = comp;

        GridData data;

        Table table = new Table(comp, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
        data = new GridData(GridData.FILL, GridData.FILL, true, true, 1, 1);
        data.horizontalIndent = 10;
        table.setLayoutData(data);

        table.setHeaderVisible(false);
        table.setLinesVisible(false);
        table.setToolTipText(Messages.getString("ExecutablesTab.TableToolTip")); //$NON-NLS-1$

        TableLayout tableLayout = new TableLayout();
        table.setLayout(tableLayout);

        fExeFileList = new CheckboxTableViewer(table);
        fExeFileList.setLabelProvider(new ExeFilesLabelProvider());
        fExeFileList.setContentProvider(new ArrayContentProvider());

        // listen to checks
        fExeFileList.addCheckStateListener(new ICheckStateListener() {
            public void checkStateChanged(CheckStateChangedEvent e) {
                ExeFileToDebug file = (ExeFileToDebug) e.getElement();
                if (file == fMainExecutable) {
                    fExeFileList.setChecked(file, true);
                } else {
                    file.setEnabled(e.getChecked());
                }
                if (fExeFileList.getCheckedElements().length == 0)
                    fExeFileList.setChecked(fExeFiles.get(0), true);
                fLaunchTab.dataChanged();
            }
        });
        // listen to double clicks
        fExeFileList.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent e) {
                IStructuredSelection selection = (IStructuredSelection) e.getSelection();
                for (Iterator iterator = selection.iterator(); iterator.hasNext();) {
                    ExeFileToDebug file = (ExeFileToDebug) iterator.next();
                    if (file != fMainExecutable) {
                        fExeFileList.setChecked(file, !fExeFileList.getChecked(file));
                    }
                }
                if (fExeFileList.getCheckedElements().length == 0)
                    fExeFileList.setChecked(fExeFiles.get(0), true);
                fLaunchTab.dataChanged();
            }
        });

        fExeFileList.setComparator(new ViewerComparator());
    }

    /**
     * Returns this block's control
     * 
     * @return control
     */
    public Control getControl() {
        return fControl;
    }

    /**
     * Sets the files to be displayed in this block
     * 
     * @param files
     *            files to be displayed
     */
    protected void setFiles(List<ExeFileToDebug> files) {

        ArrayList<ExeFileToDebug> tempFiles = new ArrayList<ExeFileToDebug>(files);
        fExeFiles.retainAll(tempFiles);
        tempFiles.removeAll(fExeFiles);
        fExeFiles.addAll(tempFiles);

        if (fExeFileList.getContentProvider() != null) {
            fExeFileList.setInput(fExeFiles);
            fExeFileList.refresh();

            for (int i = 0; i < fExeFiles.size(); i++) {
                ExeFileToDebug file = (ExeFileToDebug) fExeFiles.get(i);
                fExeFileList.setChecked(file, file.getEnabled());
            }
        }
    }

    /**
     * Returns the files currently being displayed in this block
     * 
     * @return files currently being displayed in this block
     */
    public ExeFileToDebug[] getFiles() {
        return (ExeFileToDebug[]) fExeFiles.toArray(new ExeFileToDebug[fExeFiles.size()]);
    }

    protected Shell getShell() {
        return getControl().getShell();
    }

    public void setEnabled(boolean enabled) {
        fExeFileList.getTable().setEnabled(enabled);
    }

    public void setAllChecked(boolean enabled) {
        fExeFileList.setAllChecked(enabled); // set the checked state in the table
        // ensure at least one file is left checked
        ExeFileToDebug fileToBeChecked = fMainExecutable;
        if (fileToBeChecked == null)
            fileToBeChecked = fExeFiles.get(0);
        fExeFileList.setChecked(fileToBeChecked, true);
        // enable or disable all the files - ensuring the one file is still enabled
        for (ExeFileToDebug exeFile : fExeFiles)
            exeFile.setEnabled(enabled);
        fileToBeChecked.setEnabled(true);

        fLaunchTab.dataChanged();
    }
}