/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ui.editors.sql.syntax;
import org.eclipse.jface.text.*;
import org.eclipse.jface.text.information.IInformationProvider;
import org.eclipse.jface.text.information.IInformationProviderExtension;
import org.eclipse.jface.text.information.IInformationProviderExtension2;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.*;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.model.struct.DBSObjectReference;
import org.jkiss.dbeaver.ui.editors.sql.SQLEditorBase;
import org.jkiss.dbeaver.ui.editors.sql.util.SQLAnnotationHover;
import org.jkiss.dbeaver.ui.perspective.AbstractPartListener;
import org.jkiss.utils.ArrayUtils;
public class SQLInformationProvider implements IInformationProvider, IInformationProviderExtension, IInformationProviderExtension2 {
//private static final Log log = Log.getLog(SQLInformationProvider.class);
class EditorWatcher extends AbstractPartListener {
@Override
public void partClosed(IWorkbenchPart part)
{
if (part == editor) {
editor.getSite().getWorkbenchWindow().getPartService().removePartListener(partListener);
partListener = null;
}
}
@Override
public void partActivated(IWorkbenchPart part)
{
update();
}
@Override
public void partBroughtToTop(IWorkbenchPart part)
{
update();
}
}
protected SQLEditorBase editor;
protected IPartListener partListener;
protected String currentPerspective;
protected SQLAnnotationHover implementation;
protected IInformationControlCreator informationControlCreator;
public SQLInformationProvider(SQLEditorBase editor)
{
this.editor = editor;
implementation = new SQLAnnotationHover(editor);
if (this.editor != null) {
partListener = new EditorWatcher();
IWorkbenchWindow window = this.editor.getSite().getWorkbenchWindow();
window.getPartService().addPartListener(partListener);
update();
}
}
protected void update()
{
IWorkbenchWindow window = editor.getSite().getWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
if (page != null) {
IPerspectiveDescriptor perspective = page.getPerspective();
if (perspective != null) {
String perspectiveId = perspective.getId();
if (currentPerspective == null || !currentPerspective.equals(perspectiveId)) {
currentPerspective = perspectiveId;
implementation.setEditor(editor);
}
}
}
}
@Override
public IRegion getSubject(ITextViewer textViewer, int offset)
{
final Point selectedRange = textViewer.getSelectedRange();
if (selectedRange.y > 1) {
return new Region(selectedRange.x, selectedRange.y);
}
if (implementation != null) {
return implementation.getHoverRegion(textViewer, offset);
}
return null;
}
/*
* @deprecated
*/
@Override
public String getInformation(ITextViewer textViewer, IRegion subject)
{
Object information = getInformation2(textViewer, subject);
return information == null ? null : information.toString();
}
@Override
public Object getInformation2(ITextViewer textViewer, IRegion subject)
{
if (implementation != null) {
Object s = implementation.getHoverInfo2(textViewer, subject);
if (s != null) {
return s;
}
}
//SQLCompletionProposal proposal = new SQLCompletionProposal();
SQLContextInformer informer = new SQLContextInformer(editor, editor.getSyntaxManager());
informer.searchInformation(subject);
DBSObject object = null;
if (informer.hasObjects()) {
// Make object description
DBRProgressMonitor monitor = new VoidProgressMonitor();
final DBSObjectReference objectRef = informer.getObjectReferences().get(0);
try {
object = objectRef.resolveObject(monitor);
} catch (DBException e) {
// Can't resolve
return e.getMessage();
}
} else if (ArrayUtils.isEmpty(informer.getKeywords())) {
return null;
}
return SQLContextInformer.readAdditionalProposalInfo(null, editor.getDataSource(), object, informer.getKeywords(), informer.getKeywordType());
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.text.information.IInformationProviderExtension2#getInformationPresenterControlCreator()
*/
@Override
public IInformationControlCreator getInformationPresenterControlCreator()
{
if (informationControlCreator == null) {
informationControlCreator = new IInformationControlCreator() {
@Override
public IInformationControl createInformationControl(Shell shell)
{
return new DefaultInformationControl(shell, true);
}
};
}
return informationControlCreator;
}
}