/* * Copyright (c) 2012 Data Harmonisation Panel * * All rights reserved. This program and the accompanying materials are made * available under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution. If not, see <http://www.gnu.org/licenses/>. * * Contributors: * HUMBOLDT EU Integrated Project #030962 * Data Harmonisation Panel <http://www.dhpanel.eu> */ package eu.esdihumboldt.hale.ui.functions.core; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.source.CompositeRuler; import org.eclipse.jface.text.source.IOverviewRuler; import org.eclipse.jface.text.source.IVerticalRuler; import org.eclipse.jface.text.source.LineNumberRulerColumn; import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.jface.text.source.SourceViewerConfiguration; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.ToolBar; import eu.esdihumboldt.hale.ui.util.source.SourceValidator; import eu.esdihumboldt.hale.ui.util.source.SourceViewerKeyBindings; import eu.esdihumboldt.hale.ui.util.source.SourceViewerPanel; import eu.esdihumboldt.hale.ui.util.source.ValidatingSourceViewer; /** * Parameter page using a source viewer. * * @author Simon Templer */ public abstract class SourceViewerParameterPage extends SourceListParameterPage<SourceViewer> { private ValidatingSourceViewer viewer; /** * @see SourceListParameterPage#SourceListParameterPage(String, String, * ImageDescriptor) */ public SourceViewerParameterPage(String pageName, String title, ImageDescriptor titleImage) { super(pageName, title, titleImage); } /** * @see SourceListParameterPage#SourceListParameterPage(String) */ public SourceViewerParameterPage(String pageName) { super(pageName); } /** * @see SourceListParameterPage#setText(Object, String) */ @Override protected void setText(SourceViewer viewer, String value) { viewer.getDocument().set(value); } /** * @see SourceListParameterPage#getText(Object) */ @Override protected String getText(SourceViewer viewer) { return viewer.getDocument().get(); } /** * @see SourceListParameterPage#insertTextAtCurrentPos(Object, String) */ @Override protected void insertTextAtCurrentPos(SourceViewer viewer, String insert) { Point selRange = viewer.getSelectedRange(); try { viewer.getDocument().replace(selRange.x, selRange.y, insert); } catch (BadLocationException e) { // ignore } } /** * @see SourceListParameterPage#createAndLayoutTextField(Composite) */ @Override protected SourceViewer createAndLayoutTextField(Composite parent) { // init editor IVerticalRuler verticalRuler = createVerticalRuler(); IOverviewRuler overviewRuler = createOverviewRuler(); SourceViewerPanel<?> panel = new SourceViewerPanel<Void>(parent, verticalRuler, overviewRuler, new SourceValidator() { @Override public boolean validate(String content) { return SourceViewerParameterPage.this.validate(content); } }, null); viewer = panel.getViewer(); panel.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); viewer.getTextWidget().setFont(JFaceResources.getTextFont()); viewer.addPropertyChangeListener(new IPropertyChangeListener() { @Override public void propertyChange(final PropertyChangeEvent event) { if (ValidatingSourceViewer.PROPERTY_VALID.equals(event.getProperty())) { getShell().getDisplay().syncExec(new Runnable() { @Override public void run() { setPageComplete((Boolean) event.getNewValue()); } }); } if (ValidatingSourceViewer.PROPERTY_VALIDATION_ENABLED.equals(event.getProperty())) { if (!((Boolean) event.getNewValue())) { // if validation is disabled, automatically set the page // to be complete setPageComplete(true); } } } }); SourceViewerKeyBindings.installDefault(viewer); addActions(panel.getToolbar(), viewer); return viewer; } /** * Add actions to the tool bar. * * @param toolbar the tool bar * @param viewer the source viewer */ protected void addActions(ToolBar toolbar, ValidatingSourceViewer viewer) { // override me } /** * Create the overview ruler for the source viewer. * * @return the overview ruler or <code>null</code> */ protected IOverviewRuler createOverviewRuler() { return null; } /** * Create the vertical ruler for the source viewer. * * @return the vertical ruler */ protected IVerticalRuler createVerticalRuler() { final Display display = Display.getCurrent(); CompositeRuler ruler = new CompositeRuler(3); LineNumberRulerColumn lineNumbers = new LineNumberRulerColumn(); lineNumbers.setBackground(display.getSystemColor(SWT.COLOR_GRAY)); // SWT.COLOR_INFO_BACKGROUND)); lineNumbers.setForeground(display.getSystemColor(SWT.COLOR_BLACK)); // SWT.COLOR_INFO_FOREGROUND)); lineNumbers.setFont(JFaceResources.getTextFont()); ruler.addDecorator(0, lineNumbers); return ruler; } /** * Configure the source viewer. Here the configuration and the document are * set. */ @Override protected void configure(SourceViewer viewer) { SourceViewerConfiguration conf = createConfiguration(); viewer.configure(conf); createAndSetDocument(viewer); } /** * Get the source viewer document. * * @return the document */ protected IDocument getDocument() { return getTextField().getDocument(); } /** * Force validation of the source viewers document. */ public void forceValidation() { if (viewer != null) { viewer.forceUpdate(); } } /** * Validate the given document. The default implementation always returns * <code>true</code>. * * @param document the document to validate * @return if the document is valid */ protected boolean validate(String document) { return true; } /** * Create the initial document and set it for the viewer. * * @param viewer the source viewer */ protected void createAndSetDocument(SourceViewer viewer) { IDocument doc = new Document(); doc.set(""); //$NON-NLS-1$ viewer.setDocument(doc); } /** * Create the source viewer configuration. * * @return the source viewer configuration */ protected SourceViewerConfiguration createConfiguration() { return new SourceViewerConfiguration(); } }