blob: 470773e6b237348cf8ad0355def5c303be54b59d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.editors.text;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.ISourceViewerExtension2;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.texteditor.AbstractDecoratedTextEditor;
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
import org.eclipse.ui.texteditor.IUpdate;
import org.eclipse.ui.texteditor.spelling.SpellingProblem;
import org.eclipse.ui.texteditor.spelling.SpellingService;
/**
* The standard/default text editor.
* <p>
* This editor has id "{@link EditorsUI#DEFAULT_TEXT_EDITOR_ID org.eclipse.ui.DefaultTextEditor}".
* The editor's context menu has id <code>#TextEditorContext</code>. The editor's ruler context menu
* has id <code>#TextRulerContext</code>.
* </p>
* <p>
* The workbench will automatically instantiate this class when the default editor is needed for a
* workbench window.
* </p>
*/
public class TextEditor extends AbstractDecoratedTextEditor {
/**
* The encoding support for the editor.
* @since 2.0
*/
protected DefaultEncodingSupport fEncodingSupport;
/**
* Creates a new text editor.
*
* @see #initializeEditor()
* @see #initializeKeyBindingScopes()
*/
public TextEditor() {
if (getSourceViewerConfiguration() == null) {
// Configuration not yet set by subclass in initializeEditor()
setSourceViewerConfiguration(new TextSourceViewerConfiguration(getPreferenceStore()));
}
}
/**
* {@inheritDoc}
*
* This method configures the editor but does not define a
* <code>SourceViewerConfiguration</code>. When only interested in
* providing a custom source viewer configuration, subclasses may extend
* this method.
*/
@Override
protected void initializeEditor() {
super.initializeEditor();
setEditorContextMenuId("#TextEditorContext"); //$NON-NLS-1$
setRulerContextMenuId("#TextRulerContext"); //$NON-NLS-1$
setHelpContextId(ITextEditorHelpContextIds.TEXT_EDITOR);
configureInsertMode(SMART_INSERT, false);
setInsertMode(INSERT);
}
@Override
public void dispose() {
if (fEncodingSupport != null) {
fEncodingSupport.dispose();
fEncodingSupport= null;
}
super.dispose();
}
/**
* Installs the encoding support on the given text editor.
* <p>
* Subclasses may override to install their own encoding
* support or to disable the default encoding support.
* </p>
* @since 2.1
*/
protected void installEncodingSupport() {
fEncodingSupport= new DefaultEncodingSupport();
fEncodingSupport.initialize(this);
}
@Override
public boolean isSaveAsAllowed() {
return true;
}
@Override
protected void createActions() {
installEncodingSupport();
super.createActions();
}
@Override
protected String getStatusHeader(IStatus status) {
if (fEncodingSupport != null) {
String message= fEncodingSupport.getStatusHeader(status);
if (message != null)
return message;
}
return super.getStatusHeader(status);
}
@Override
protected String getStatusBanner(IStatus status) {
if (fEncodingSupport != null) {
String message= fEncodingSupport.getStatusBanner(status);
if (message != null)
return message;
}
return super.getStatusBanner(status);
}
@Override
protected String getStatusMessage(IStatus status) {
if (fEncodingSupport != null) {
String message= fEncodingSupport.getStatusMessage(status);
if (message != null)
return message;
}
return super.getStatusMessage(status);
}
@Override
protected void doSetInput(IEditorInput input) throws CoreException {
super.doSetInput(input);
if (fEncodingSupport != null)
fEncodingSupport.reset();
}
@SuppressWarnings("unchecked")
@Override
public <T> T getAdapter(Class<T> adapter) {
if (IEncodingSupport.class.equals(adapter))
return (T) fEncodingSupport;
return super.getAdapter(adapter);
}
@Override
protected void updatePropertyDependentActions() {
super.updatePropertyDependentActions();
if (fEncodingSupport != null)
fEncodingSupport.reset();
}
@Override
protected void handlePreferenceStoreChanged(PropertyChangeEvent event) {
if (event.getProperty().equals(SpellingService.PREFERENCE_SPELLING_ENABLED)) {
ISourceViewer viewer= getSourceViewer();
if (!(viewer instanceof ISourceViewerExtension2))
return; // cannot unconfigure - do nothing
// XXX: this is pretty heavy-weight
((ISourceViewerExtension2)viewer).unconfigure();
viewer.configure(getSourceViewerConfiguration());
if (Boolean.FALSE.equals(event.getNewValue()))
SpellingProblem.removeAll(getSourceViewer(), null);
IAction quickAssistAction= getAction(ITextEditorActionConstants.QUICK_ASSIST);
if (quickAssistAction instanceof IUpdate)
((IUpdate)quickAssistAction).update();
return;
}
super.handlePreferenceStoreChanged(event);
}
@Override
protected void editorContextMenuAboutToShow(IMenuManager menu) {
super.editorContextMenuAboutToShow(menu);
addAction(menu, ITextEditorActionConstants.GROUP_EDIT, ITextEditorActionConstants.SHIFT_RIGHT);
addAction(menu, ITextEditorActionConstants.GROUP_EDIT, ITextEditorActionConstants.SHIFT_LEFT);
}
}