org.hibernate.eclipse.criteriaeditor.CriteriaEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.hibernate.eclipse.criteriaeditor.CriteriaEditor.java

Source

/*
 * JBoss, Home of Professional Open Source
 * Copyright 2005, JBoss Inc., and individual contributors as indicated
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.hibernate.eclipse.criteriaeditor;

import java.util.HashSet;
import java.util.Iterator;
import java.util.ResourceBundle;
import java.util.Set;

import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.eval.IEvaluationContext;
import org.eclipse.jdt.ui.PreferenceConstants;
import org.eclipse.jdt.ui.text.java.CompletionProposalCollector;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextListener;
import org.eclipse.jface.text.TextEvent;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.editors.text.EditorsUI;
import org.eclipse.ui.texteditor.ChainedPreferenceStore;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
import org.eclipse.ui.texteditor.TextOperationAction;
import org.hibernate.console.ConsoleConfiguration;
import org.hibernate.console.KnownConfigurations;
import org.hibernate.console.QueryPage;
import org.hibernate.eclipse.console.AbstractQueryEditor;
import org.hibernate.eclipse.console.HibernateConsoleMessages;
import org.hibernate.eclipse.console.HibernateConsolePlugin;
import org.hibernate.eclipse.console.views.QueryPageTabView;
import org.jboss.tools.hibernate.runtime.spi.IConfiguration;
import org.jboss.tools.hibernate.runtime.spi.IPersistentClass;

public class CriteriaEditor extends AbstractQueryEditor {

    private CriteriaEditorDocumentSetupParticipant docSetupParticipant;

    public CriteriaEditor() {
        super();
        //setDocumentProvider(JDIDebugUIPlugin.getDefault().getSnippetDocumentProvider());
        // TODO: setup document
        // JavaTextTools tools= JDIDebugUIPlugin.getDefault().getJavaTextTools();
        //tools.setupJavaDocumentPartitioner(document, IJavaPartitions.JAVA_PARTITIONING);

        IPreferenceStore store = new ChainedPreferenceStore(new IPreferenceStore[] {
                PreferenceConstants.getPreferenceStore(), EditorsUI.getPreferenceStore() });

        setSourceViewerConfiguration(
                new JavaViewerConfiguration(HibernateConsolePlugin.getDefault().getJavaTextTools(), store, this));
        setPreferenceStore(store);
        setEditorContextMenuId("#CriteraEditorContext"); //$NON-NLS-1$
        setRulerContextMenuId("#CriteraRulerContext"); //$NON-NLS-1$

    }

    protected void createActions() {
        super.createActions();
        Action action = new TextOperationAction(getResourceBundle(), "HQLEditor_ContentAssistProposal_", this, //$NON-NLS-1$
                ISourceViewer.CONTENTASSIST_PROPOSALS);
        action.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
        setAction("ContentAssistProposal", action);//$NON-NLS-1$

    }

    private ResourceBundle getResourceBundle() {
        return ResourceBundle.getBundle(HibernateConsoleMessages.BUNDLE_NAME);
    }

    protected void doSetInput(IEditorInput input) throws CoreException {

        super.doSetInput(input);

        /* Make sure the document partitioner is set up. The document setup
           * participant sets up document partitioning, which is used for text
           * colorizing and other text features.
           */
        IDocumentProvider docProvider = this.getDocumentProvider();
        if (docProvider != null) {
            IDocument doc = docProvider.getDocument(input);
            if (doc != null) {
                CriteriaEditorDocumentSetupParticipant docSetupParticipant = getDocumentSetupParticipant();
                docSetupParticipant.setup(doc);
            }
        }

    }

    private CriteriaEditorDocumentSetupParticipant getDocumentSetupParticipant() {
        if (docSetupParticipant == null) {
            docSetupParticipant = new CriteriaEditorDocumentSetupParticipant();
        }
        return docSetupParticipant;
    }

    protected QueryPage queryPage = null;

    public void executeQuery(ConsoleConfiguration cfg) {
        final IWorkbenchPage activePage = getEditorSite().getPage();
        try {
            activePage.showView(QueryPageTabView.ID);
        } catch (PartInitException e) {
            // ignore
        }

        if (queryPage == null || !getPinToOneResTab()) {
            queryPage = cfg.executeBSHQuery(getQueryString(), getQueryInputModel().getCopyForQuery());
        } else {
            KnownConfigurations.getInstance().getQueryPageModel().remove(queryPage);
            queryPage = cfg.executeBSHQuery(getQueryString(), getQueryInputModel().getCopyForQuery());
        }
    }

    protected IEvaluationContext getEvaluationContext(IJavaProject project) {
        IEvaluationContext evalCtx = null;
        if (project != null) {
            evalCtx = project.newEvaluationContext();
        }
        if (evalCtx != null) {
            evalCtx.setImports(getImports());
        }
        return evalCtx;
    }

    private String[] getImports() {

        final ConsoleConfiguration consoleConfiguration = getConsoleConfiguration();

        if (!consoleConfiguration.hasConfiguration()) {
            try {
                consoleConfiguration.build();
                consoleConfiguration.buildMappings();
            } catch (Exception e) {
                String mess = NLS.bind(HibernateConsoleMessages.CompletionHelper_error_could_not_build_cc,
                        consoleConfiguration.getName());
                HibernateConsolePlugin.getDefault().logErrorMessage(mess, e);
            }
        }

        Set<String> imports = new HashSet<String>();
        IConfiguration configuration = consoleConfiguration.getConfiguration();
        if (configuration != null) {
            Iterator<IPersistentClass> classMappings = configuration.getClassMappings();
            while (classMappings.hasNext()) {
                IPersistentClass clazz = classMappings.next();
                String className = clazz.getClassName();
                if (className != null) {
                    imports.add(className);
                }
            }
        }

        imports.add("org.hibernate.*"); //$NON-NLS-1$
        imports.add("org.hibernate.criterion.*"); //$NON-NLS-1$

        return imports.toArray(new String[imports.size()]);
    }

    public void codeComplete(String prefix, CompletionProposalCollector collector, int position,
            IJavaProject project) throws JavaModelException {
        String code = getSourceViewer().getDocument().get();
        code = prefix + code;
        IEvaluationContext e = getEvaluationContext(project);
        if (e != null) {
            e.codeComplete(code, prefix.length() + position, collector);
        }
    }

    public void showEditorInput(IEditorInput editorInput) {

        if (!(getEditorInput() instanceof CriteriaEditorInput)) {
            super.showEditorInput(editorInput);
            return;
        }
        CriteriaEditorInput hei = (CriteriaEditorInput) getEditorInput();
        super.showEditorInput(editorInput);
        IStorage storage = ((CriteriaEditorInput) editorInput).getStorage();
        if (storage instanceof CriteriaEditorStorage) {
            CriteriaEditorStorage sqlEditorStorage = (CriteriaEditorStorage) storage;
            IDocument document = getDocumentProvider().getDocument(hei);
            if (document.get().compareTo(sqlEditorStorage.getContentsString()) != 0) {
                document.set(sqlEditorStorage.getContentsString());
            }
        }
    }

    public void createPartControl(Composite parent) {
        parent.setLayout(new GridLayout(1, false));

        createToolbar(parent);

        super.createPartControl(parent);
        if (getSourceViewer() != null) {
            getSourceViewer().addTextListener(new ITextListener() {

                public void textChanged(TextEvent event) {
                    updateExecButton();
                }
            });
        }

        Control control = parent.getChildren()[1];
        control.setLayoutData(new GridData(GridData.FILL_BOTH));

        // the following is needed to make sure the editor area gets focus when editing after query execution
        // TODO: find a better way since this is triggered on every mouse click and key stroke in the editor area
        // one more remark: without this code -> JBIDE-4446
        StyledText textWidget = getSourceViewer().getTextWidget();
        textWidget.addKeyListener(new KeyAdapter() {

            public void keyPressed(KeyEvent e) {
                getSite().getPage().activate(CriteriaEditor.this);
            }

        });
        textWidget.addMouseListener(new MouseAdapter() {

            public void mouseDown(MouseEvent e) {
                getSite().getPage().activate(CriteriaEditor.this);
            }

        });
        initTextAndToolTip(HibernateConsoleMessages.ExecuteQueryAction_run_criteria);
    }

    @Override
    protected String getConnectedImageFilePath() {
        return "icons/images/criteria_editor_connect.gif"; //$NON-NLS-1$
    }

    @Override
    protected String getSaveAsFileExtension() {
        return "*.crit"; //$NON-NLS-1$
    }
}