package org.erlide.ui.editors.erl;
import java.util.ResourceBundle;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.text.IInformationControlCreator;
import org.eclipse.jface.text.ITextViewerExtension;
import org.eclipse.jface.text.information.InformationPresenter;
import org.eclipse.jface.text.source.ICharacterPairMatcher;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.IVerticalRuler;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.editors.text.TextEditor;
import org.eclipse.ui.texteditor.ContentAssistAction;
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
import org.eclipse.ui.texteditor.ITextEditorExtension3;
import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
import org.eclipse.ui.texteditor.TextOperationAction;
import org.erlide.engine.model.IErlElement;
import org.erlide.engine.model.root.IErlModule;
import org.erlide.engine.model.root.IErlProject;
import org.erlide.engine.services.parsing.ScannerService;
import org.erlide.ui.actions.OpenAction;
import org.erlide.ui.editors.erl.actions.SendToConsoleAction;
import org.erlide.ui.prefs.PreferenceConstants;
public abstract class AbstractErlangEditor extends TextEditor {
protected final static String MATCHING_BRACKETS = PreferenceConstants.EDITOR_MATCHING_BRACKETS;
protected final static String MATCHING_BRACKETS_COLOR = PreferenceConstants.EDITOR_MATCHING_BRACKETS_COLOR;
private ErlangBracketInserter fBracketInserter;
private SendToConsoleAction sendToConsole;
private SendToConsoleAction sendToConsoleWithResult;
private OpenAction openAction;
InformationPresenter fInformationPresenter;
private ScannerService erlScanner;
public abstract void reconcileNow();
public abstract IErlElement getElementAt(int offset, boolean b);
public abstract IErlModule getModule();
public ScannerService getScanner() {
if (erlScanner == null) {
erlScanner = getNewScanner();
}
return erlScanner;
}
protected abstract ScannerService getNewScanner();
@Override
protected void configureSourceViewerDecorationSupport(
final SourceViewerDecorationSupport support) {
support.setCharacterPairMatcher(getBracketMatcher());
support.setMatchingCharacterPainterPreferenceKeys(MATCHING_BRACKETS,
MATCHING_BRACKETS_COLOR);
super.configureSourceViewerDecorationSupport(support);
}
public ICharacterPairMatcher getBracketMatcher() {
return ((ErlangSourceViewerConfiguration) getSourceViewerConfiguration())
.getBracketMatcher();
}
protected ErlangBracketInserter getBracketInserter() {
if (fBracketInserter == null) {
fBracketInserter = new ErlangBracketInserter(getSourceViewer());
}
return fBracketInserter;
}
public abstract IErlProject getProject();
public abstract String getScannerName();
protected void setupBracketInserter() {
final ISourceViewer sourceViewer = getSourceViewer();
if (sourceViewer instanceof ITextViewerExtension) {
((ITextViewerExtension) sourceViewer)
.prependVerifyKeyListener(getBracketInserter());
}
}
@Override
protected ISourceViewer createSourceViewer(final Composite parent,
final IVerticalRuler ruler, final int styles) {
final ISourceViewer viewer = new ErlangSourceViewer(parent, ruler,
getOverviewRuler(), true, styles, new IBracketInserterValidator() {
@Override
public boolean earlyCancelCheck() {
return getInsertMode() != ITextEditorExtension3.SMART_INSERT;
}
@Override
public boolean validInput() {
return validateEditorInputState();
}
});
getSourceViewerDecorationSupport(viewer);
addFoldingSupport(viewer);
return viewer;
}
protected abstract void addFoldingSupport(final ISourceViewer viewer);
protected void createCommonActions() {
openAction = new OpenAction(this);
openAction.setActionDefinitionId(IErlangEditorActionDefinitionIds.OPEN_EDITOR);
setAction(IErlangEditorActionDefinitionIds.OPEN, openAction);
final ResourceBundle keyBundle = ErlangEditorMessages
.getBundleForConstructedKeys();
sendToConsole = new SendToConsoleAction(getSite(), keyBundle, "SendToConsole.",
this, false, getProject());
sendToConsole
.setActionDefinitionId(IErlangEditorActionDefinitionIds.SEND_TO_CONSOLE);
setAction("SendToConsole", sendToConsole);
markAsStateDependentAction("sendToConsole", true);
markAsSelectionDependentAction("sendToConsole", true);
sendToConsoleWithResult = new SendToConsoleAction(getSite(), keyBundle,
"SendToConsoleWithResult.", this, true, getProject());
sendToConsoleWithResult.setActionDefinitionId(
IErlangEditorActionDefinitionIds.SEND_TO_CONSOLE_WITH_RESULT);
setAction("SendToConsoleWithResult", sendToConsoleWithResult);
markAsStateDependentAction("sendToConsoleWithResult", true);
markAsSelectionDependentAction("sendToConsoleWithResult", true);
final Action contentAssistAction = new ContentAssistAction(keyBundle,
"ContentAssistProposal.", this);
contentAssistAction.setActionDefinitionId(
ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
setAction("ContentAssistProposal", contentAssistAction);
markAsStateDependentAction("ContentAssistProposal", true);
final TextOperationAction showEdocAction0 = new TextOperationAction(keyBundle,
"ShowEDoc.", this, ISourceViewer.INFORMATION, true);
final ShowEDocAction showEdocAction = new ShowEDocAction(this, getSourceViewer(),
keyBundle, "ShowEDoc.", showEdocAction0);
showEdocAction.setActionDefinitionId(IErlangEditorActionDefinitionIds.SHOW_EDOC);
setAction("ShowEDoc", showEdocAction);
PlatformUI.getWorkbench().getHelpSystem().setHelp(showEdocAction,
IErlangHelpContextIds.SHOW_EDOC_ACTION);
}
protected void addCommonActions(final IMenuManager menu) {
// TODO disabled until erl_tidy doesn't destroy formatting
// menu.prependToGroup(IContextMenuConstants.GROUP_OPEN, cleanUpAction);
menu.prependToGroup(ITextEditorActionConstants.GROUP_OPEN, openAction);
menu.appendToGroup(ITextEditorActionConstants.GROUP_REST, sendToConsole);
menu.appendToGroup(ITextEditorActionConstants.GROUP_REST,
sendToConsoleWithResult);
}
@Override
public void createPartControl(final Composite parent) {
super.createPartControl(parent);
final IInformationControlCreator informationControlCreator = getSourceViewerConfiguration()
.getInformationControlCreator(getSourceViewer());
fInformationPresenter = new InformationPresenter(informationControlCreator);
// sizes: see org.eclipse.jface.text.TextViewer.TEXT_HOVER_*_CHARS
fInformationPresenter.setSizeConstraints(100, 12, true, true);
fInformationPresenter.install(getSourceViewer());
fInformationPresenter.setDocumentPartitioning(getSourceViewerConfiguration()
.getConfiguredDocumentPartitioning(getSourceViewer()));
}
}