org.eclipse.cdt.internal.autotools.ui.editors.QuickOutlineDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.cdt.internal.autotools.ui.editors.QuickOutlineDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2016 Red Hat Inc. 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:
 *     Red Hat Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.internal.autotools.ui.editors;

import org.eclipse.cdt.autotools.ui.editors.AutoconfEditor;
import org.eclipse.cdt.autotools.ui.editors.outline.AutoconfContentProvider;
import org.eclipse.cdt.autotools.ui.editors.outline.AutoconfLabelProvider;
import org.eclipse.cdt.autotools.ui.editors.parser.AutoconfElement;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.PopupDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
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.ui.editors.text.TextEditor;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;

public class QuickOutlineDialog extends PopupDialog {

    TreeViewer treeViewer;
    private Text filterText;

    private TextEditor editor;
    private ContainsFilter treeViewerFilter;

    public QuickOutlineDialog(Shell parent, int shellStyle, AutoconfEditor editor) {
        super(parent, shellStyle, true, true, true, true, true, null, null);
        this.editor = editor;
        create();
    }

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

    public void dispose() {
        close();
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        createUIWidgetTreeViewer(parent);
        createUIListenersTreeViewer();
        return treeViewer.getControl();
    }

    @Override
    protected Control createTitleControl(Composite parent) {
        filterText = new Text(parent, SWT.NONE);
        GC gc = new GC(parent);
        gc.setFont(parent.getFont());
        FontMetrics fontMetrics = gc.getFontMetrics();
        gc.dispose();
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false)
                .hint(SWT.DEFAULT, Dialog.convertHeightInCharsToPixels(fontMetrics, 1)).applyTo(filterText);

        filterText.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.keyCode == 0x0D) { // Enter pressed
                    gotoSelectedElement();
                } else if (e.keyCode == SWT.ARROW_DOWN) {
                    treeViewer.getTree().setFocus();
                } else if (e.keyCode == SWT.ARROW_UP) {
                    treeViewer.getTree().setFocus();
                } else if (e.character == 0x1B) { // Escape pressed
                    dispose();
                }
            }
        });
        filterText.addModifyListener(e -> {
            String filterTextInput = ((Text) e.widget).getText().toLowerCase();
            treeViewerFilter.setLookFor(filterTextInput);
            stringMatcherUpdated();
        });
        return filterText;
    }

    private void stringMatcherUpdated() {
        treeViewer.getControl().setRedraw(false);
        treeViewer.refresh();
        treeViewer.expandAll();
        if (treeViewer.getTree().getTopItem() != null && treeViewer.getTree().getTopItem().getItemCount() > 0) {
            treeViewer.getTree().select(treeViewer.getTree().getTopItem().getItem(0));
        } else if (treeViewer.getTree().getItemCount() > 0) {
            treeViewer.getTree().select(treeViewer.getTree().getItem(0));
        }
        treeViewer.getControl().setRedraw(true);
    }

    private void createUIWidgetTreeViewer(Composite parent) {
        final int style = SWT.H_SCROLL | SWT.V_SCROLL;
        final Tree widget = new Tree(parent, style);
        final GridData data = new GridData(GridData.FILL_BOTH);
        data.heightHint = widget.getItemHeight() * 12;
        widget.setLayoutData(data);
        treeViewer = new TreeViewer(widget);
        treeViewerFilter = new ContainsFilter();
        treeViewer.addFilter(treeViewerFilter);

        ITreeContentProvider fOutlineContentProvider = new AutoconfContentProvider(editor);
        ILabelProvider fTreeLabelProvider = new AutoconfLabelProvider();
        treeViewer.setContentProvider(fOutlineContentProvider);
        treeViewer.setLabelProvider(fTreeLabelProvider);
        treeViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
        treeViewer.setUseHashlookup(true);
        treeViewer.setInput(editor.getAdapter(IContentOutlinePage.class));
    }

    private void createUIListenersTreeViewer() {
        final Tree tree = treeViewer.getTree();
        tree.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
                gotoSelectedElement();
            }
        });
    }

    private void gotoSelectedElement() {
        if (editor instanceof AutoconfEditor) {
            final AutoconfElement curElement = (AutoconfElement) getSelectedElement();
            if (curElement == null) {
                return;
            }
            dispose();
            editor.setHighlightRange(curElement.getStartOffset(), curElement.getLength(), true);
        }
    }

    private Object getSelectedElement() {
        if (treeViewer == null) {
            return null;
        }
        return ((IStructuredSelection) treeViewer.getSelection()).getFirstElement();
    }
}