/*
* Copyright (C) 2007 SQL Explorer Development Team
* http://sourceforge.net/projects/eclipsesql
*
* This program 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 library 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 library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package net.sourceforge.sqlexplorer.sqleditor;
import net.sourceforge.sqlexplorer.IConstants;
import net.sourceforge.sqlexplorer.sessiontree.model.utility.Dictionary;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.DefaultInformationControl;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentPartitioner;
import org.eclipse.jface.text.IInformationControl;
import org.eclipse.jface.text.IInformationControlCreator;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextHover;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.TextViewerUndoManager;
import org.eclipse.jface.text.contentassist.IContentAssistant;
import org.eclipse.jface.text.presentation.IPresentationReconciler;
import org.eclipse.jface.text.source.IAnnotationHover;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.IVerticalRuler;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.text.source.VerticalRuler;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
public class SQLTextViewer extends SourceViewer {
private class PreferenceListener implements IPropertyChangeListener {
public void propertyChange(PropertyChangeEvent event) {
adaptToPreferenceChange(event);
}
};
PreferenceListener fPreferenceListener = new PreferenceListener();
IPresentationReconciler fPresentationReconciler;
private IDocumentPartitioner partitioner;
SQLTextTools sqlTextTools;
IPreferenceStore store;
IContentAssistant contentAssistant;
public Dictionary dictionary;
SQLSourceViewerConfiguration configuration;
TextViewerUndoManager undoManager = new TextViewerUndoManager(50);
public SQLTextViewer(Composite parent, int style, IPreferenceStore store, final Dictionary dictionary) {
this(parent, style, store, dictionary, new VerticalRuler(0));
}
public SQLTextViewer(Composite parent, int style, IPreferenceStore store, final Dictionary dictionary, IVerticalRuler ruler) {
super(parent, ruler, style);
this.store = store;
this.dictionary = dictionary;
sqlTextTools = new SQLTextTools(store, dictionary);
this.getControl().addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
sqlTextTools.dispose();
fPresentationReconciler.uninstall();
}
});
store.addPropertyChangeListener(fPreferenceListener);
configuration = new SQLSourceViewerConfiguration(sqlTextTools);
fPresentationReconciler = configuration.getPresentationReconciler(null);
if (dictionary != null) {
contentAssistant = configuration.getContentAssistant(null);
if (contentAssistant != null) {
contentAssistant.install(this);
}
}
if (fPresentationReconciler != null)
fPresentationReconciler.install(this);
partitioner = configuration.getDocumentPartitioner();
parent.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
if (dictionary != null) {
if (contentAssistant != null) {
try {
contentAssistant.uninstall();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
});
fInformationPresenter = configuration.getInformationPresenter(this);
if (fInformationPresenter != null)
fInformationPresenter.install(this);
this.setAnnotationHover(new IAnnotationHover() {
public String getHoverInfo(ISourceViewer sourceViewer, int lineNumber) {
return "hover info";
}
});
setHoverControlCreator(new IInformationControlCreator() {
public IInformationControl createInformationControl(Shell parent) {
return new DefaultInformationControl(parent);
}
});
String[] contentTypes = {IDocument.DEFAULT_CONTENT_TYPE, IConstants.SQL_SINGLE_LINE_COMMENT, IConstants.SQL_STRING,
IConstants.SQL_MULTILINE_COMMENT};
for (int i = 0; i < contentTypes.length; i++) {
super.setTextHover(new ITextHover() {
public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
//
return "";
}
public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
return new Region(offset, 1);
}
}, contentTypes[i]);
}
super.activatePlugins();
}
@Override
public void setDocument(IDocument dc) {
IDocument previous = this.getDocument();
if (previous != null) {
partitioner.disconnect();
}
super.setDocument(dc);
if (dc != null) {
partitioner.connect(dc);
dc.setDocumentPartitioner(partitioner);
undoManager.connect(this);
this.setUndoManager(undoManager);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.text.source.ISourceViewer#setDocument(org.eclipse.jface.text.IDocument,
* org.eclipse.jface.text.source.IAnnotationModel)
*/
@Override
public void setDocument(IDocument document, IAnnotationModel annotationModel) {
setDocument(document);
if (annotationModel != null && document != null)
annotationModel.connect(document);
}
public void setNewDictionary(Dictionary newDictionary) {
dictionary = newDictionary;
if (contentAssistant != null) {
contentAssistant.uninstall();
contentAssistant = null;
}
sqlTextTools = new SQLTextTools(store, dictionary);
configuration = new SQLSourceViewerConfiguration(sqlTextTools);
fPresentationReconciler = configuration.getPresentationReconciler(null);
if (fPresentationReconciler != null) {
fPresentationReconciler.install(this);
}
if (dictionary != null) {
contentAssistant = configuration.getContentAssistant(null);
if (contentAssistant != null) {
contentAssistant.install(this);
}
}
}
void adaptToPreferenceChange(PropertyChangeEvent event) {
if (event.getProperty().equals(IConstants.FONT)) {
FontData[] fData = PreferenceConverter.getFontDataArray(store, IConstants.FONT);
String des = store.getString(IConstants.FONT);
JFaceResources.getFontRegistry().put(des, fData);
Control ctrl = this.getControl();
if (ctrl != null) {
getTextWidget().setFont(JFaceResources.getFontRegistry().get(des));
}
}
}
public void showAssistance() {
if (dictionary != null)
contentAssistant.showPossibleCompletions();
}
/**
*
*/
public void clearText() {
getTextWidget().setText("");
}
}