package org.hibernate.eclipse.console.views;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
import org.eclipse.jface.text.reconciler.MonoReconciler;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.text.source.VerticalRuler;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IPartService;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.hibernate.console.ConsoleConfiguration;
import org.hibernate.eclipse.console.HibernateConsoleMessages;
import org.hibernate.eclipse.console.common.HibernateExtension;
import org.hibernate.eclipse.hqleditor.HQLEditor;
import org.hibernate.eclipse.hqleditor.HQLEditorDocumentSetupParticipant;
import org.hibernate.eclipse.hqleditor.HQLSourceViewer;
import org.hibernate.eclipse.hqleditor.HQLSourceViewerConfiguration;
import org.hibernate.util.xpl.StringHelper;
public class DynamicSQLPreviewView extends ViewPart {
private IPartListener2 partListener = new IPartListener2() {
public void partInputChanged(IWorkbenchPartReference partRef) {
}
public void partVisible(IWorkbenchPartReference partRef) {
}
public void partHidden(IWorkbenchPartReference partRef) {
}
public void partOpened(IWorkbenchPartReference partRef) {
}
public void partDeactivated(IWorkbenchPartReference partRef) {
}
public void partClosed(IWorkbenchPartReference partRef) {
if(partRef.getPart(false)==currentEditor) {
setCurrentEditor(null);
}
}
public void partBroughtToTop(IWorkbenchPartReference partRef) {
hookIntoEditor(partRef);
}
public void partActivated(IWorkbenchPartReference partRef) {
hookIntoEditor( partRef );
}
};
private SourceViewer textViewer;
private HQLEditor currentEditor;
private MonoReconciler reconciler;
private HQLEditorDocumentSetupParticipant docSetupParticipant = new HQLEditorDocumentSetupParticipant();
private void hookIntoEditor(IWorkbenchPartReference partRef) {
if(partRef==null) {
setCurrentEditor(null);
return;
}
IWorkbenchPart part = partRef.getPart(false);
if(part!=null && (part instanceof HQLEditor)) {
setCurrentEditor((HQLEditor) part);
}
}
private void setCurrentEditor(HQLEditor editor) {
if(editor==currentEditor) {
updateText(currentEditor);
return;
}
if(currentEditor!=null) {
reconciler.uninstall();
}
currentEditor = editor;
if(currentEditor!=null) {
ITextViewer editorViewer = currentEditor.getTextViewer();
reconciler.install(editorViewer);
}
updateText(currentEditor);
}
private void updateText(HQLEditor editor) {
if(textViewer!=null && textViewer.getDocument()!=null) {
if(editor!=null) {
ConsoleConfiguration consoleConfiguration = editor.getConsoleConfiguration();
if(StringHelper.isEmpty( editor.getQueryString() )) {
textViewer.getDocument().set( HibernateConsoleMessages.DynamicSQLPreviewView_empty_hql_query );
} else if(consoleConfiguration!=null) {
HibernateExtension hibernateExtension = consoleConfiguration.getHibernateExtension();
if(hibernateExtension.isSessionFactoryCreated()) {
String generateSQL = hibernateExtension.generateSQL(editor.getQueryString());
if(StringHelper.isEmpty( generateSQL )) {
textViewer.getDocument().set( HibernateConsoleMessages.DynamicSQLPreviewView_no_sql_generated );
} else {
textViewer.getDocument().set(generateSQL);
}
} else {
textViewer.getDocument().set(HibernateConsoleMessages.DynamicSQLPreviewView_session_factory_not_created + consoleConfiguration.getName());
}
} else {
textViewer.getDocument().set(HibernateConsoleMessages.DynamicSQLPreviewView_no_console_conf_associated);
}
} else {
textViewer.getDocument().set(HibernateConsoleMessages.DynamicSQLPreviewView_no_hql_query_editor);
}
}
}
public void createPartControl(Composite parent) {
textViewer = new HQLSourceViewer( parent, new VerticalRuler(1), null, false, SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL );
//textViewer.setEditable(false);
IDocument doc = new Document();
textViewer.setDocument( doc );
docSetupParticipant.setup( doc );
textViewer.getDocument().set(HibernateConsoleMessages.DynamicSQLPreviewView_no_hql_query_editor_selected);
textViewer.configure(new HQLSourceViewerConfiguration(null));
IWorkbenchWindow window = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow();
IPartService service = window.getPartService();
hookIntoEditor(service.getActivePartReference());
}
public void init(IViewSite site) throws PartInitException {
super.init(site);
IReconcilingStrategy strategy = new AbstractReconcilingStrategy() {
protected void doReconcile(final IDocument doc) {
Display display = PlatformUI.getWorkbench().getDisplay();
display.asyncExec(new Runnable() {
public void run() {
//textViewer.getDocument().set(doc.get());
updateText(currentEditor);
}
});
}
};
reconciler = new MonoReconciler(strategy,false);
reconciler.setDelay(500);
IWorkbenchWindow window = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow();
IPartService service = window.getPartService();
service.addPartListener(partListener);
hookIntoEditor(service.getActivePartReference());
}
public void dispose() {
IWorkbenchWindow window = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow();
if (window != null){
IPartService service = window.getPartService();
service.removePartListener(partListener);
}
docSetupParticipant.unsetup();
super.dispose();
}
public void setFocus() {
}
}