| /******************************************************************************* |
| * Copyright (c) 2004 - 2006 University Of British Columbia 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 |
| * |
| * Contributors: |
| * University Of British Columbia - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.mylar.provisional.ui; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.MissingResourceException; |
| import java.util.ResourceBundle; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.core.runtime.IExtension; |
| import org.eclipse.core.runtime.IExtensionPoint; |
| import org.eclipse.core.runtime.IExtensionRegistry; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.jface.preference.IPreferenceStore; |
| import org.eclipse.jface.text.TextSelection; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.jface.viewers.TreeViewer; |
| import org.eclipse.mylar.internal.core.util.MylarStatusHandler; |
| import org.eclipse.mylar.internal.tasklist.ui.ITaskHighlighter; |
| import org.eclipse.mylar.internal.ui.AbstractContextLabelProvider; |
| import org.eclipse.mylar.internal.ui.ColorMap; |
| import org.eclipse.mylar.internal.ui.ContentOutlineManager; |
| import org.eclipse.mylar.internal.ui.Highlighter; |
| import org.eclipse.mylar.internal.ui.HighlighterList; |
| import org.eclipse.mylar.internal.ui.MylarUiPrefContstants; |
| import org.eclipse.mylar.internal.ui.MylarViewerManager; |
| import org.eclipse.mylar.provisional.core.IMylarElement; |
| import org.eclipse.mylar.provisional.core.IMylarRelation; |
| import org.eclipse.mylar.provisional.core.MylarPlugin; |
| import org.eclipse.mylar.provisional.tasklist.ITask; |
| import org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin; |
| import org.eclipse.swt.graphics.Color; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.ui.IEditorInput; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IWorkbench; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.plugin.AbstractUIPlugin; |
| import org.osgi.framework.BundleContext; |
| |
| /** |
| * @author Mik Kersten |
| */ |
| public class MylarUiPlugin extends AbstractUIPlugin { |
| |
| public static final String PLUGIN_ID = "org.eclipse.mylar.ui"; |
| |
| private Map<String, IMylarUiBridge> bridges = new HashMap<String, IMylarUiBridge>(); |
| |
| private Map<String, ILabelProvider> contextLabelProviders = new HashMap<String, ILabelProvider>(); |
| |
| private static MylarUiPlugin plugin; |
| |
| private ResourceBundle resourceBundle; |
| |
| private boolean decorateInterestMode = false; |
| |
| private HighlighterList highlighters = null; |
| |
| private Highlighter intersectionHighlighter; |
| |
| private ColorMap colorMap = new ColorMap(); |
| |
| private MylarViewerManager viewerManager = new MylarViewerManager(); |
| |
| private ContentOutlineManager contentOutlineManager = new ContentOutlineManager(); |
| |
| private final ITaskHighlighter DEFAULT_HIGHLIGHTER = new ITaskHighlighter() { |
| public Color getHighlightColor(ITask task) { |
| Highlighter highlighter = getHighlighterForContextId("" + task.getHandleIdentifier()); |
| if (highlighter != null) { |
| return highlighter.getHighlightColor(); |
| } else { |
| return null; |
| } |
| } |
| }; |
| |
| private static final AbstractContextLabelProvider DEFAULT_LABEL_PROVIDER = new AbstractContextLabelProvider() { |
| |
| @Override |
| protected Image getImage(IMylarElement node) { |
| return null; |
| } |
| |
| @Override |
| protected Image getImage(IMylarRelation edge) { |
| return null; |
| } |
| |
| @Override |
| protected String getText(IMylarElement node) { |
| return "? " + node; |
| } |
| |
| @Override |
| protected String getText(IMylarRelation edge) { |
| return "? " + edge; |
| } |
| |
| @Override |
| protected Image getImageForObject(Object object) { |
| return null; |
| } |
| |
| @Override |
| protected String getTextForObject(Object node) { |
| return "? " + node; |
| } |
| |
| }; |
| |
| private static final IMylarUiBridge DEFAULT_UI_BRIDGE = new IMylarUiBridge() { |
| |
| public void open(IMylarElement node) { |
| // ignore |
| } |
| |
| public void close(IMylarElement node) { |
| // ignore |
| } |
| |
| public boolean acceptsEditor(IEditorPart editorPart) { |
| return false; |
| } |
| |
| public List<TreeViewer> getContentOutlineViewers(IEditorPart editor) { |
| return Collections.emptyList(); |
| } |
| |
| public Object getObjectForTextSelection(TextSelection selection, IEditorPart editor) { |
| return null; |
| } |
| |
| public void restoreEditor(IMylarElement document) { |
| // ignore |
| } |
| |
| public void setContextCapturePaused(boolean paused) { |
| // ignore |
| } |
| |
| public IMylarElement getElement(IEditorInput input) { |
| return null; |
| } |
| }; |
| |
| public MylarUiPlugin() { |
| super(); |
| plugin = this; |
| try { |
| resourceBundle = ResourceBundle.getBundle("org.eclipse.mylar.MylarUiPluginResources"); |
| } catch (MissingResourceException x) { |
| resourceBundle = null; |
| } catch (Throwable t) { |
| MylarStatusHandler.log(t, "plug-in intialization failed"); |
| } |
| initializeHighlighters(); |
| initializeDefaultPreferences(getPrefs()); |
| initializeActions(); |
| } |
| |
| // public void earlyStartup() { |
| // } |
| |
| @Override |
| public void start(BundleContext context) throws Exception { |
| super.start(context); |
| final IWorkbench workbench = PlatformUI.getWorkbench(); |
| workbench.getDisplay().asyncExec(new Runnable() { |
| public void run() { |
| try { |
| // TODO: move to MylarPlugin? |
| PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().addShellListener( |
| MylarPlugin.getContextManager().getShellLifecycleListener()); |
| MylarPlugin.getContextManager().addListener(viewerManager); |
| |
| MylarPlugin.getDefault().addWindowPartListener(contentOutlineManager); |
| // MylarPlugin.getDefault().addWindowPageListener(contentOutlineManager); |
| |
| // if (ApplyMylarToOutlineAction.getDefault() != null) |
| // ApplyMylarToOutlineAction.getDefault().update(); |
| MylarTaskListPlugin.getDefault().setHighlighter(DEFAULT_HIGHLIGHTER); |
| } catch (Exception e) { |
| MylarStatusHandler.fail(e, "Mylar UI initialization failed", true); |
| } |
| } |
| }); |
| } |
| |
| /** |
| * This method is called when the plug-in is stopped |
| */ |
| @Override |
| public void stop(BundleContext context) throws Exception { |
| try { |
| super.stop(context); |
| MylarPlugin.getContextManager().removeListener(viewerManager); |
| MylarPlugin.getDefault().removeWindowPartListener(contentOutlineManager); |
| // MylarPlugin.getDefault().removeWindowPageListener(contentOutlineManager); |
| viewerManager.dispose(); |
| colorMap.dispose(); |
| highlighters.dispose(); |
| if (PlatformUI.getWorkbench() != null && !PlatformUI.getWorkbench().isClosing()) { |
| PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().removeShellListener( |
| MylarPlugin.getContextManager().getShellLifecycleListener()); |
| } |
| } catch (Exception e) { |
| MylarStatusHandler.fail(e, "Mylar UI stop failed", false); |
| } |
| } |
| |
| private void initializeActions() { |
| // don't have any actions to initialize |
| } |
| |
| private void initializeHighlighters() { |
| String hlist = getPrefs().getString(MylarUiPrefContstants.HIGHLIGHTER_PREFIX); |
| if (hlist != null && hlist.length() != 0) { |
| highlighters = new HighlighterList(hlist); |
| } else { |
| // Only get here if it is the first time running |
| // mylar. load default colors |
| highlighters = new HighlighterList(); |
| highlighters.setToDefaultList(); |
| getPrefs().setValue(MylarUiPrefContstants.HIGHLIGHTER_PREFIX, this.highlighters.externalizeToString()); |
| } |
| } |
| |
| @Override |
| protected void initializeDefaultPreferences(IPreferenceStore store) { |
| store.setDefault(MylarUiPrefContstants.AUTO_MANAGE_EDITORS, true); |
| store.setDefault(MylarUiPrefContstants.AUTO_MANAGE_EDITORS_OPEN_NUM, 8); |
| |
| store.setDefault(MylarUiPrefContstants.GAMMA_SETTING_LIGHTENED, false); |
| store.setDefault(MylarUiPrefContstants.GAMMA_SETTING_STANDARD, true); |
| store.setDefault(MylarUiPrefContstants.GAMMA_SETTING_DARKENED, false); |
| |
| if (!store.contains(MylarUiPrefContstants.GLOBAL_FILTERING)) |
| store.setDefault(MylarUiPrefContstants.GLOBAL_FILTERING, true); |
| } |
| |
| public void setHighlighterMapping(String id, String name) { |
| String prefId = MylarUiPrefContstants.TASK_HIGHLIGHTER_PREFIX + id; |
| getPrefs().putValue(prefId, name); |
| } |
| |
| /** |
| * Returns the shared instance. |
| */ |
| public static MylarUiPlugin getDefault() { |
| return plugin; |
| } |
| |
| public static IPreferenceStore getPrefs() { |
| return MylarPlugin.getDefault().getPreferenceStore(); |
| } |
| |
| /** |
| * Returns the string from the plugin's resource bundle, or 'key' if not |
| * found. |
| */ |
| public static String getResourceString(String key) { |
| ResourceBundle bundle = MylarUiPlugin.getDefault().getResourceBundle(); |
| try { |
| return (bundle != null) ? bundle.getString(key) : key; |
| } catch (MissingResourceException e) { |
| return key; |
| } |
| } |
| |
| /** |
| * Returns the string from the plugin's resource bundle, or 'key' if not |
| * found. |
| */ |
| public static String getMessage(String key) { |
| ResourceBundle bundle = getDefault().getResourceBundle(); |
| try { |
| return (bundle != null) ? bundle.getString(key) : key; |
| } catch (MissingResourceException e) { |
| return key; |
| } |
| } |
| |
| /** |
| * Returns the plugin's resource bundle, |
| */ |
| public ResourceBundle getResourceBundle() { |
| return resourceBundle; |
| } |
| |
| public boolean isDecorateInterestMode() { |
| return decorateInterestMode; |
| } |
| |
| public void setDecorateInterestMode(boolean decorateInterestLevel) { |
| this.decorateInterestMode = decorateInterestLevel; |
| } |
| |
| public List<IMylarUiBridge> getUiBridges() { |
| return new ArrayList<IMylarUiBridge>(bridges.values()); |
| } |
| |
| /** |
| * @return the corresponding adapter if found, or an adapter with no |
| * behavior otherwise (so null is never returned) |
| */ |
| public IMylarUiBridge getUiBridge(String contentType) { |
| if (!UiExtensionPointReader.extensionsRead) |
| UiExtensionPointReader.initExtensions(); |
| IMylarUiBridge bridge = bridges.get(contentType); |
| if (bridge != null) { |
| return bridge; |
| } else { |
| return DEFAULT_UI_BRIDGE; |
| } |
| } |
| |
| /** |
| * TODO: cache this to improve performance? |
| */ |
| public IMylarUiBridge getUiBridgeForEditor(IEditorPart editorPart) { |
| if (!UiExtensionPointReader.extensionsRead) |
| UiExtensionPointReader.initExtensions(); |
| IMylarUiBridge foundBridge = null; |
| for (IMylarUiBridge bridge : bridges.values()) { |
| if (bridge.acceptsEditor(editorPart)) { |
| foundBridge = bridge; |
| break; |
| } |
| } |
| if (foundBridge != null) { |
| return foundBridge; |
| } else { |
| return DEFAULT_UI_BRIDGE; |
| } |
| } |
| |
| private void internalAddBridge(String extension, IMylarUiBridge bridge) { |
| this.bridges.put(extension, bridge); |
| } |
| |
| public ILabelProvider getContextLabelProvider(String extension) { |
| if (!UiExtensionPointReader.extensionsRead) |
| UiExtensionPointReader.initExtensions(); |
| ILabelProvider provider = contextLabelProviders.get(extension); |
| if (provider != null) { |
| return provider; |
| } else { |
| return DEFAULT_LABEL_PROVIDER; |
| } |
| } |
| |
| private void internalAddContextLabelProvider(String extension, ILabelProvider provider) { |
| this.contextLabelProviders.put(extension, provider); |
| } |
| |
| public void updateGammaSetting(ColorMap.GammaSetting setting) { |
| if (colorMap.getGammaSetting() != setting) { |
| highlighters.updateHighlighterWithGamma(colorMap.getGammaSetting(), setting); |
| colorMap.setGammaSetting(setting); |
| } |
| } |
| |
| public ColorMap getColorMap() { |
| return colorMap; |
| } |
| |
| public Highlighter getDefaultHighlighter() { |
| return HighlighterList.DEFAULT_HIGHLIGHTER; |
| } |
| |
| /** |
| * @return null if not found |
| */ |
| public Highlighter getHighlighter(String name) { |
| if (highlighters == null) { |
| this.initializeHighlighters(); |
| } |
| return highlighters.getHighlighter(name); |
| } |
| |
| public Highlighter getHighlighterForContextId(String id) { |
| String prefId = MylarUiPrefContstants.TASK_HIGHLIGHTER_PREFIX + id; |
| String highlighterName = getPrefs().getString(prefId); |
| return getHighlighter(highlighterName); |
| } |
| |
| public HighlighterList getHighlighterList() { |
| if (this.highlighters == null) { |
| this.initializeHighlighters(); |
| } |
| return this.highlighters; |
| } |
| |
| public List<Highlighter> getHighlighters() { |
| if (highlighters == null) { |
| this.initializeHighlighters(); |
| } |
| return highlighters.getHighlighters(); |
| } |
| |
| public Highlighter getIntersectionHighlighter() { |
| return intersectionHighlighter; |
| } |
| |
| public void setColorMap(ColorMap colorMap) { |
| this.colorMap = colorMap; |
| } |
| |
| public void setIntersectionHighlighter(Highlighter intersectionHighlighter) { |
| this.intersectionHighlighter = intersectionHighlighter; |
| } |
| |
| public boolean isGlobalFoldingEnabled() { |
| return getPrefs().getBoolean(MylarUiPrefContstants.GLOBAL_FILTERING); |
| } |
| |
| public void setGlobalFilteringEnabled(boolean globalFilteringEnabled) { |
| getPrefs().setValue(MylarUiPrefContstants.GLOBAL_FILTERING, globalFilteringEnabled); |
| } |
| |
| public boolean isIntersectionMode() { |
| return getPrefs().getBoolean(MylarUiPrefContstants.INTERSECTION_MODE); |
| } |
| |
| public void setIntersectionMode(boolean isIntersectionMode) { |
| getPrefs().setValue(MylarUiPrefContstants.INTERSECTION_MODE, isIntersectionMode); |
| } |
| |
| public MylarViewerManager getViewerManager() { |
| return viewerManager; |
| } |
| |
| static class UiExtensionPointReader { |
| |
| private static boolean extensionsRead = false; |
| |
| private static UiExtensionPointReader thisReader = new UiExtensionPointReader(); |
| |
| // read the extensions and load the required plugins |
| public static void initExtensions() { |
| // code from "contributing to eclipse" with modifications for |
| // deprecated code |
| if (!extensionsRead) { |
| IExtensionRegistry registry = Platform.getExtensionRegistry(); |
| IExtensionPoint extensionPoint = registry |
| .getExtensionPoint(UiExtensionPointReader.EXTENSION_ID_CONTEXT); |
| IExtension[] extensions = extensionPoint.getExtensions(); |
| for (int i = 0; i < extensions.length; i++) { |
| IConfigurationElement[] elements = extensions[i].getConfigurationElements(); |
| for (int j = 0; j < elements.length; j++) { |
| if (elements[j].getName().compareTo(UiExtensionPointReader.ELEMENT_UI_BRIDGE) == 0) { |
| readBridge(elements[j]); |
| } else if (elements[j].getName().compareTo( |
| UiExtensionPointReader.ELEMENT_UI_CONTEXT_LABEL_PROVIDER) == 0) { |
| readLabelProvider(elements[j]); |
| } |
| } |
| } |
| extensionsRead = true; |
| } |
| } |
| |
| private static void readLabelProvider(IConfigurationElement element) { |
| try { |
| Object provider = element.createExecutableExtension(UiExtensionPointReader.ELEMENT_UI_CLASS); |
| Object contentType = element.getAttribute(UiExtensionPointReader.ELEMENT_UI_BRIDGE_CONTENT_TYPE); |
| if (provider instanceof ILabelProvider && contentType != null) { |
| MylarUiPlugin.getDefault().internalAddContextLabelProvider((String) contentType, |
| (ILabelProvider) provider); |
| } else { |
| MylarStatusHandler.log("Could not load label provider: " + provider.getClass().getCanonicalName() |
| + " must implement " + ILabelProvider.class.getCanonicalName(), thisReader); |
| } |
| } catch (CoreException e) { |
| MylarStatusHandler.log(e, "Could not load label provider extension"); |
| } |
| } |
| |
| private static void readBridge(IConfigurationElement element) { |
| try { |
| Object bridge = element.createExecutableExtension(UiExtensionPointReader.ELEMENT_UI_CLASS); |
| Object contentType = element.getAttribute(UiExtensionPointReader.ELEMENT_UI_BRIDGE_CONTENT_TYPE); |
| if (bridge instanceof IMylarUiBridge && contentType != null) { |
| MylarUiPlugin.getDefault().internalAddBridge((String) contentType, (IMylarUiBridge) bridge); |
| } else { |
| MylarStatusHandler.log("Could not load bridge: " + bridge.getClass().getCanonicalName() |
| + " must implement " + IMylarUiBridge.class.getCanonicalName(), thisReader); |
| } |
| } catch (CoreException e) { |
| MylarStatusHandler.log(e, "Could not load bridge extension"); |
| } |
| } |
| |
| public static final String EXTENSION_ID_CONTEXT = "org.eclipse.mylar.ui.context"; |
| |
| public static final String ELEMENT_UI_BRIDGE = "uiBridge"; |
| |
| public static final String ELEMENT_UI_CLASS = "class"; |
| |
| public static final String ELEMENT_UI_CONTEXT_LABEL_PROVIDER = "labelProvider"; |
| |
| public static final String ELEMENT_UI_BRIDGE_CONTENT_TYPE = "contentType"; |
| } |
| } |