org.eclipse.debug.internal.ui.actions.breakpointGroups.GroupBreakpointsByDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.debug.internal.ui.actions.breakpointGroups.GroupBreakpointsByDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2009 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.debug.internal.ui.actions.breakpointGroups;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
import org.eclipse.debug.internal.ui.SWTFactory;
import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointOrganizer;
import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointOrganizerManager;
import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.TrayDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.PlatformUI;

/**
 * Dialog which presents available breakpoint groupings to
 * the user and allows them to specify which they'd like
 * to use and in what order they should be applied.
 */
public class GroupBreakpointsByDialog extends TrayDialog {

    private BreakpointsView fView;

    // Table viewer that presents available containers
    private TableViewer fAvailableViewer;
    private AvailableOrganizersProvider fAvailableOrganizersProvider = new AvailableOrganizersProvider();

    // Tree viewer that presents selected containers
    private TreeViewer fSelectedViewer;
    private SelectedOrganizerProvider fSelectedOrganizersProvider = new SelectedOrganizerProvider();

    private List fResult = new ArrayList();

    private Button fAddButton;
    private Button fRemoveButton;
    private Button fMoveUpButton;
    private Button fMoveDownButton;

    /**
     * Selection listener that listens to selection from all buttons in this
     * dialog.
     */
    private SelectionAdapter fSelectionListener = new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {
            Object source = e.getSource();
            if (source == fAddButton) {
                handleAddPressed();
            } else if (source == fRemoveButton) {
                handleRemovePressed();
            } else if (source == fMoveUpButton) {
                handleMoveUpPressed();
            } else if (source == fMoveDownButton) {
                handleMoveDownPressed();
            }
        }
    };

    protected GroupBreakpointsByDialog(BreakpointsView view) {
        super(view.getSite().getShell());
        fView = view;
        setShellStyle(getShellStyle() | SWT.RESIZE);
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
     */
    protected Control createDialogArea(Composite parent) {
        ILabelProvider labelProvider = new BreakpointOrganzierLabelProvider();

        Composite parentComposite = (Composite) super.createDialogArea(parent);
        parentComposite.setFont(parent.getFont());
        Composite composite = new Composite(parentComposite, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.numColumns = 3;
        composite.setLayout(layout);
        GridData data = new GridData(GridData.FILL_BOTH);
        data.heightHint = 400;
        composite.setLayoutData(data);
        composite.setFont(parent.getFont());

        Label label = new Label(composite, SWT.WRAP);
        label.setText(BreakpointGroupMessages.GroupBreakpointsByDialog_0);
        GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
        gridData.horizontalSpan = 3;
        label.setLayoutData(gridData);

        createAvailableViewer(composite, labelProvider);
        createButtons(composite);
        createSelectedViewer(composite, labelProvider);

        initializeContent();
        updateViewers();
        Dialog.applyDialogFont(parentComposite);
        return parentComposite;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.Dialog#createContents(org.eclipse.swt.widgets.Composite)
     */
    protected Control createContents(Composite parent) {
        Control contents = super.createContents(parent);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(getDialogArea(),
                IDebugHelpContextIds.GROUP_BREAKPOINTS_DIALOG);
        return contents;
    }

    /**
     * Divides the available breakpoint container factories into the
     * appropriate viewers ("available" or "selected").
     */
    private void initializeContent() {
        IBreakpointOrganizer[] organizers = BreakpointOrganizerManager.getDefault().getOrganizers();
        for (int i = 0; i < organizers.length; i++) {
            fAvailableOrganizersProvider.addAvailable(organizers[i]);
        }
        organizers = fView.getBreakpointOrganizers();
        if (organizers != null) {
            for (int i = 0; i < organizers.length; i++) {
                fSelectedOrganizersProvider.addSelected(organizers[i]);
            }
        }
    }

    /**
     * Creates and configured the viewer that shows the available (not currently selected)
     * breakpoint container factories.
     */
    private void createAvailableViewer(Composite parent, ILabelProvider labelProvider) {
        Composite availableComposite = new Composite(parent, SWT.NONE);
        availableComposite.setFont(parent.getFont());
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        availableComposite.setLayout(layout);
        GridData gridData = new GridData(GridData.FILL_BOTH);
        gridData.widthHint = 225;
        availableComposite.setLayoutData(gridData);

        Label label = new Label(availableComposite, SWT.WRAP);
        label.setText(BreakpointGroupMessages.GroupBreakpointsByDialog_1);
        gridData = new GridData(GridData.FILL_HORIZONTAL);
        label.setLayoutData(gridData);

        fAvailableViewer = new TableViewer(availableComposite);
        fAvailableViewer.setContentProvider(fAvailableOrganizersProvider);
        fAvailableViewer.setLabelProvider(labelProvider);
        fAvailableViewer.setInput(new Object());
        Table table = fAvailableViewer.getTable();
        table.setLayoutData(new GridData(GridData.FILL_BOTH));
        table.setFont(parent.getFont());
        fAvailableViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                handleAddPressed();
            }
        });
        fAvailableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                updateAddButton();
            }
        });
    }

    /**
     * Creates and configures the viewer that shows the currently selected
     * breakpoint container factories.
     */
    private void createSelectedViewer(Composite parent, ILabelProvider labelProvider) {
        Composite selectedComposite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.numColumns = 2;
        selectedComposite.setLayout(layout);
        GridData gridData = new GridData(GridData.FILL_BOTH);
        gridData.widthHint = 225;
        selectedComposite.setLayoutData(gridData);
        selectedComposite.setFont(parent.getFont());

        Label label = new Label(selectedComposite, SWT.WRAP);
        label.setText(BreakpointGroupMessages.GroupBreakpointsByDialog_3);
        gridData = new GridData();
        gridData.horizontalSpan = 2;
        label.setLayoutData(gridData);

        fSelectedViewer = new TreeViewer(selectedComposite);
        fSelectedViewer.setContentProvider(fSelectedOrganizersProvider);
        fSelectedViewer.setLabelProvider(labelProvider);
        fSelectedViewer.setInput(new Object());
        Tree tree = fSelectedViewer.getTree();
        tree.setLayoutData(new GridData(GridData.FILL_BOTH));
        tree.setFont(parent.getFont());
        fSelectedViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                handleRemovePressed();
            }
        });
        fSelectedViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                updateSelectedButtons();
            }
        });
    }

    public void createButtons(Composite parent) {
        Composite buttonComposite = new Composite(parent, SWT.NONE);
        buttonComposite.setLayout(new GridLayout());
        buttonComposite.setLayoutData(new GridData());
        buttonComposite.setFont(parent.getFont());

        fAddButton = SWTFactory.createPushButton(buttonComposite,
                BreakpointGroupMessages.GroupBreakpointsByDialog_2, null);
        fAddButton.addSelectionListener(fSelectionListener);

        fRemoveButton = SWTFactory.createPushButton(buttonComposite,
                BreakpointGroupMessages.GroupBreakpointsByDialog_4, null);
        fRemoveButton.addSelectionListener(fSelectionListener);

        fMoveUpButton = SWTFactory.createPushButton(buttonComposite,
                BreakpointGroupMessages.GroupBreakpointsByDialog_5, null);
        fMoveUpButton.addSelectionListener(fSelectionListener);

        fMoveDownButton = SWTFactory.createPushButton(buttonComposite,
                BreakpointGroupMessages.GroupBreakpointsByDialog_6, null);
        fMoveDownButton.addSelectionListener(fSelectionListener);

    }

    /**
     * Returns the organizers chosen by the user. The order
     * of the list is the order that the organizers should be displayed
     * in the breakpoints view.
     * @return the breakpoint organizers chosen by the user
     */
    public IBreakpointOrganizer[] getOrganizers() {
        return (IBreakpointOrganizer[]) fResult.toArray(new IBreakpointOrganizer[fResult.size()]);
    }

    /**
     * When the user presses OK, convert the tree selection into a list.
     */
    protected void okPressed() {
        Object[] factories = fSelectedOrganizersProvider.getElements(null);
        while (factories.length > 0) {
            Object factory = factories[0];
            fResult.add(factory);
            factories = fSelectedOrganizersProvider.getChildren(factory);
        }
        super.okPressed();
    }

    /**
     * Moves the selected item from the list of "available" factories
     * to the tree of "selected" factories.
     */
    public void handleAddPressed() {
        IStructuredSelection selection = (IStructuredSelection) fAvailableViewer.getSelection();
        if (selection.size() < 1) {
            return;
        }
        Iterator iter = selection.iterator();
        while (iter.hasNext()) {
            fSelectedOrganizersProvider.addSelected((IBreakpointOrganizer) iter.next());
        }
        updateViewers();
    }

    /**
     * Moves the selected item from the tree of "selected" factories
     * to the list of "available" factories.
     */
    public void handleRemovePressed() {
        IStructuredSelection selection = (IStructuredSelection) fSelectedViewer.getSelection();
        if (selection.size() < 1) {
            return;
        }
        Iterator iter = selection.iterator();
        while (iter.hasNext()) {
            fAvailableOrganizersProvider.addAvailable((IBreakpointOrganizer) iter.next());
        }
        updateViewers();
    }

    /**
     * Moves each selected item up in the tree of selected containers
     */
    public void handleMoveUpPressed() {
        IStructuredSelection selection = (IStructuredSelection) fSelectedViewer.getSelection();
        Iterator iter = selection.iterator();
        while (iter.hasNext()) {
            fSelectedOrganizersProvider.moveUp(iter.next());
        }
        updateViewers();
    }

    /**
     * Moves each selected item down in the tree of selected containers
     */
    public void handleMoveDownPressed() {
        IStructuredSelection selection = (IStructuredSelection) fSelectedViewer.getSelection();
        Object[] elements = selection.toArray();
        for (int i = elements.length - 1; i >= 0; i--) {
            fSelectedOrganizersProvider.moveDown(elements[i]);
        }
        updateViewers();
    }

    /**
     * Fully refreshes and updates all viewers and buttons.
     */
    public void updateViewers() {
        fAvailableViewer.refresh();
        fSelectedViewer.refresh();
        fSelectedViewer.expandAll();
        updateAddButton();
        updateSelectedButtons();
    }

    /**
     * Updates all buttons associated with the tree of selected containers.
     */
    public void updateSelectedButtons() {
        updateRemoveButton();
        updateMoveUpButton();
        updateMoveDownButton();
    }

    public void updateAddButton() {
        IStructuredSelection selection = (IStructuredSelection) fAvailableViewer.getSelection();
        fAddButton.setEnabled(selection.size() > 0);
    }

    public void updateRemoveButton() {
        IStructuredSelection selection = (IStructuredSelection) fSelectedViewer.getSelection();
        fRemoveButton.setEnabled(selection.size() > 0);
    }

    public void updateMoveUpButton() {
        boolean enabled = true;
        IStructuredSelection selection = (IStructuredSelection) fSelectedViewer.getSelection();
        if (selection.size() == 0) {
            enabled = false;
        } else {
            Object firstSelected = selection.getFirstElement();
            Object parent = fSelectedOrganizersProvider.getParent(firstSelected);
            if (!(parent instanceof IBreakpointOrganizer)) {
                enabled = false;
            }
        }
        fMoveUpButton.setEnabled(enabled);
    }

    public void updateMoveDownButton() {
        boolean enabled = true;
        IStructuredSelection selection = (IStructuredSelection) fSelectedViewer.getSelection();
        if (selection.size() == 0) {
            enabled = false;
        } else {
            Object lastSelected = selection.toList().get(selection.size() - 1);
            Object[] children = fSelectedOrganizersProvider.getChildren(lastSelected);
            if (children.length < 1) {
                enabled = false;
            }
        }
        fMoveDownButton.setEnabled(enabled);
    }

    /**
     * Content provider that provides the list of breakpoint organaisers
      * that are available but not currently selected.
     */
    private class AvailableOrganizersProvider implements IStructuredContentProvider {
        protected List availableOrganziers = new ArrayList();

        public void addAvailable(IBreakpointOrganizer organizer) {
            availableOrganziers.add(organizer);
            fSelectedOrganizersProvider.selectedOrganizers.remove(organizer);
        }

        public Object[] getElements(Object inputElement) {
            return availableOrganziers.toArray();
        }

        public void dispose() {
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }
    }

    /**
     * Content provider that returns the selected breakpoint organizers
     * as a tree. This tree shows the list of organzizers as they will
     * appear in the breakpoints view.
     */
    private class SelectedOrganizerProvider implements ITreeContentProvider {
        protected List selectedOrganizers = new ArrayList();

        public void addSelected(IBreakpointOrganizer organizer) {
            selectedOrganizers.add(organizer);
            fAvailableOrganizersProvider.availableOrganziers.remove(organizer);
        }

        public void moveUp(Object object) {
            int index = selectedOrganizers.indexOf(object);
            if (index > 0) {
                selectedOrganizers.remove(object);
                selectedOrganizers.add(index - 1, object);
            }
        }

        public void moveDown(Object object) {
            int index = selectedOrganizers.indexOf(object);
            if (index < selectedOrganizers.size() - 1) {
                selectedOrganizers.remove(object);
                selectedOrganizers.add(index + 1, object);
            }
        }

        public Object[] getChildren(Object parentElement) {
            // A factory's "child" is the next factory in the list
            int index = selectedOrganizers.indexOf(parentElement);
            if (index < selectedOrganizers.size() - 1) {
                return new Object[] { selectedOrganizers.get(index + 1) };
            }
            return new Object[0];
        }

        public Object getParent(Object element) {
            // A factory's "parent" is the factory before it
            int index = selectedOrganizers.indexOf(element);
            if (index <= 0 || selectedOrganizers.size() <= 1) {
                return null;
            }
            return selectedOrganizers.get(index - 1);
        }

        public boolean hasChildren(Object element) {
            // A factory has "children" if there are more
            // factories after it.
            int index = selectedOrganizers.indexOf(element);
            return index != -1 && index < selectedOrganizers.size() - 1;
        }

        public Object[] getElements(Object inputElement) {
            if (selectedOrganizers.size() > 0) {
                return new Object[] { selectedOrganizers.get(0) };
            }
            return new Object[0];
        }

        public void dispose() {
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }
    }

    /**
     * Label provider which provides text and images for breakpoint container factories
     */
    private class BreakpointOrganzierLabelProvider extends LabelProvider {
        private HashMap fImageCache = new HashMap();

        public String getText(Object element) {
            if (element instanceof IBreakpointOrganizer) {
                return ((IBreakpointOrganizer) element).getLabel();
            }
            return super.getText(element);
        }

        public Image getImage(Object element) {
            if (element instanceof IBreakpointOrganizer) {
                ImageDescriptor imageDescriptor = ((IBreakpointOrganizer) element).getImageDescriptor();
                if (imageDescriptor != null) {
                    Image image = (Image) fImageCache.get(imageDescriptor);
                    if (image == null) {
                        image = imageDescriptor.createImage();
                        if (image != null) {
                            fImageCache.put(imageDescriptor, image);
                        }
                    }
                    return image;
                }
            }
            return super.getImage(element);
        }

        public void dispose() {
            Iterator imageIter = fImageCache.values().iterator();
            while (imageIter.hasNext()) {
                ((Image) imageIter.next()).dispose();
            }
            super.dispose();
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
     */
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText(BreakpointGroupMessages.GroupBreakpointsByDialog_7);
    }
}