org.eclipse.mylyn.internal.wikitext.ui.editor.outline.QuickOutlinePopupDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.mylyn.internal.wikitext.ui.editor.outline.QuickOutlinePopupDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2009, 2014 David Green 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:
 *     David Green - initial API and implementation
 *     Marc-Andre Laperle (Ericsson) - Fix background color on Ubuntu
 *******************************************************************************/

package org.eclipse.mylyn.internal.wikitext.ui.editor.outline;

import org.eclipse.jface.dialogs.PopupDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.text.IInformationControl;
import org.eclipse.jface.text.IInformationControlExtension;
import org.eclipse.jface.text.IInformationControlExtension2;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.part.IShowInTarget;
import org.eclipse.ui.part.ShowInContext;

/**
 * A quick outline popup. Design based on PDE class by the same name.
 *
 * @author David Green
 */
public class QuickOutlinePopupDialog extends PopupDialog
        implements IInformationControl, IInformationControlExtension, IInformationControlExtension2 {

    private FilteredTree filteredTree;

    private final IShowInTarget showInTarget;

    private PatternFilter patternFilter;

    @SuppressWarnings("deprecation")
    public QuickOutlinePopupDialog(Shell parent, IShowInTarget showInTarget) {
        super(parent, SWT.RESIZE, true, true, false, false, null, null);
        this.showInTarget = showInTarget;
        setInfoText(Messages.QuickOutlinePopupDialog_infoText);
        create();
    }

    @Override
    protected Control createTitleControl(Composite parent) {
        Text fileterText = new Text(parent, SWT.SEARCH);
        GridDataFactory.fillDefaults().grab(true, false).applyTo(fileterText);
        return fileterText;
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        patternFilter = new PatternFilter();
        filteredTree = new FilteredTree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, patternFilter,
                true);

        int heightHint = (filteredTree.getViewer().getTree().getItemHeight() * 12)
                + Math.max(filteredTree.getFilterControl().getSize().y, 12);
        GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, heightHint).applyTo(filteredTree);

        filteredTree.getViewer().setUseHashlookup(true);
        filteredTree.getViewer().setContentProvider(new BaseWorkbenchContentProvider());
        filteredTree.getViewer().setLabelProvider(WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider());
        filteredTree.getViewer().setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);

        filteredTree.getViewer().getTree().addSelectionListener(new SelectionListener() {
            public void widgetDefaultSelected(SelectionEvent e) {
                handleSelection();
            }

            public void widgetSelected(SelectionEvent e) {
                // nothing to do
            }
        });
        // dispose when escape is pressed
        filteredTree.getViewer().getTree().addKeyListener(new KeyListener() {
            public void keyPressed(KeyEvent e) {
                if (e.character == 0x1B) {
                    dispose();
                }
            }

            public void keyReleased(KeyEvent e) {
            }
        });
        // single mouse click causes selection
        filteredTree.getViewer().getTree().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseUp(MouseEvent e) {
                Tree tree = filteredTree.getViewer().getTree();
                if ((tree.getSelectionCount() < 1) || (e.button != 1)) {
                    return;
                }
                // Selection is made in the selection changed listener
                Object object = tree.getItem(new Point(e.x, e.y));
                TreeItem selection = tree.getSelection()[0];
                if (selection.equals(object)) {
                    handleSelection();
                }
            }
        });
        return filteredTree;
    }

    public void addDisposeListener(DisposeListener listener) {
        getShell().addDisposeListener(listener);
    }

    public void addFocusListener(FocusListener listener) {
        getShell().addFocusListener(listener);
    }

    public Point computeSizeHint() {
        return getShell().getSize();
    }

    public void dispose() {
        close();
    }

    public boolean isFocusControl() {
        return filteredTree.isFocusControl() || filteredTree.getFilterControl().isFocusControl()
                || filteredTree.getViewer().getTree().isFocusControl();
    }

    public void removeDisposeListener(DisposeListener listener) {
        getShell().removeDisposeListener(listener);
    }

    public void removeFocusListener(FocusListener listener) {
        getShell().removeFocusListener(listener);
    }

    public void setFocus() {
        getShell().forceFocus();
        filteredTree.getFilterControl().setFocus();
    }

    public void setBackgroundColor(Color background) {
        applyBackgroundColor(background, getContents());
    }

    public void setForegroundColor(Color foreground) {
        applyForegroundColor(foreground, getContents());
    }

    public void setInformation(String information) {
        // ignore
    }

    public void setLocation(Point location) {
        getShell().setLocation(location);
    }

    public void setSize(int width, int height) {
        getShell().setSize(width, height);
    }

    public void setSizeConstraints(int maxWidth, int maxHeight) {
        // ignore

    }

    public void setVisible(boolean visible) {
        if (visible) {
            open();
        } else {
            saveDialogBounds(getShell());
            getShell().setVisible(false);
        }
    }

    public boolean hasContents() {
        if (filteredTree == null || filteredTree.getViewer().getInput() == null) {
            return false;
        }
        return true;
    }

    public void setInput(Object input) {
        filteredTree.getViewer().setInput(input);
    }

    private void handleSelection() {
        if (showInTarget != null) {
            ISelection selection = filteredTree.getViewer().getSelection();
            if (!selection.isEmpty()) {
                showInTarget.show(new ShowInContext(null, selection));
            }
        }
        dispose();
    }

}