package org.erlide.ui.editors.scratchpad;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.ITextViewerExtension;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.ISaveablePart2;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.actions.ActionGroup;
import org.eclipse.ui.editors.text.EditorsUI;
import org.eclipse.ui.editors.text.TextFileDocumentProvider;
import org.eclipse.ui.texteditor.ChainedPreferenceStore;
import org.erlide.engine.ErlangEngine;
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.CompositeActionGroup;
import org.erlide.ui.actions.ErlangSearchActionGroup;
import org.erlide.ui.editors.erl.AbstractErlangEditor;
import org.erlide.ui.editors.erl.ErlangSourceViewerConfiguration;
import org.erlide.ui.editors.erl.folding.IErlangFoldingStructureProvider;
import org.erlide.ui.internal.ErlideUIPlugin;
import org.erlide.ui.util.ColorManager;
import org.erlide.util.ErlLogger;
import org.erlide.util.Util;
public class ErlangScratchPad extends AbstractErlangEditor implements ISaveablePart2 {
private ColorManager colorManager;
private IErlangFoldingStructureProvider fProjectionModelUpdater;
private CompositeActionGroup fActionGroups;
private CompositeActionGroup fContextMenuGroup;
/**
* Simple constructor
*
*/
public ErlangScratchPad() {
super();
registerListeners();
}
private void registerListeners() {
}
/**
* Simple disposer
*
* @see org.eclipse.ui.IWorkbenchPart#dispose()
*/
@Override
public void dispose() {
if (colorManager != null) {
colorManager.dispose();
colorManager = null;
}
final ISourceViewer sourceViewer = getSourceViewer();
if (sourceViewer instanceof ITextViewerExtension) {
((ITextViewerExtension) sourceViewer)
.removeVerifyKeyListener(getBracketInserter());
}
if (fActionGroups != null) {
fActionGroups.dispose();
fActionGroups = null;
}
if (fProjectionModelUpdater != null) {
fProjectionModelUpdater.uninstall();
}
super.dispose();
}
@Override
protected void initializeEditor() {
colorManager = new ColorManager();
setDocumentProvider(new TextFileDocumentProvider());
final IPreferenceStore store = getErlangEditorPreferenceStore();
setPreferenceStore(store);
final ErlangSourceViewerConfiguration cfg = new ErlangScratchPadConfiguration(
getPreferenceStore(), colorManager, this);
setSourceViewerConfiguration(cfg);
}
@Override
public IErlProject getProject() {
final IFile file = getFile();
if (file != null) {
final IProject project = file.getProject();
if (project != null) {
return ErlangEngine.getInstance().getModel().findProject(project);
}
}
return null;
}
public static ChainedPreferenceStore getErlangEditorPreferenceStore() {
final IPreferenceStore generalTextStore = EditorsUI.getPreferenceStore();
return new ChainedPreferenceStore(new IPreferenceStore[] {
ErlideUIPlugin.getDefault().getPreferenceStore(), generalTextStore });
}
@Override
public void createPartControl(final Composite parent) {
super.createPartControl(parent);
setupBracketInserter();
}
@Override
protected void createActions() {
super.createActions();
ActionGroup esg;
fActionGroups = new CompositeActionGroup(
new ActionGroup[] { esg = new ErlangSearchActionGroup(this) });
fContextMenuGroup = new CompositeActionGroup(new ActionGroup[] { esg });
createCommonActions();
// if (ErlideUtil.isTest()) {
// testAction = new TestAction(ErlangEditorMessages
// .getBundleForConstructedKeys(), "Test.", this, getModule());
// testAction
// .setActionDefinitionId(IErlangEditorActionDefinitionIds.TEST);
// setAction("Test", testAction);
// markAsStateDependentAction("Test", true);
// markAsSelectionDependentAction("Test", true);
// // PlatformUI.getWorkbench().getHelpSystem().setHelp(indentAction,
// // IErlangHelpContextIds.INDENT_ACTION);
// }
}
@Override
protected void editorContextMenuAboutToShow(final IMenuManager menu) {
super.editorContextMenuAboutToShow(menu);
// if (ErlideUtil.isTest()) {
// menu.prependToGroup(IContextMenuConstants.GROUP_OPEN, testAction);
// }
addCommonActions(menu);
final ActionContext context = new ActionContext(
getSelectionProvider().getSelection());
fContextMenuGroup.setContext(context);
fContextMenuGroup.fillContextMenu(menu);
fContextMenuGroup.setContext(null);
}
// Auto-saving when quitting or closing, through ISaveablePart2
@Override
public int promptToSaveOnClose() {
doSave(getProgressMonitor());
return NO;
}
@Override
protected void initializeKeyBindingScopes() {
setKeyBindingScopes(new String[] { "org.erlide.ui.erlangEditorScope" }); //$NON-NLS-1$
}
@Override
public void reconcileNow() {
}
@Override
public IErlElement getElementAt(final int offset, final boolean b) {
return null;
}
@Override
public IErlModule getModule() {
return null;
}
private IFile getFile() {
final IEditorInput editorInput = getEditorInput();
if (editorInput instanceof IFileEditorInput) {
final IFileEditorInput input = (IFileEditorInput) editorInput;
return input.getFile();
}
return null;
}
@Override
protected ScannerService getNewScanner() {
final IFile file = getFile();
if (file == null) {
return null;
}
try {
final String filePath = file.getLocation().toPortableString();
String initialText;
initialText = Util.getInputStreamAsString(file.getContents(),
file.getCharset());
final ScannerService scanner = ErlangEngine.getInstance()
.getScannerProviderService().get(getScannerName());
scanner.initialScan(initialText, filePath, false);
return scanner;
} catch (final CoreException e) {
ErlLogger.warn(e);
}
return null;
}
@Override
public String getScannerName() {
final IFile file = getFile();
if (file != null) {
final IPath fullPath = file.getFullPath();
final String scannerName = "scratchPad"
+ fullPath.toPortableString().hashCode() + "_"
+ fullPath.removeFileExtension().lastSegment();
return scannerName;
}
return null;
}
@Override
protected void addFoldingSupport(final ISourceViewer viewer) {
}
}