/*******************************************************************************
* Copyright (c) 2008 IBM Corporation.
* 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:
* Robert Fuhrer (rfuhrer@watson.ibm.com) - initial API and implementation
*******************************************************************************/
package org.eclipse.imp.editor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import org.eclipse.imp.core.ErrorHandler;
import org.eclipse.imp.editor.OutlineLabelProvider.IElementImageProvider;
import org.eclipse.imp.language.Language;
import org.eclipse.imp.language.ServiceFactory;
import org.eclipse.imp.parser.IModelListener;
import org.eclipse.imp.parser.IParseController;
import org.eclipse.imp.preferences.PreferenceCache;
import org.eclipse.imp.runtime.RuntimePlugin;
import org.eclipse.imp.services.IAutoEditStrategy;
import org.eclipse.imp.services.IContentProposer;
import org.eclipse.imp.services.IDocumentationProvider;
import org.eclipse.imp.services.IEntityNameLocator;
import org.eclipse.imp.services.IFoldingUpdater;
import org.eclipse.imp.services.IHelpService;
import org.eclipse.imp.services.IHoverHelper;
import org.eclipse.imp.services.ILanguageActionsContributor;
import org.eclipse.imp.services.IOccurrenceMarker;
import org.eclipse.imp.services.IRefactoringContributor;
import org.eclipse.imp.services.IReferenceResolver;
import org.eclipse.imp.services.ISourceFormatter;
import org.eclipse.imp.services.ISourceHyperlinkDetector;
import org.eclipse.imp.services.IToggleBreakpointsHandler;
import org.eclipse.imp.services.ITokenColorer;
import org.eclipse.imp.services.base.TreeModelBuilderBase;
import org.eclipse.jface.text.source.IAnnotationHover;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
public class LanguageServiceManager {
private Language fLanguage;
private ServiceFactory fServiceFactory = ServiceFactory.getInstance();
private Set<ILanguageActionsContributor> fActionContributors;
private IAnnotationHover fAnnotationHover;
private Set<IAutoEditStrategy> fAutoEditStrategies;
private IContentProposer fContentProposer;
private IHelpService fContextHelper;
private IDocumentationProvider fDocProvider;
private Set<IModelListener> fEditorServices;
private IEntityNameLocator fEntityNameLocator;
private IFoldingUpdater fFoldingUpdater;
private ISourceFormatter fFormattingStrategy;
private IHoverHelper fHoverHelper;
private ISourceHyperlinkDetector fHyperLinkDetector;
private IElementImageProvider fImageProvider;
private ILabelProvider fLabelProvider;
private TreeModelBuilderBase fModelBuilder;
private IOccurrenceMarker fOccurrenceMarker;
private IParseController fParseController;
private Set<IRefactoringContributor> fRefactoringContributors;
private IReferenceResolver fResolver;
private IToggleBreakpointsHandler fToggleBreakpointsHandler;
private ITokenColorer fTokenColorer;
public LanguageServiceManager(Language lang) {
fLanguage= lang;
}
public void initialize(IEditorPart part) {
saveMyServiceManager(part, this);
if (PreferenceCache.emitMessages)
RuntimePlugin.getInstance().writeInfoMsg("Instantiating language service extensions for " + fLanguage.getName());
fActionContributors= fServiceFactory.getLanguageActionsContributors(fLanguage);
fAnnotationHover= fServiceFactory.getAnnotationHover(fLanguage);
fAutoEditStrategies= fServiceFactory.getAutoEditStrategies(fLanguage);
fContentProposer= fServiceFactory.getContentProposer(fLanguage);
fContextHelper= fServiceFactory.getContextHelper(fLanguage);
fDocProvider= fServiceFactory.getDocumentationProvider(fLanguage);
fEditorServices= fServiceFactory.getEditorServices(fLanguage);
fEntityNameLocator= fServiceFactory.getEntityNameLocator(fLanguage);
fFoldingUpdater= fServiceFactory.getFoldingUpdater(fLanguage);
fFormattingStrategy= fServiceFactory.getSourceFormatter(fLanguage);
fHyperLinkDetector= fServiceFactory.getSourceHyperlinkDetector(fLanguage);
fImageProvider= fServiceFactory.getElementImageProvider(fLanguage);
fLabelProvider= fServiceFactory.getLabelProvider(fLanguage);
fModelBuilder= fServiceFactory.getTreeModelBuilder(fLanguage);
fOccurrenceMarker = fServiceFactory.getOccurrenceMarker(fLanguage);
fParseController= fServiceFactory.getParseController(fLanguage);
fRefactoringContributors= fServiceFactory.getRefactoringContributors(fLanguage);
fResolver= fServiceFactory.getReferenceResolver(fLanguage);
fToggleBreakpointsHandler= fServiceFactory.getToggleBreakpointsHandler(fLanguage);
fTokenColorer= fServiceFactory.getTokenColorer(fLanguage);
if (fHyperLinkDetector == null)
fHyperLinkDetector= new HyperlinkDetector(fLanguage);
if (fParseController == null) {
ErrorHandler.reportError("Unable to instantiate parser for language '" + fLanguage.getName()
+ "'; parser-related services will be disabled.", true, true);
}
}
public void dispose() {
fActionContributors= null;
fAnnotationHover= null;
fAutoEditStrategies= null;
fContentProposer= null;
fContextHelper= null;
fDocProvider= null;
fEditorServices= null;
fEntityNameLocator= null;
fFoldingUpdater= null;
fFormattingStrategy= null;
fHyperLinkDetector= null;
fImageProvider= null;
fLabelProvider= null;
fModelBuilder= null;
fOccurrenceMarker = null;
fParseController= null;
fRefactoringContributors= null;
fResolver= null;
fToggleBreakpointsHandler= null;
fTokenColorer= null;
}
public Language getLanguage() {
return fLanguage;
}
public Set<ILanguageActionsContributor> getActionContributors() {
return fActionContributors;
}
public IAnnotationHover getAnnotationHover() {
return fAnnotationHover;
}
public Set<IAutoEditStrategy> getAutoEditStrategies() {
return fAutoEditStrategies;
}
public IContentProposer getContentProposer() {
return fContentProposer;
}
public IHelpService getContextHelp() {
return fContextHelper;
}
public IDocumentationProvider getDocProvider() {
return fDocProvider;
}
public Set<IModelListener> getEditorServices() {
return fEditorServices;
}
public IFoldingUpdater getFoldingUpdater() {
return fFoldingUpdater;
}
public ISourceFormatter getFormattingStrategy() {
return fFormattingStrategy;
}
public IHoverHelper getHoverHelper() {
return fHoverHelper;
}
public ISourceHyperlinkDetector getHyperLinkDetector() {
return fHyperLinkDetector;
}
public IElementImageProvider getImageProvider() {
return fImageProvider;
}
public ILabelProvider getLabelProvider() {
return fLabelProvider;
}
public TreeModelBuilderBase getModelBuilder() {
return fModelBuilder;
}
public IOccurrenceMarker getOccurrenceMarker() {
return fOccurrenceMarker;
}
public IParseController getParseController() {
return fParseController;
}
public Set<IRefactoringContributor> getRefactoringContributors() {
return fRefactoringContributors;
}
public IReferenceResolver getResolver() {
return fResolver;
}
public IToggleBreakpointsHandler getToggleBreakpointsHandler() {
return fToggleBreakpointsHandler;
}
public ITokenColorer getTokenColorer() {
return fTokenColorer;
}
public IEntityNameLocator getEntityNameLocator() {
return fEntityNameLocator;
}
private static HashMap<IEditorPart, LanguageServiceManager> editorServiceMap = new HashMap<IEditorPart, LanguageServiceManager>();
static {
// Clean up editor references in the editorServiceMap when that editor gets closed.
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService().addPartListener(new IPartListener() {
public void partOpened(IWorkbenchPart part) { }
public void partDeactivated(IWorkbenchPart part) { }
public void partBroughtToTop(IWorkbenchPart part) { }
public void partActivated(IWorkbenchPart part) { }
public void partClosed(IWorkbenchPart part) {
if (part instanceof UniversalEditor) {
editorServiceMap.remove(part);
}
}
});
}
public static void saveMyServiceManager(IEditorPart part, LanguageServiceManager manager) {
clearDeadEntries();
editorServiceMap.put(part, manager);
}
public static LanguageServiceManager getMyServiceManager(IEditorPart part) {
clearDeadEntries();
return editorServiceMap.get(part);
}
private static void clearDeadEntries() {
List<IEditorPart> deadEditors = new ArrayList<IEditorPart>();
for (IEditorPart edPart: editorServiceMap.keySet()) {
IEditorSite edSite = edPart.getEditorSite();
IWorkbenchPart wbPart = edSite.getPart();
if (wbPart == null) {
deadEditors.add(edPart);
} else {
}
}
for (IEditorPart edPart: deadEditors) {
editorServiceMap.remove(edPart);
}
}
}