org.eclipse.recommenders.internal.codesearch.rcp.views.AbstractEmbeddedEditorWrapper.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.recommenders.internal.codesearch.rcp.views.AbstractEmbeddedEditorWrapper.java

Source

/**
 * Copyright (c) 2012 Tobias Boehm.
 * 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:
 *    Tobias Boehm - initial API and implementation.
 */

package org.eclipse.recommenders.internal.codesearch.rcp.views;

import java.util.Set;

import org.eclipse.recommenders.codesearch.rcp.index.searcher.CodeSearcher;
import org.eclipse.recommenders.codesearch.rcp.index.searcher.SearchResult;
import org.eclipse.recommenders.injection.InjectionService;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.xtext.builder.internal.Activator;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.editor.embedded.EmbeddedEditor;
import org.eclipse.xtext.ui.editor.embedded.EmbeddedEditorModelAccess;
import org.eclipse.xtext.ui.editor.model.XtextDocument;
import org.eclipse.xtext.util.concurrent.IUnitOfWork;

import com.google.common.collect.Lists;

@SuppressWarnings("restriction")
public abstract class AbstractEmbeddedEditorWrapper {

    protected EmbeddedEditorModelAccess partialEditor;
    protected EmbeddedEditor handle;
    protected Composite parent;
    protected Combo exampleCombo;
    protected CodeSearcher codeSearcher;
    protected ISearchView searchView;

    abstract void createQueryEditorInternal();

    public AbstractEmbeddedEditorWrapper() {
        codeSearcher = InjectionService.getInstance().requestInstance(CodeSearcher.class);
    }

    public void createQueryEditor(final Composite parent, final Combo exampleCombo, final ISearchView searchView) {
        this.parent = parent;
        this.searchView = searchView;

        exampleCombo.setItems(getExampleQueries());
        exampleCombo.select(0);

        if (parent.getChildren().length > 0) {
            parent.getChildren()[0].dispose();
        }

        createQueryEditorInternal();

        parent.getChildren()[0].addKeyListener(new KeyListener() {

            @Override
            public void keyPressed(final KeyEvent e) {
                if (((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == '\r')) {
                    try {
                        searchView.doSearch();
                        e.doit = false;
                    } catch (Exception e1) {
                        Activator.log(e1);
                    }
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {
            }
        });

        parent.layout();
        parent.getParent().layout();
    }

    abstract String[] getExampleQueriesInternal();

    private String[] getExampleQueries() {
        final String[] providedExamples = getExampleQueriesInternal();
        final String[] items = new String[providedExamples.length + 1];
        return Lists.asList("Select Example Query...", providedExamples).toArray(items);
    }

    protected void resetXtextQuery() {
        Display.getDefault().syncExec(new Runnable() {

            @Override
            public void run() {
                // TODO refactor: there should be a better way
                // When we convert from dot- to L/-notation we actually modify
                // the model. The next stmt is to undo that
                handle.getDocument().set(handle.getDocument().get().trim());
            }
        });
    }

    abstract SearchResult search() throws Exception;

    abstract IUnitOfWork<Set<String>, XtextResource> getSearchTermExtractor();

    public String getSearchQuery() {
        final StringBuilder string = new StringBuilder();

        Display.getDefault().syncExec(new Runnable() {

            @Override
            public void run() {
                // string.append(searchQueryText.getText());
                string.append(partialEditor.getSerializedModel());
            }
        });

        return string.toString();
    }

    public void setSearchQuery(final String q) {

        Display.getDefault().syncExec(new Runnable() {

            @Override
            public void run() {
                handle.getDocument().set(q);
            }
        });
    }

    public XtextDocument getDocument() {
        return handle.getDocument();
    }
}