/******************************************************************************* * Copyright (c) 2007, 2008 Edgar Espina. * 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.deved.antlride.common.ui.text.editor; import org.deved.antlride.common.ui.SingleProjectProblem; import org.deved.antlride.common.ui.text.folding.AntlrAbstractFoldingStructureProvider; import org.eclipse.core.filebuffers.IDocumentSetupParticipant; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.internal.ui.actions.FoldingActionGroup; import org.eclipse.dltk.internal.ui.editor.ScriptEditor; import org.eclipse.dltk.internal.ui.editor.ScriptOutlinePage; import org.eclipse.dltk.internal.ui.editor.SourceModuleDocumentProvider; import org.eclipse.dltk.ui.text.ScriptTextTools; import org.eclipse.dltk.ui.text.folding.IElementCommentResolver; import org.eclipse.dltk.ui.text.folding.IFoldingStructureProvider; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocumentExtension3; import org.eclipse.jface.text.IDocumentPartitioner; import org.eclipse.jface.text.source.DefaultCharacterPairMatcher; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.texteditor.SourceViewerDecorationSupport; @SuppressWarnings("restriction") public abstract class AntlrBaseEditor extends ScriptEditor { private IFoldingStructureProvider fFoldingStructureProvider; /** * DLTK BUG: can't define more than one language per project flag use to * retrieve source module directly from document provider * * @see AntlrBaseEditor#getInputModelElement() */ private boolean fUseDocumentProvider; public AntlrBaseEditor(boolean useDocumentProvider) { fUseDocumentProvider = useDocumentProvider; } public AntlrBaseEditor() { this(false); } @SuppressWarnings("unchecked") @Override @SingleProjectProblem public Object getAdapter(Class required) { if (required == IElementCommentResolver.class) { // used by dltk.mylyn integration // FIXME do not reference AbstractASTFoldingStructureProvider @SingleProjectProblem IFoldingStructureProvider fsp = getFoldingStructureProvider(); if (fsp instanceof AntlrAbstractFoldingStructureProvider) { AntlrAbstractFoldingStructureProvider foldingStructureProvider = (AntlrAbstractFoldingStructureProvider) fsp; return foldingStructureProvider.createElementCommentResolver( (ISourceModule) getInputModelElement(), getSourceViewer().getDocument().get()); } } return super.getAdapter(required); } @Override @SingleProjectProblem public IModelElement getInputModelElement() { if (fUseDocumentProvider) { return getInputModelElementFromDocumentProvider(); } return super.getInputModelElement(); } @SingleProjectProblem private IModelElement getInputModelElementFromDocumentProvider() { IEditorInput editorInput = getEditorInput(); if (editorInput == null) return null; SourceModuleDocumentProvider documentProvider = (SourceModuleDocumentProvider) getDocumentProvider(); ISourceModule workingCopy = documentProvider .getWorkingCopy(editorInput); return workingCopy; } @Override protected void initializeEditor() { super.initializeEditor(); setEditorContextMenuId(getContextMenuId()); } @Override protected void initializeKeyBindingScopes() { setKeyBindingScopes(new String[] { getEditorContextId() }); } @Override protected void connectPartitioningToElement(IEditorInput input, IDocument document) { if (document instanceof IDocumentExtension3) { IDocumentExtension3 extension = (IDocumentExtension3) document; IDocumentPartitioner partitioner = extension .getDocumentPartitioner(getPartitionId()); if (partitioner == null) { IDocumentSetupParticipant participant = createDocumentSetupParticipant(); if (participant != null) participant.setup(document); } } } @Override protected FoldingActionGroup createFoldingActionGroup() { return new FoldingActionGroup(this, getViewer(), getScriptPreferenceStore()); } @Override protected abstract ScriptOutlinePage doCreateOutlinePage(); @Override protected IFoldingStructureProvider getFoldingStructureProvider() { if (fFoldingStructureProvider == null) { fFoldingStructureProvider = createFoldingStructureProvider(); } return fFoldingStructureProvider; } public ISourceModule getSourceModule() { return (ISourceModule) getInputModelElement(); } @Override protected void configureSourceViewerDecorationSupport( SourceViewerDecorationSupport support) { String characters = getPairMatcherCharacters(); if (characters != null) { support.setCharacterPairMatcher(new DefaultCharacterPairMatcher( characters.toCharArray())); support.setMatchingCharacterPainterPreferenceKeys( MATCHING_BRACKETS, MATCHING_BRACKETS_COLOR); } super.configureSourceViewerDecorationSupport(support); } protected String getPairMatcherCharacters() { return null; } protected abstract IFoldingStructureProvider createFoldingStructureProvider(); protected abstract IDocumentSetupParticipant createDocumentSetupParticipant(); protected abstract String getPartitionId(); public abstract ScriptTextTools getTextTools(); protected abstract String getContextMenuId(); protected abstract String getEditorContextId(); @Override @SingleProjectProblem public void dispose() { if (fFoldingStructureProvider != null) { fFoldingStructureProvider.uninstall(); } super.dispose(); } }