/*******************************************************************************
* Copyright (c) 2005, 2012 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
*
*******************************************************************************/
package org.eclipse.vjet.eclipse.internal.ui.editor;
import org.eclipse.dltk.mod.core.IDLTKLanguageToolkit;
import org.eclipse.dltk.mod.internal.ui.actions.FoldingActionGroup;
import org.eclipse.dltk.mod.internal.ui.editor.ScriptEditor;
import org.eclipse.dltk.mod.internal.ui.editor.ScriptOutlinePage;
import org.eclipse.dltk.mod.ui.text.ScriptTextTools;
import org.eclipse.dltk.mod.ui.text.folding.IFoldingStructureProvider;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentExtension3;
import org.eclipse.jface.text.ITextViewerExtension;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.actions.ActionGroup;
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
import org.eclipse.vjet.eclipse.core.VjoLanguageToolkit;
import org.eclipse.vjet.eclipse.internal.ui.preferences.JavascriptPreferenceConstants;
import org.eclipse.vjet.eclipse.internal.ui.text.IJavaScriptPartitions;
import org.eclipse.vjet.eclipse.internal.ui.text.JavaScriptPairMatcher;
import org.eclipse.vjet.eclipse.internal.ui.text.folding.VjoFoldingStructureProvider;
import org.eclipse.vjet.eclipse.ui.VjetUIPlugin;
import org.eclipse.vjet.eclipse.ui.actions.JavaScriptGenerateActionGroup;
public class JavaScriptEditor extends ScriptEditor {
public static final String EDITOR_ID = "org.eclipse.dltk.mod.javascript.internal.ui.editor.JavascriptEditor";
public static final String EDITOR_CONTEXT = "#JavascriptEditorContext";
public static final String RULER_CONTEXT = "#JavascriptRulerContext";
private org.eclipse.dltk.mod.internal.ui.editor.BracketInserter fBracketInserter = new JavaScriptBracketInserter(
this);
// protected class FormatElementAction extends Action implements IUpdate {
//
// /*
// * @since 3.2
// */
// FormatElementAction() {
// setText("Format Eleme&nt"); //$NON-NLS-1$
// setEnabled(isEditorInputModifiable());
// }
//
// /*
// * @see org.eclipse.jface.action.IAction#run()
// */
// public void run() {
//
// final ScriptSourceViewer viewer = (ScriptSourceViewer) getSourceViewer();
// if (viewer.isEditable()) {
//
// final Point selection = viewer.rememberSelection();
// try {
// viewer.setRedraw(false);
//
// final String type = TextUtilities.getContentType(viewer
// .getDocument(),
// IJavaScriptPartitions.JS_PARTITIONING, selection.x,
// true);
// if (type.equals(IDocument.DEFAULT_CONTENT_TYPE)
// && selection.y == 0) {
//
// try {
// final IModelElement element = getElementAt(
// selection.x, true);
// if (element != null && element.exists()) {
//
// final int kind = element.getElementType();
// if (kind == IModelElement.TYPE
// || kind == IModelElement.METHOD) {
//
// final ISourceReference reference = (ISourceReference) element;
// final ISourceRange range = reference
// .getSourceRange();
//
// if (range != null) {
// viewer
// .setSelectedRange(range
// .getOffset(), range
// .getLength());
// viewer
// .doOperation(ISourceViewer.FORMAT);
// }
// }
// }
// } catch (ModelException exception) {
// // Should not happen
// }
// } else {
// viewer.setSelectedRange(selection.x, 1);
// viewer.doOperation(ISourceViewer.FORMAT);
// }
// } catch (BadLocationException exception) {
// // Can not happen
// } finally {
//
// viewer.setRedraw(true);
// viewer.restoreSelection();
// }
// }
// }
//
// /*
// * @see org.eclipse.ui.texteditor.IUpdate#update()
// *
// * @since 3.2
// */
// public void update() {
// setEnabled(isEditorInputModifiable());
// }
// }
private JavaScriptPairMatcher bracketMatcher = new JavaScriptPairMatcher(
"{}[]()".toCharArray());
public void createPartControl(Composite parent) {
super.createPartControl(parent);
IPreferenceStore preferenceStore = getPreferenceStore();
boolean closeBrackets = preferenceStore.getBoolean(CLOSE_BRACKETS);
boolean closeStrings = preferenceStore.getBoolean(CLOSE_STRINGS);
boolean closeAngularBrackets = false;
fBracketInserter.setCloseBracketsEnabled(closeBrackets);
fBracketInserter.setCloseStringsEnabled(closeStrings);
fBracketInserter.setCloseAngularBracketsEnabled(closeAngularBrackets);
ISourceViewer sourceViewer = getSourceViewer();
if (sourceViewer instanceof ITextViewerExtension)
((ITextViewerExtension) sourceViewer)
.prependVerifyKeyListener(fBracketInserter);
// if (isMarkingOccurrences())
// installOccurrencesFinder(false);
}
protected void initializeEditor() {
super.initializeEditor();
setEditorContextMenuId(EDITOR_CONTEXT);
setRulerContextMenuId(RULER_CONTEXT);
}
protected IPreferenceStore getScriptPreferenceStore() {
return VjetUIPlugin.getDefault().getPreferenceStore();
}
public ScriptTextTools getTextTools() {
return VjetUIPlugin.getDefault().getTextTools();
}
protected ScriptOutlinePage doCreateOutlinePage() {
return new JavaScriptOutlinePage(this, VjetUIPlugin.getDefault()
.getPreferenceStore());
}
protected void configureSourceViewerDecorationSupport(
SourceViewerDecorationSupport support) {
support.setCharacterPairMatcher(bracketMatcher);
support.setMatchingCharacterPainterPreferenceKeys(MATCHING_BRACKETS,
MATCHING_BRACKETS_COLOR);
super.configureSourceViewerDecorationSupport(support);
}
protected void connectPartitioningToElement(IEditorInput input,
IDocument document) {
if (document instanceof IDocumentExtension3) {
IDocumentExtension3 extension = (IDocumentExtension3) document;
if (extension
.getDocumentPartitioner(IJavaScriptPartitions.JS_PARTITIONING) == null) {
JavaScriptDocumentSetupParticipant participant = new JavaScriptDocumentSetupParticipant();
participant.setup(document);
}
}
}
IFoldingStructureProvider fFoldingProvider = null;
protected IFoldingStructureProvider getFoldingStructureProvider() {
if (fFoldingProvider == null) {
fFoldingProvider = new VjoFoldingStructureProvider();
}
return fFoldingProvider;
}
protected FoldingActionGroup createFoldingActionGroup() {
return new FoldingActionGroup(this, getViewer(), VjetUIPlugin
.getDefault().getPreferenceStore());
}
public String getEditorId() {
return EDITOR_ID;
}
public IDLTKLanguageToolkit getLanguageToolkit() {
return VjoLanguageToolkit.getDefault();
}
public String getCallHierarchyID() {
return "org.eclipse.dltk.mod.callhierarchy.view";
}
public void dispose() {
ISourceViewer sourceViewer = getSourceViewer();
if (sourceViewer instanceof ITextViewerExtension)
((ITextViewerExtension) sourceViewer)
.removeVerifyKeyListener(fBracketInserter);
super.dispose();
}
/** Preference key for automatically closing strings */
private final static String CLOSE_STRINGS = JavascriptPreferenceConstants.EDITOR_CLOSE_STRINGS;
/** Preference key for automatically closing brackets and parenthesis */
private final static String CLOSE_BRACKETS = JavascriptPreferenceConstants.EDITOR_CLOSE_BRACKETS;
protected void handlePreferenceStoreChanged(PropertyChangeEvent event) {
try {
String p = event.getProperty();
if (CLOSE_BRACKETS.equals(p)) {
fBracketInserter.setCloseBracketsEnabled(getPreferenceStore()
.getBoolean(p));
return;
}
if (CLOSE_STRINGS.equals(p)) {
fBracketInserter.setCloseStringsEnabled(getPreferenceStore()
.getBoolean(p));
return;
}
// if (SPACES_FOR_TABS.equals(p)) {
// if (isTabsToSpacesConversionEnabled())
// installTabsToSpacesConverter();
// else
// uninstallTabsToSpacesConverter();
// return;
// }
//
// if (PreferenceConstants.EDITOR_SMART_TAB.equals(p)) {
// if
// (getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SMART_TAB))
// {
// setActionActivationCode("IndentOnTab", '\t', -1, SWT.NONE);
// //$NON-NLS-1$
// } else {
// removeActionActivationCode("IndentOnTab"); //$NON-NLS-1$
// }
// }
//
// IContentAssistant c= asv.getContentAssistant();
// if (c instanceof ContentAssistant)
// ContentAssistPreference.changeConfiguration((ContentAssistant) c,
// getPreferenceStore(), event);
//
// if (CODE_FORMATTER_TAB_SIZE.equals(p) &&
// isTabsToSpacesConversionEnabled()) {
// uninstallTabsToSpacesConverter();
// installTabsToSpacesConverter();
// }
} finally {
super.handlePreferenceStoreChanged(event);
}
}
/*
* @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#initializeKeyBindingScopes()
*/
protected void initializeKeyBindingScopes() {
setKeyBindingScopes(new String[] { "org.eclipse.dltk.mod.ui.scriptEditorScope" }); //$NON-NLS-1$
}
protected void createActions() {
super.createActions();
ActionGroup generateActions = new JavaScriptGenerateActionGroup(this,
ITextEditorActionConstants.GROUP_EDIT);
fActionGroups.addGroup(generateActions);
fContextMenuGroup.addGroup(generateActions);
}
}