View | Details | Raw Unified | Return to bug 244579 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/mylyn/wikitext/ui/editor/MarkupTaskEditorExtension.java (-1 / +1 lines)
Lines 28-34 Link Here
28
import org.eclipse.jface.text.source.IAnnotationModel;
28
import org.eclipse.jface.text.source.IAnnotationModel;
29
import org.eclipse.jface.text.source.ISourceViewer;
29
import org.eclipse.jface.text.source.ISourceViewer;
30
import org.eclipse.jface.text.source.SourceViewer;
30
import org.eclipse.jface.text.source.SourceViewer;
31
import org.eclipse.mylyn.internal.sandbox.ui.editors.AbstractTaskEditorExtension;
32
import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryCompletionProcessor;
31
import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryCompletionProcessor;
33
import org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditor;
32
import org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditor;
34
import org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupSourceViewerConfiguration;
33
import org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupSourceViewerConfiguration;
Lines 39-44 Link Here
39
import org.eclipse.mylyn.tasks.core.TaskRepository;
38
import org.eclipse.mylyn.tasks.core.TaskRepository;
40
import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
39
import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
41
import org.eclipse.mylyn.tasks.ui.TasksUi;
40
import org.eclipse.mylyn.tasks.ui.TasksUi;
41
import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorExtension;
42
import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
42
import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
43
import org.eclipse.mylyn.wikitext.ui.viewer.MarkupViewer;
43
import org.eclipse.mylyn.wikitext.ui.viewer.MarkupViewer;
44
import org.eclipse.mylyn.wikitext.ui.viewer.MarkupViewerConfiguration;
44
import org.eclipse.mylyn.wikitext.ui.viewer.MarkupViewerConfiguration;
(-)plugin.xml (-2 / +2 lines)
Lines 2-15 Link Here
2
<?eclipse version="3.2"?>
2
<?eclipse version="3.2"?>
3
<plugin>
3
<plugin>
4
   <extension
4
   <extension
5
         point="org.eclipse.mylyn.sandbox.ui.taskEditorExtensions">
5
         point="org.eclipse.mylyn.tasks.ui.taskEditorExtensions">
6
      <taskEditorExtension
6
      <taskEditorExtension
7
            class="org.eclipse.mylyn.internal.wikitext.confluence.ui.editors.TaskEditorExtension"
7
            class="org.eclipse.mylyn.internal.wikitext.confluence.ui.editors.TaskEditorExtension"
8
            id="org.eclipse.mylyn.wikitext.confluence.ui.taskEditorExtension"
8
            id="org.eclipse.mylyn.wikitext.confluence.ui.taskEditorExtension"
9
            name="%taskEditorExtension.name.0">
9
            name="%taskEditorExtension.name.0">
10
      </taskEditorExtension>
10
      </taskEditorExtension>
11
      <repositoryAssociation
11
      <repositoryAssociation
12
            repository="jira"
12
            connectorKind="jira"
13
            taskEditorExtension="org.eclipse.mylyn.wikitext.confluence.ui.taskEditorExtension">
13
            taskEditorExtension="org.eclipse.mylyn.wikitext.confluence.ui.taskEditorExtension">
14
      </repositoryAssociation>
14
      </repositoryAssociation>
15
   </extension>
15
   </extension>
(-)plugin.xml (-3 / +3 lines)
Lines 56-62 Link Here
56
      </templates>
56
      </templates>
57
   </extension>
57
   </extension>
58
   <extension
58
   <extension
59
         point="org.eclipse.mylyn.sandbox.ui.taskEditorExtensions">
59
         point="org.eclipse.mylyn.tasks.ui.taskEditorExtensions">
60
      <taskEditorExtension
60
      <taskEditorExtension
61
            class="org.eclipse.mylyn.internal.wikitext.textile.ui.editors.TextileTaskEditorExtension"
61
            class="org.eclipse.mylyn.internal.wikitext.textile.ui.editors.TextileTaskEditorExtension"
62
            id="org.eclipse.mylyn.wikitext.textile.core.ui.taskEditorExtension"
62
            id="org.eclipse.mylyn.wikitext.textile.core.ui.taskEditorExtension"
Lines 68-78 Link Here
68
            name="%taskEditorExtension.name.1">
68
            name="%taskEditorExtension.name.1">
69
      </taskEditorExtension>
69
      </taskEditorExtension>
70
      <repositoryAssociation
70
      <repositoryAssociation
71
            repository="bugzilla"
71
            connectorKind="bugzilla"
72
            taskEditorExtension="org.eclipse.mylyn.wikitext.textile.core.ui.taskEditorExtensionBugzilla">
72
            taskEditorExtension="org.eclipse.mylyn.wikitext.textile.core.ui.taskEditorExtensionBugzilla">
73
      </repositoryAssociation>
73
      </repositoryAssociation>
74
      <repositoryAssociation
74
      <repositoryAssociation
75
            repository="local"
75
            connectorKind="local"
76
            taskEditorExtension="org.eclipse.mylyn.wikitext.textile.core.ui.taskEditorExtension">
76
            taskEditorExtension="org.eclipse.mylyn.wikitext.textile.core.ui.taskEditorExtension">
77
      </repositoryAssociation>
77
      </repositoryAssociation>
78
   </extension>
78
   </extension>
(-)plugin.xml (-1 / +1 lines)
Lines 34-40 Link Here
34
      </templates>
34
      </templates>
35
   </extension>
35
   </extension>
36
   <extension
36
   <extension
37
         point="org.eclipse.mylyn.sandbox.ui.taskEditorExtensions">
37
         point="org.eclipse.mylyn.tasks.ui.taskEditorExtensions">
38
      <taskEditorExtension
38
      <taskEditorExtension
39
            class="org.eclipse.mylyn.internal.wikitext.mediawiki.ui.editors.TaskEditorExtension"
39
            class="org.eclipse.mylyn.internal.wikitext.mediawiki.ui.editors.TaskEditorExtension"
40
            id="org.eclipse.mylyn.internal.wikitext.mediawiki.ui.taskEditorExtension"
40
            id="org.eclipse.mylyn.internal.wikitext.mediawiki.ui.taskEditorExtension"
(-)src/org/eclipse/mylyn/internal/sandbox/ui/editors/ExtensibleRichTextAttributeEditor.java (+1 lines)
Lines 29-34 Link Here
29
import org.eclipse.mylyn.tasks.core.TaskRepository;
29
import org.eclipse.mylyn.tasks.core.TaskRepository;
30
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
30
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
31
import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
31
import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
32
import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorExtension;
32
import org.eclipse.swt.SWT;
33
import org.eclipse.swt.SWT;
33
import org.eclipse.swt.custom.StackLayout;
34
import org.eclipse.swt.custom.StackLayout;
34
import org.eclipse.swt.events.DisposeEvent;
35
import org.eclipse.swt.events.DisposeEvent;
(-)src/org/eclipse/mylyn/internal/sandbox/ui/editors/EditorStyleContributionItem.java (-1 / +3 lines)
Lines 19-27 Link Here
19
import org.eclipse.jface.dialogs.IInputValidator;
19
import org.eclipse.jface.dialogs.IInputValidator;
20
import org.eclipse.jface.dialogs.InputDialog;
20
import org.eclipse.jface.dialogs.InputDialog;
21
import org.eclipse.jface.window.Window;
21
import org.eclipse.jface.window.Window;
22
import org.eclipse.mylyn.internal.sandbox.ui.editors.TaskEditorExtensions.RegisteredTaskEditorExtension;
22
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorExtensions;
23
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorExtensions.RegisteredTaskEditorExtension;
23
import org.eclipse.mylyn.tasks.core.TaskRepository;
24
import org.eclipse.mylyn.tasks.core.TaskRepository;
24
import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
25
import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
26
import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorExtension;
25
import org.eclipse.ui.PlatformUI;
27
import org.eclipse.ui.PlatformUI;
26
import org.eclipse.ui.actions.CompoundContributionItem;
28
import org.eclipse.ui.actions.CompoundContributionItem;
27
29
(-)src/org/eclipse/mylyn/internal/sandbox/ui/editors/TaskEditorExtensionReader.java (-80 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004, 2007 Mylyn project committers and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *******************************************************************************/
8
9
package org.eclipse.mylyn.internal.sandbox.ui.editors;
10
11
import org.eclipse.core.runtime.CoreException;
12
import org.eclipse.core.runtime.IConfigurationElement;
13
import org.eclipse.core.runtime.IExtension;
14
import org.eclipse.core.runtime.IExtensionPoint;
15
import org.eclipse.core.runtime.IExtensionRegistry;
16
import org.eclipse.core.runtime.IStatus;
17
import org.eclipse.core.runtime.Platform;
18
import org.eclipse.core.runtime.Status;
19
import org.eclipse.mylyn.commons.core.StatusHandler;
20
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
21
22
/**
23
 * @author David Green
24
 */
25
public class TaskEditorExtensionReader {
26
27
	public static final String ATTR_ID = "id";
28
29
	public static final String ATTR_NAME = "name";
30
31
	public static final String EXTENSION_TASK_EDITOR_EXTENSIONS = "org.eclipse.mylyn.sandbox.ui.taskEditorExtensions";
32
33
	private static final String REPOSITORY_ASSOCIATION = "repositoryAssociation";
34
35
	private static final String TASK_EDITOR_EXTENSION = "taskEditorExtension";
36
37
	public static void initExtensions() {
38
		IExtensionRegistry registry = Platform.getExtensionRegistry();
39
40
		IExtensionPoint editorExtensionPoint = registry.getExtensionPoint(EXTENSION_TASK_EDITOR_EXTENSIONS);
41
		IExtension[] editorExtensions = editorExtensionPoint.getExtensions();
42
		for (IExtension extension : editorExtensions) {
43
			IConfigurationElement[] elements = extension.getConfigurationElements();
44
			for (IConfigurationElement element : elements) {
45
				if (element.getName().equals(TASK_EDITOR_EXTENSION)) {
46
					readEditorExtension(element);
47
				} else if (element.getName().equals(REPOSITORY_ASSOCIATION)) {
48
					readEditorExtensionAssociation(element);
49
				}
50
			}
51
		}
52
	}
53
54
	private static void readEditorExtension(IConfigurationElement element) {
55
		try {
56
			String id = element.getAttribute(ATTR_ID);
57
			String name = element.getAttribute(ATTR_NAME);
58
			AbstractTaskEditorExtension extension = (AbstractTaskEditorExtension) element.createExecutableExtension("class");
59
			TaskEditorExtensions.addTaskEditorExtension(id, name, extension);
60
		} catch (CoreException e) {
61
			StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load taskEditorExtension",
62
					e));
63
		} catch (Exception e) {
64
			StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load taskEditorExtension",
65
					e));
66
		}
67
	}
68
69
	private static void readEditorExtensionAssociation(IConfigurationElement element) {
70
		try {
71
			String repository = element.getAttribute("repository");
72
			String taskEditorExtension = element.getAttribute("taskEditorExtension");
73
			TaskEditorExtensions.addRepositoryAssociation(repository, taskEditorExtension);
74
		} catch (Exception e) {
75
			StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load taskEditorExtension",
76
					e));
77
		}
78
	}
79
80
}
(-)src/org/eclipse/mylyn/internal/sandbox/ui/editors/AbstractTaskEditorExtension.java (-60 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004, 2007 Mylyn project committers and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *******************************************************************************/
8
9
package org.eclipse.mylyn.internal.sandbox.ui.editors;
10
11
import org.eclipse.jface.text.source.SourceViewer;
12
import org.eclipse.mylyn.tasks.core.TaskRepository;
13
import org.eclipse.swt.widgets.Composite;
14
import org.eclipse.ui.contexts.IContextService;
15
16
/**
17
 * An extension that provides task editor capabilities beyond the default, oriented towards providing markup-aware
18
 * editing and viewing
19
 * 
20
 * @author David Green
21
 */
22
public abstract class AbstractTaskEditorExtension {
23
24
	/**
25
	 * The key to access the {@link TaskRepository} property that stores the URL of an associated wiki.
26
	 */
27
	public static final String INTERNAL_WIKI_LINK_PATTERN = "wikiLinkPattern";
28
29
	/**
30
	 * Creates a source viewer that can be used to view content in the task editor. The source viewer should be
31
	 * configured with a source viewer configuration prior to returning.
32
	 * 
33
	 * @param taskRepository
34
	 *            the task repository for which the viewer is created
35
	 * @param parent
36
	 *            the control parent of the source viewer
37
	 * @param style
38
	 *            the styles to use
39
	 */
40
	public abstract SourceViewer createViewer(TaskRepository taskRepository, Composite parent, int style);
41
42
	/**
43
	 * Creates a source viewer that can be used to edit content in the task editor. The source viewer should be
44
	 * configured with a source viewer configuration prior to returning.
45
	 * 
46
	 * @param taskRepository
47
	 *            the task repository for which the viewer is created
48
	 * @param parent
49
	 *            the control parent of the source viewer
50
	 * @param style
51
	 *            the styles to use
52
	 */
53
	public abstract SourceViewer createEditor(TaskRepository taskRepository, Composite parent, int style);
54
55
	/**
56
	 * Returns the editor context id, to be passed to the {@link IContextService} when the editor is in focus.
57
	 */
58
	public abstract String getEditorContextId();
59
60
}
(-)src/org/eclipse/mylyn/internal/sandbox/ui/editors/ExtensibleBugzillaTaskEditorPage.java (+2 lines)
Lines 23-30 Link Here
23
import org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaTaskEditorPage;
23
import org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaTaskEditorPage;
24
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
24
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
25
import org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil;
25
import org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil;
26
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorExtensions;
26
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
27
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
27
import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
28
import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
29
import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorExtension;
28
import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
30
import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
29
import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
31
import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
30
import org.eclipse.mylyn.tasks.ui.editors.AttributeEditorFactory;
32
import org.eclipse.mylyn.tasks.ui.editors.AttributeEditorFactory;
(-)src/org/eclipse/mylyn/internal/sandbox/ui/editors/TaskEditorExtensions.java (-162 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004, 2007 Mylyn project committers and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *******************************************************************************/
8
9
package org.eclipse.mylyn.internal.sandbox.ui.editors;
10
11
import java.util.HashMap;
12
import java.util.Map;
13
import java.util.SortedSet;
14
import java.util.TreeSet;
15
16
import org.eclipse.core.runtime.Assert;
17
import org.eclipse.core.runtime.IStatus;
18
import org.eclipse.core.runtime.Status;
19
import org.eclipse.mylyn.commons.core.StatusHandler;
20
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
21
import org.eclipse.mylyn.tasks.core.TaskRepository;
22
23
/**
24
 * @author David Green
25
 */
26
public class TaskEditorExtensions {
27
28
	public static final String REPOSITORY_PROPERTY_EDITOR_EXTENSION = "editorExtension";
29
30
	private static Map<String, RegisteredTaskEditorExtension> extensionsById = new HashMap<String, RegisteredTaskEditorExtension>();
31
32
	private static Map<String, String> associationByConnectorKind = new HashMap<String, String>();
33
34
	private static boolean initialized;
35
36
	public static SortedSet<RegisteredTaskEditorExtension> getTaskEditorExtensions() {
37
		init();
38
		return new TreeSet<RegisteredTaskEditorExtension>(extensionsById.values());
39
	}
40
41
	public static void addTaskEditorExtension(String id, String name, AbstractTaskEditorExtension extension) {
42
		Assert.isNotNull(id);
43
		RegisteredTaskEditorExtension previous = extensionsById.put(id, new RegisteredTaskEditorExtension(extension,
44
				id, name));
45
		if (previous != null) {
46
			StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Duplicate taskEditorExtension id="
47
					+ id, null));
48
		}
49
	}
50
51
	public static void addRepositoryAssociation(String connectorKind, String extensionId) {
52
		if (connectorKind == null || extensionId == null) {
53
			throw new IllegalArgumentException();
54
		}
55
		String previous = associationByConnectorKind.put(connectorKind, extensionId);
56
		if (previous != null) {
57
			StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, String.format(
58
					"Duplicate association for repository %s: %s replaces %s", connectorKind, extensionId, previous),
59
					null));
60
		}
61
	}
62
63
	/**
64
	 * get a task editor extension for a specific repository
65
	 * 
66
	 * @param taskRepository
67
	 * @return the extension, or null if there is none
68
	 * 
69
	 * @see #getDefaultTaskEditorExtension(TaskRepository)
70
	 */
71
	public static AbstractTaskEditorExtension getTaskEditorExtension(TaskRepository taskRepository) {
72
		init();
73
		String extensionId = getTaskEditorExtensionId(taskRepository);
74
		if (extensionId != null) {
75
			RegisteredTaskEditorExtension taskEditorExtension = extensionsById.get(extensionId);
76
			return taskEditorExtension == null ? null : taskEditorExtension.getExtension();
77
		}
78
		return null;
79
	}
80
81
	public static String getTaskEditorExtensionId(TaskRepository taskRepository) {
82
		init();
83
		String id = taskRepository.getProperty(REPOSITORY_PROPERTY_EDITOR_EXTENSION);
84
		if (id == null) {
85
			id = getDefaultTaskEditorExtensionId(taskRepository);
86
		}
87
		return id;
88
	}
89
90
	public static void setTaskEditorExtensionId(TaskRepository repository, String editorExtensionId) {
91
		repository.setProperty(REPOSITORY_PROPERTY_EDITOR_EXTENSION, editorExtensionId);
92
	}
93
94
	public static String getDefaultTaskEditorExtensionId(TaskRepository taskRepository) {
95
		init();
96
		return associationByConnectorKind.get(taskRepository.getConnectorKind());
97
	}
98
99
	/**
100
	 * get a default task editor extension for a specific repository
101
	 * 
102
	 * @param taskRepository
103
	 * @return the extension, or null if there is none
104
	 * 
105
	 * @see #getTaskEditorExtension(TaskRepository)
106
	 */
107
	public static AbstractTaskEditorExtension getDefaultTaskEditorExtension(TaskRepository taskRepository) {
108
		init();
109
		String extensionId = getDefaultTaskEditorExtensionId(taskRepository);
110
		if (extensionId != null) {
111
			RegisteredTaskEditorExtension taskEditorExtension = extensionsById.get(extensionId);
112
			return taskEditorExtension == null ? null : taskEditorExtension.getExtension();
113
		}
114
		return null;
115
	}
116
117
	private static void init() {
118
		if (!initialized) {
119
			initialized = true;
120
			TaskEditorExtensionReader.initExtensions();
121
		}
122
	}
123
124
	public static class RegisteredTaskEditorExtension implements Comparable<RegisteredTaskEditorExtension> {
125
126
		private final String id;
127
128
		private final String name;
129
130
		private final AbstractTaskEditorExtension extension;
131
132
		private RegisteredTaskEditorExtension(AbstractTaskEditorExtension extension, String id, String name) {
133
			this.extension = extension;
134
			this.id = id;
135
			this.name = name;
136
		}
137
138
		public String getId() {
139
			return id;
140
		}
141
142
		public String getName() {
143
			return name;
144
		}
145
146
		public AbstractTaskEditorExtension getExtension() {
147
			return extension;
148
		}
149
150
		public int compareTo(RegisteredTaskEditorExtension o) {
151
			if (o == this) {
152
				return 0;
153
			}
154
			int i = name.compareTo(o.name);
155
			if (i == 0) {
156
				i = id.compareTo(o.id);
157
			}
158
			return i;
159
		}
160
	}
161
162
}
(-)src/org/eclipse/mylyn/internal/sandbox/ui/editors/ExtensibleBugzillaTaskEditorPageFactory.java (+1 lines)
Lines 9-14 Link Here
9
package org.eclipse.mylyn.internal.sandbox.ui.editors;
9
package org.eclipse.mylyn.internal.sandbox.ui.editors;
10
10
11
import org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaTaskEditorPageFactory;
11
import org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaTaskEditorPageFactory;
12
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorExtensions;
12
import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
13
import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
13
import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
14
import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
14
import org.eclipse.ui.forms.editor.FormPage;
15
import org.eclipse.ui.forms.editor.FormPage;
(-)schema/taskEditorExtensions.exsd (-142 lines)
Removed Link Here
1
<?xml version='1.0' encoding='UTF-8'?>
2
<!-- Schema file written by PDE -->
3
<schema targetNamespace="org.eclipse.mylyn.sandbox.ui" xmlns="http://www.w3.org/2001/XMLSchema">
4
<annotation>
5
      <appInfo>
6
         <meta.schema plugin="org.eclipse.mylyn.sandbox.ui" id="taskEditorExtensions" name="Task Editor Extensions"/>
7
      </appInfo>
8
      <documentation>
9
         An extension to the Mylyn task editor that can provide viewing and editing controls that are markup-aware.
10
      </documentation>
11
   </annotation>
12
13
   <element name="extension">
14
      <annotation>
15
         <appInfo>
16
            <meta.element internal="true" />
17
         </appInfo>
18
      </annotation>
19
      <complexType>
20
         <sequence>
21
            <element ref="taskEditorExtension" minOccurs="0" maxOccurs="unbounded"/>
22
            <element ref="repositoryAssociation" minOccurs="0" maxOccurs="unbounded"/>
23
         </sequence>
24
         <attribute name="point" type="string" use="required">
25
            <annotation>
26
               <documentation>
27
                  
28
               </documentation>
29
            </annotation>
30
         </attribute>
31
         <attribute name="id" type="string">
32
            <annotation>
33
               <documentation>
34
                  
35
               </documentation>
36
            </annotation>
37
         </attribute>
38
         <attribute name="name" type="string">
39
            <annotation>
40
               <documentation>
41
                  
42
               </documentation>
43
               <appInfo>
44
                  <meta.attribute translatable="true"/>
45
               </appInfo>
46
            </annotation>
47
         </attribute>
48
      </complexType>
49
   </element>
50
51
   <element name="taskEditorExtension">
52
      <complexType>
53
         <attribute name="class" type="string" use="required">
54
            <annotation>
55
               <documentation>
56
                  the fully qualified class name of the class that extends org.eclipse.mylyn.tasks.ui.editors.TaskEditorExtension
57
               </documentation>
58
               <appInfo>
59
                  <meta.attribute kind="java" basedOn="org.eclipse.mylyn.tasks.ui.editors.TaskEditorExtension:"/>
60
               </appInfo>
61
            </annotation>
62
         </attribute>
63
         <attribute name="id" type="string" use="required">
64
            <annotation>
65
               <documentation>
66
                  a unique identifier identifying the extension
67
               </documentation>
68
               <appInfo>
69
                  <meta.attribute kind="identifier"/>
70
               </appInfo>
71
            </annotation>
72
         </attribute>
73
         <attribute name="name" type="string" use="required">
74
            <annotation>
75
               <documentation>
76
                  A human-readable name for the extension that is presented to the Eclipse user in the UI.    Should be translated.  Used in the UI to identify the type of extension, so the name should indicate what the extension is for, and it should be short so that it can be displayed on one line (for example as an option in a combo box.)  Example: &quot;TracWiki&quot;, or &quot;Textile&quot;.
77
               </documentation>
78
               <appInfo>
79
                  <meta.attribute translatable="true"/>
80
               </appInfo>
81
            </annotation>
82
         </attribute>
83
      </complexType>
84
   </element>
85
86
   <element name="repositoryAssociation">
87
      <complexType>
88
         <attribute name="repository" type="string" use="required">
89
            <annotation>
90
               <documentation>
91
                  
92
               </documentation>
93
            </annotation>
94
         </attribute>
95
         <attribute name="taskEditorExtension" type="string" use="required">
96
            <annotation>
97
               <documentation>
98
                  
99
               </documentation>
100
            </annotation>
101
         </attribute>
102
      </complexType>
103
   </element>
104
105
   <annotation>
106
      <appInfo>
107
         <meta.section type="since"/>
108
      </appInfo>
109
      <documentation>
110
         3.0
111
      </documentation>
112
   </annotation>
113
114
   <annotation>
115
      <appInfo>
116
         <meta.section type="examples"/>
117
      </appInfo>
118
      <documentation>
119
         [Enter extension point usage example here.]
120
      </documentation>
121
   </annotation>
122
123
   <annotation>
124
      <appInfo>
125
         <meta.section type="apiinfo"/>
126
      </appInfo>
127
      <documentation>
128
         [Enter API information here.]
129
      </documentation>
130
   </annotation>
131
132
   <annotation>
133
      <appInfo>
134
         <meta.section type="implementation"/>
135
      </appInfo>
136
      <documentation>
137
         [Enter information about supplied implementation of this extension point.]
138
      </documentation>
139
   </annotation>
140
141
142
</schema>
(-)plugin.xml (-2 / +1 lines)
Lines 1-8 Link Here
1
<?xml version="1.0" encoding="UTF-8"?>
1
<?xml version="1.0" encoding="UTF-8"?>
2
<?eclipse version="3.0"?>
2
<?eclipse version="3.0"?>
3
<plugin>
3
<plugin>
4
    <extension-point id="taskEditorExtensions" name="Task Editor Extension" schema="schema/taskEditorExtensions.exsd"/>
4
 
5
    <extension-point id="resourceHyperlinkExtensions" name="Resource Hyperlink Extension" schema="schema/resourceHyperlinkExtensions.exsd"/>
6
    
5
    
7
	<extension point="org.eclipse.ui.views">
6
	<extension point="org.eclipse.ui.views">
8
     	<category name="Experimental" id="org.eclipse.mylyn.sandbox"/>
7
     	<category name="Experimental" id="org.eclipse.mylyn.sandbox"/>
(-)plugin.xml (+1 lines)
Lines 7-12 Link Here
7
    <extension-point id="projectLinkProviders" name="Linking Provider from Project to the Task Repository" schema="schema/projectLinkProviders.exsd"/>
7
    <extension-point id="projectLinkProviders" name="Linking Provider from Project to the Task Repository" schema="schema/projectLinkProviders.exsd"/>
8
    <extension-point id="duplicateDetectors" name="duplicateDetectors" schema="schema/duplicateDetectors.exsd"/>
8
    <extension-point id="duplicateDetectors" name="duplicateDetectors" schema="schema/duplicateDetectors.exsd"/>
9
    <extension-point id="presentations" name="presentations" schema="schema/presentations.exsd"/>
9
    <extension-point id="presentations" name="presentations" schema="schema/presentations.exsd"/>
10
    <extension-point id="taskEditorExtensions" name="Task Editor Extension" schema="schema/taskEditorExtensions.exsd"/>
10
11
11
    <extension
12
    <extension
12
          point="org.eclipse.mylyn.context.core.bridges">
13
          point="org.eclipse.mylyn.context.core.bridges">
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorExtensionReader.java (+83 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004, 2007 Mylyn project committers and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *******************************************************************************/
8
9
package org.eclipse.mylyn.internal.tasks.ui.editors;
10
11
import org.eclipse.core.runtime.CoreException;
12
import org.eclipse.core.runtime.IConfigurationElement;
13
import org.eclipse.core.runtime.IExtension;
14
import org.eclipse.core.runtime.IExtensionPoint;
15
import org.eclipse.core.runtime.IExtensionRegistry;
16
import org.eclipse.core.runtime.IStatus;
17
import org.eclipse.core.runtime.Platform;
18
import org.eclipse.core.runtime.Status;
19
import org.eclipse.mylyn.commons.core.StatusHandler;
20
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
21
import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorExtension;
22
23
/**
24
 * @author David Green
25
 */
26
public class TaskEditorExtensionReader {
27
28
	private static final String CONNECTOR_KIND = "connectorKind";
29
30
	public static final String ATTR_ID = "id";
31
32
	public static final String ATTR_NAME = "name";
33
34
	public static final String EXTENSION_TASK_EDITOR_EXTENSIONS = "org.eclipse.mylyn.sandbox.ui.taskEditorExtensions";
35
36
	private static final String REPOSITORY_ASSOCIATION = "repositoryAssociation";
37
38
	private static final String TASK_EDITOR_EXTENSION = "taskEditorExtension";
39
40
	public static void initExtensions() {
41
		IExtensionRegistry registry = Platform.getExtensionRegistry();
42
43
		IExtensionPoint editorExtensionPoint = registry.getExtensionPoint(EXTENSION_TASK_EDITOR_EXTENSIONS);
44
		IExtension[] editorExtensions = editorExtensionPoint.getExtensions();
45
		for (IExtension extension : editorExtensions) {
46
			IConfigurationElement[] elements = extension.getConfigurationElements();
47
			for (IConfigurationElement element : elements) {
48
				if (element.getName().equals(TASK_EDITOR_EXTENSION)) {
49
					readEditorExtension(element);
50
				} else if (element.getName().equals(REPOSITORY_ASSOCIATION)) {
51
					readEditorExtensionAssociation(element);
52
				}
53
			}
54
		}
55
	}
56
57
	private static void readEditorExtension(IConfigurationElement element) {
58
		try {
59
			String id = element.getAttribute(ATTR_ID);
60
			String name = element.getAttribute(ATTR_NAME);
61
			AbstractTaskEditorExtension extension = (AbstractTaskEditorExtension) element.createExecutableExtension("class");
62
			TaskEditorExtensions.addTaskEditorExtension(id, name, extension);
63
		} catch (CoreException e) {
64
			StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load taskEditorExtension",
65
					e));
66
		} catch (Exception e) {
67
			StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load taskEditorExtension",
68
					e));
69
		}
70
	}
71
72
	private static void readEditorExtensionAssociation(IConfigurationElement element) {
73
		try {
74
			String repository = element.getAttribute(CONNECTOR_KIND);
75
			String taskEditorExtension = element.getAttribute(TASK_EDITOR_EXTENSION);
76
			TaskEditorExtensions.addRepositoryAssociation(repository, taskEditorExtension);
77
		} catch (Exception e) {
78
			StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load "
79
					+ REPOSITORY_ASSOCIATION, e));
80
		}
81
	}
82
83
}
(-)schema/taskEditorExtensions.exsd (+142 lines)
Added Link Here
1
<?xml version='1.0' encoding='UTF-8'?>
2
<!-- Schema file written by PDE -->
3
<schema targetNamespace="org.eclipse.mylyn.tasks.ui" xmlns="http://www.w3.org/2001/XMLSchema">
4
<annotation>
5
      <appInfo>
6
         <meta.schema plugin="org.eclipse.mylyn.tasks.ui" id="taskEditorExtensions" name="Task Editor Extensions"/>
7
      </appInfo>
8
      <documentation>
9
         An extension to the Mylyn task editor that can provide viewing and editing controls that are markup-aware.
10
      </documentation>
11
   </annotation>
12
13
   <element name="extension">
14
      <annotation>
15
         <appInfo>
16
            <meta.element internal="true" />
17
         </appInfo>
18
      </annotation>
19
      <complexType>
20
         <sequence>
21
            <element ref="taskEditorExtension" minOccurs="0" maxOccurs="unbounded"/>
22
            <element ref="repositoryAssociation" minOccurs="0" maxOccurs="unbounded"/>
23
         </sequence>
24
         <attribute name="point" type="string" use="required">
25
            <annotation>
26
               <documentation>
27
                  
28
               </documentation>
29
            </annotation>
30
         </attribute>
31
         <attribute name="id" type="string">
32
            <annotation>
33
               <documentation>
34
                  
35
               </documentation>
36
            </annotation>
37
         </attribute>
38
         <attribute name="name" type="string">
39
            <annotation>
40
               <documentation>
41
                  
42
               </documentation>
43
               <appInfo>
44
                  <meta.attribute translatable="true"/>
45
               </appInfo>
46
            </annotation>
47
         </attribute>
48
      </complexType>
49
   </element>
50
51
   <element name="taskEditorExtension">
52
      <complexType>
53
         <attribute name="class" type="string" use="required">
54
            <annotation>
55
               <documentation>
56
                  the fully qualified class name of the class that extends org.eclipse.mylyn.tasks.ui.editors.TaskEditorExtension
57
               </documentation>
58
               <appInfo>
59
                  <meta.attribute kind="java" basedOn="org.eclipse.mylyn.tasks.ui.editors.TaskEditorExtension:"/>
60
               </appInfo>
61
            </annotation>
62
         </attribute>
63
         <attribute name="id" type="string" use="required">
64
            <annotation>
65
               <documentation>
66
                  a unique identifier identifying the extension
67
               </documentation>
68
               <appInfo>
69
                  <meta.attribute kind="identifier"/>
70
               </appInfo>
71
            </annotation>
72
         </attribute>
73
         <attribute name="name" type="string" use="required">
74
            <annotation>
75
               <documentation>
76
                  A human-readable name for the extension that is presented to the Eclipse user in the UI.    Should be translated.  Used in the UI to identify the type of extension, so the name should indicate what the extension is for, and it should be short so that it can be displayed on one line (for example as an option in a combo box.)  Example: &quot;TracWiki&quot;, or &quot;Textile&quot;.
77
               </documentation>
78
               <appInfo>
79
                  <meta.attribute translatable="true"/>
80
               </appInfo>
81
            </annotation>
82
         </attribute>
83
      </complexType>
84
   </element>
85
86
   <element name="repositoryAssociation">
87
      <complexType>
88
         <attribute name="connectorKind" type="string" use="required">
89
            <annotation>
90
               <documentation>
91
                  
92
               </documentation>
93
            </annotation>
94
         </attribute>
95
         <attribute name="taskEditorExtension" type="string" use="required">
96
            <annotation>
97
               <documentation>
98
                  
99
               </documentation>
100
            </annotation>
101
         </attribute>
102
      </complexType>
103
   </element>
104
105
   <annotation>
106
      <appInfo>
107
         <meta.section type="since"/>
108
      </appInfo>
109
      <documentation>
110
         3.1
111
      </documentation>
112
   </annotation>
113
114
   <annotation>
115
      <appInfo>
116
         <meta.section type="examples"/>
117
      </appInfo>
118
      <documentation>
119
         [Enter extension point usage example here.]
120
      </documentation>
121
   </annotation>
122
123
   <annotation>
124
      <appInfo>
125
         <meta.section type="apiinfo"/>
126
      </appInfo>
127
      <documentation>
128
         [Enter API information here.]
129
      </documentation>
130
   </annotation>
131
132
   <annotation>
133
      <appInfo>
134
         <meta.section type="implementation"/>
135
      </appInfo>
136
      <documentation>
137
         [Enter information about supplied implementation of this extension point.]
138
      </documentation>
139
   </annotation>
140
141
142
</schema>
(-)src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorExtension.java (+62 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004, 2007 Mylyn project committers and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *******************************************************************************/
8
9
package org.eclipse.mylyn.tasks.ui.editors;
10
11
import org.eclipse.jface.text.source.SourceViewer;
12
import org.eclipse.mylyn.tasks.core.TaskRepository;
13
import org.eclipse.swt.widgets.Composite;
14
import org.eclipse.ui.contexts.IContextService;
15
16
/**
17
 * An extension that provides task editor capabilities beyond the default, oriented towards providing markup-aware
18
 * editing and viewing
19
 * 
20
 * @author David Green
21
 * 
22
 * @since 3.1
23
 */
24
public abstract class AbstractTaskEditorExtension {
25
26
	/**
27
	 * The key to access the {@link TaskRepository} property that stores the URL of an associated wiki.
28
	 */
29
	public static final String INTERNAL_WIKI_LINK_PATTERN = "wikiLinkPattern";
30
31
	/**
32
	 * Creates a source viewer that can be used to view content in the task editor. The source viewer should be
33
	 * configured with a source viewer configuration prior to returning.
34
	 * 
35
	 * @param taskRepository
36
	 *            the task repository for which the viewer is created
37
	 * @param parent
38
	 *            the control parent of the source viewer
39
	 * @param style
40
	 *            the styles to use
41
	 */
42
	public abstract SourceViewer createViewer(TaskRepository taskRepository, Composite parent, int style);
43
44
	/**
45
	 * Creates a source viewer that can be used to edit content in the task editor. The source viewer should be
46
	 * configured with a source viewer configuration prior to returning.
47
	 * 
48
	 * @param taskRepository
49
	 *            the task repository for which the viewer is created
50
	 * @param parent
51
	 *            the control parent of the source viewer
52
	 * @param style
53
	 *            the styles to use
54
	 */
55
	public abstract SourceViewer createEditor(TaskRepository taskRepository, Composite parent, int style);
56
57
	/**
58
	 * Returns the editor context id, to be passed to the {@link IContextService} when the editor is in focus.
59
	 */
60
	public abstract String getEditorContextId();
61
62
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorExtensions.java (+163 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004, 2007 Mylyn project committers and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *******************************************************************************/
8
9
package org.eclipse.mylyn.internal.tasks.ui.editors;
10
11
import java.util.HashMap;
12
import java.util.Map;
13
import java.util.SortedSet;
14
import java.util.TreeSet;
15
16
import org.eclipse.core.runtime.Assert;
17
import org.eclipse.core.runtime.IStatus;
18
import org.eclipse.core.runtime.Status;
19
import org.eclipse.mylyn.commons.core.StatusHandler;
20
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
21
import org.eclipse.mylyn.tasks.core.TaskRepository;
22
import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorExtension;
23
24
/**
25
 * @author David Green
26
 */
27
public class TaskEditorExtensions {
28
29
	public static final String REPOSITORY_PROPERTY_EDITOR_EXTENSION = "editorExtension";
30
31
	private static Map<String, RegisteredTaskEditorExtension> extensionsById = new HashMap<String, RegisteredTaskEditorExtension>();
32
33
	private static Map<String, String> associationByConnectorKind = new HashMap<String, String>();
34
35
	private static boolean initialized;
36
37
	public static SortedSet<RegisteredTaskEditorExtension> getTaskEditorExtensions() {
38
		init();
39
		return new TreeSet<RegisteredTaskEditorExtension>(extensionsById.values());
40
	}
41
42
	public static void addTaskEditorExtension(String id, String name, AbstractTaskEditorExtension extension) {
43
		Assert.isNotNull(id);
44
		RegisteredTaskEditorExtension previous = extensionsById.put(id, new RegisteredTaskEditorExtension(extension,
45
				id, name));
46
		if (previous != null) {
47
			StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Duplicate taskEditorExtension id="
48
					+ id, null));
49
		}
50
	}
51
52
	public static void addRepositoryAssociation(String connectorKind, String extensionId) {
53
		if (connectorKind == null || extensionId == null) {
54
			throw new IllegalArgumentException();
55
		}
56
		String previous = associationByConnectorKind.put(connectorKind, extensionId);
57
		if (previous != null) {
58
			StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, String.format(
59
					"Duplicate association for repository %s: %s replaces %s", connectorKind, extensionId, previous),
60
					null));
61
		}
62
	}
63
64
	/**
65
	 * get a task editor extension for a specific repository
66
	 * 
67
	 * @param taskRepository
68
	 * @return the extension, or null if there is none
69
	 * 
70
	 * @see #getDefaultTaskEditorExtension(TaskRepository)
71
	 */
72
	public static AbstractTaskEditorExtension getTaskEditorExtension(TaskRepository taskRepository) {
73
		init();
74
		String extensionId = getTaskEditorExtensionId(taskRepository);
75
		if (extensionId != null) {
76
			RegisteredTaskEditorExtension taskEditorExtension = extensionsById.get(extensionId);
77
			return taskEditorExtension == null ? null : taskEditorExtension.getExtension();
78
		}
79
		return null;
80
	}
81
82
	public static String getTaskEditorExtensionId(TaskRepository taskRepository) {
83
		init();
84
		String id = taskRepository.getProperty(REPOSITORY_PROPERTY_EDITOR_EXTENSION);
85
		if (id == null) {
86
			id = getDefaultTaskEditorExtensionId(taskRepository);
87
		}
88
		return id;
89
	}
90
91
	public static void setTaskEditorExtensionId(TaskRepository repository, String editorExtensionId) {
92
		repository.setProperty(REPOSITORY_PROPERTY_EDITOR_EXTENSION, editorExtensionId);
93
	}
94
95
	public static String getDefaultTaskEditorExtensionId(TaskRepository taskRepository) {
96
		init();
97
		return associationByConnectorKind.get(taskRepository.getConnectorKind());
98
	}
99
100
	/**
101
	 * get a default task editor extension for a specific repository
102
	 * 
103
	 * @param taskRepository
104
	 * @return the extension, or null if there is none
105
	 * 
106
	 * @see #getTaskEditorExtension(TaskRepository)
107
	 */
108
	public static AbstractTaskEditorExtension getDefaultTaskEditorExtension(TaskRepository taskRepository) {
109
		init();
110
		String extensionId = getDefaultTaskEditorExtensionId(taskRepository);
111
		if (extensionId != null) {
112
			RegisteredTaskEditorExtension taskEditorExtension = extensionsById.get(extensionId);
113
			return taskEditorExtension == null ? null : taskEditorExtension.getExtension();
114
		}
115
		return null;
116
	}
117
118
	private static void init() {
119
		if (!initialized) {
120
			initialized = true;
121
			TaskEditorExtensionReader.initExtensions();
122
		}
123
	}
124
125
	public static class RegisteredTaskEditorExtension implements Comparable<RegisteredTaskEditorExtension> {
126
127
		private final String id;
128
129
		private final String name;
130
131
		private final AbstractTaskEditorExtension extension;
132
133
		private RegisteredTaskEditorExtension(AbstractTaskEditorExtension extension, String id, String name) {
134
			this.extension = extension;
135
			this.id = id;
136
			this.name = name;
137
		}
138
139
		public String getId() {
140
			return id;
141
		}
142
143
		public String getName() {
144
			return name;
145
		}
146
147
		public AbstractTaskEditorExtension getExtension() {
148
			return extension;
149
		}
150
151
		public int compareTo(RegisteredTaskEditorExtension o) {
152
			if (o == this) {
153
				return 0;
154
			}
155
			int i = name.compareTo(o.name);
156
			if (i == 0) {
157
				i = id.compareTo(o.id);
158
			}
159
			return i;
160
		}
161
	}
162
163
}

Return to bug 244579