/*
* 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, ISourceViewer.CONTENTASSIST_PROPOSALS); //$NON-NLS-1$
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$
}
}