Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 49343 Details for
Bug 117517
add support for commit comment templates
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
Reworked patch (now with dynamic extensions and content assist)
CommitTemplatesForMylar.patch (text/plain), 24.74 KB, created by
Eike Stepper
on 2006-09-04 10:25:04 EDT
(
hide
)
Description:
Reworked patch (now with dynamic extensions and content assist)
Filename:
MIME Type:
Creator:
Eike Stepper
Created:
2006-09-04 10:25:04 EDT
Size:
24.74 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.mylar.team >Index: src/org/eclipse/mylar/internal/team/template/TemplateHandlersManager.java >=================================================================== >RCS file: src/org/eclipse/mylar/internal/team/template/TemplateHandlersManager.java >diff -N src/org/eclipse/mylar/internal/team/template/TemplateHandlersManager.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/mylar/internal/team/template/TemplateHandlersManager.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,212 @@ >+/*************************************************************************** >+ * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. >+ * 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: >+ * Eike Stepper - initial API and implementation >+ **************************************************************************/ >+package org.eclipse.mylar.internal.team.template; >+ >+ >+import org.eclipse.core.runtime.IConfigurationElement; >+import org.eclipse.core.runtime.IExtension; >+import org.eclipse.core.runtime.IExtensionPoint; >+import org.eclipse.core.runtime.Platform; >+import org.eclipse.mylar.context.core.MylarStatusHandler; >+import org.eclipse.mylar.tasks.core.ITask; >+import org.eclipse.mylar.team.ITemplateHandler; >+import org.eclipse.mylar.team.ITemplateHandlersManager; >+import org.eclipse.mylar.team.MylarTeamPlugin; >+ >+import java.text.MessageFormat; >+import java.util.ArrayList; >+ >+ >+/** >+ * @author Eike Stepper >+ */ >+public class TemplateHandlersManager implements ITemplateHandlersManager >+{ >+ private static final String ATTR_CLASS = "class"; >+ >+ private static final String ATTR_DESCRIPTION = "description"; >+ >+ private static final String ATTR_RECOGNIZED_KEYWORD = "recognizedKeyword"; >+ >+ private static final String ELEM_TEMPLATE_HANDLER = "templateHandler"; >+ >+ private static final String EXT_POINT_TEMPLATE_HANDLERS = "templateHandlers"; >+ >+ public TemplateHandlersManager() >+ { >+ } >+ >+ public String[] getRecognizedKeywords() >+ { >+ final ArrayList<String> result = new ArrayList<String>(); >+ new ExtensionProcessor() >+ { >+ @Override >+ protected Object processContribution(IConfigurationElement element, String keyword, >+ String description, String className) throws Exception >+ { >+ result.add(keyword); >+ return null; >+ } >+ }.run(); >+ >+ return result.toArray(new String[result.size()]); >+ } >+ >+ public String getHandlerDescription(final String keyword) >+ { >+ return (String)new ExtensionProcessor() >+ { >+ @Override >+ protected Object processContribution(IConfigurationElement element, String foundKeyword, >+ String description, String className) throws Exception >+ { >+ return keyword.equals(foundKeyword) ? description : null; >+ } >+ }.run(); >+ } >+ >+ public ITemplateHandler createHandler(final String keyword) >+ { >+ return (ITemplateHandler)new ExtensionProcessor() >+ { >+ @Override >+ protected Object processContribution(IConfigurationElement element, String foundKeyword, >+ String description, String className) throws Exception >+ { >+ if (keyword.equals(foundKeyword)) >+ { >+ ITemplateHandler handler = (ITemplateHandler)element >+ .createExecutableExtension(ATTR_CLASS); >+ if (handler instanceof TemplateHandler) >+ { >+ ((TemplateHandler)handler).setDescription(description); >+ ((TemplateHandler)handler).setRecognizedKeyword(foundKeyword); >+ } >+ else >+ { >+ String recognizedKeyword = handler.getRecognizedKeyword(); >+ if (recognizedKeyword == null || !recognizedKeyword.equals(foundKeyword)) >+ { >+ throw new IllegalArgumentException( >+ "Keyword markup does not match handler implementation"); >+ } >+ } >+ >+ return handler; >+ } >+ >+ return null; >+ } >+ }.run(); >+ } >+ >+ public String generateComment(ITask task, String completedTemplate, String progressTemplate) >+ { >+ String template = task.isCompleted() ? completedTemplate : progressTemplate; >+ return processKeywords(task, template); >+ } >+ >+ private String processKeywords(ITask task, String template) >+ { >+ String[] segments = template.split("\\$\\{"); >+ StringBuffer buffer = new StringBuffer(segments[0]); >+ >+ for (int i = 1; i < segments.length; i++) >+ { >+ String segment = segments[i]; >+ String value = null; >+ int brace = segment.indexOf('}'); >+ if (brace > 0) >+ { >+ String keyword = segment.substring(0, brace); >+ value = processKeyword(task, keyword); >+ } >+ >+ if (value != null) >+ { >+ buffer.append(value); >+ buffer.append(segment.substring(brace + 1)); >+ } >+ else >+ { >+ buffer.append("${"); >+ buffer.append(segment); >+ } >+ } >+ >+ return buffer.toString(); >+ } >+ >+ private String processKeyword(ITask task, String keyword) >+ { >+ ITemplateHandler handler = createHandler(keyword); >+ if (handler != null) >+ { >+ return handler.getValue(task); >+ } >+ >+ return null; >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ private static class ExtensionProcessor >+ { >+ public Object run() >+ { >+ IExtensionPoint extPoint = Platform.getExtensionRegistry().getExtensionPoint( >+ MylarTeamPlugin.PLUGIN_ID, EXT_POINT_TEMPLATE_HANDLERS); >+ IExtension[] extensions = extPoint.getExtensions(); >+ for (int i = 0; i < extensions.length; i++) >+ { >+ IExtension extension = extensions[i]; >+ IConfigurationElement[] elements = extension.getConfigurationElements(); >+ for (int j = 0; j < elements.length; j++) >+ { >+ IConfigurationElement element = elements[j]; >+ if (ELEM_TEMPLATE_HANDLER.equals(element.getName())) >+ { >+ try >+ { >+ Object result = processContribution(element); >+ if (result != null) return result; >+ } >+ catch (Exception ex) >+ { >+ final String msg = MessageFormat.format( >+ "Error while processing template handler contribution {0} from plugin {1}.", >+ element.getAttribute(ATTR_CLASS), element.getContributor().getName()); >+ MylarStatusHandler.log(ex, msg); >+ } >+ } >+ } >+ } >+ >+ return null; >+ } >+ >+ protected Object processContribution(IConfigurationElement element) throws Exception >+ { >+ String keyword = element.getAttribute(ATTR_RECOGNIZED_KEYWORD); >+ String description = element.getAttribute(ATTR_DESCRIPTION); >+ String className = element.getAttribute(ATTR_CLASS); >+ return processContribution(element, keyword, description, className); >+ } >+ >+ protected Object processContribution(IConfigurationElement element, String keyword, >+ String description, String className) throws Exception >+ { >+ return null; >+ } >+ } >+} >Index: schema/templateHandlers.exsd >=================================================================== >RCS file: schema/templateHandlers.exsd >diff -N schema/templateHandlers.exsd >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ schema/templateHandlers.exsd 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,122 @@ >+<?xml version='1.0' encoding='UTF-8'?> >+<!-- Schema file written by PDE --> >+<schema targetNamespace="org.eclipse.mylar.team"> >+<annotation> >+ <appInfo> >+ <meta.schema plugin="org.eclipse.mylar.team" id="templateHandlers" name="Mylar Template Handlers"/> >+ </appInfo> >+ <documentation> >+ [Enter description of this extension point.] >+ </documentation> >+ </annotation> >+ >+ <element name="extension"> >+ <complexType> >+ <sequence> >+ <element ref="templateHandler" minOccurs="1" maxOccurs="unbounded"/> >+ </sequence> >+ <attribute name="point" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="id" type="string"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="name" type="string"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ <appInfo> >+ <meta.attribute translatable="true"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ </complexType> >+ </element> >+ >+ <element name="templateHandler"> >+ <complexType> >+ <attribute name="class" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ <appInfo> >+ <meta.attribute kind="java" basedOn="org.eclipse.mylar.team.ITemplateHandler"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ <attribute name="description" type="string"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ <appInfo> >+ <meta.attribute translatable="true"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ <attribute name="recognizedKeyword" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ </annotation> >+ </attribute> >+ </complexType> >+ </element> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="since"/> >+ </appInfo> >+ <documentation> >+ [Enter the first release in which this extension point appears.] >+ </documentation> >+ </annotation> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="examples"/> >+ </appInfo> >+ <documentation> >+ [Enter extension point usage example here.] >+ </documentation> >+ </annotation> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="apiInfo"/> >+ </appInfo> >+ <documentation> >+ [Enter API information here.] >+ </documentation> >+ </annotation> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="implementation"/> >+ </appInfo> >+ <documentation> >+ [Enter information about supplied implementation of this extension point.] >+ </documentation> >+ </annotation> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="copyright"/> >+ </appInfo> >+ <documentation> >+ >+ </documentation> >+ </annotation> >+ >+</schema> >Index: src/org/eclipse/mylar/internal/team/template/TemplateHandler.java >=================================================================== >RCS file: src/org/eclipse/mylar/internal/team/template/TemplateHandler.java >diff -N src/org/eclipse/mylar/internal/team/template/TemplateHandler.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/mylar/internal/team/template/TemplateHandler.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,384 @@ >+/*************************************************************************** >+ * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. >+ * 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: >+ * Eike Stepper - initial API and implementation >+ **************************************************************************/ >+package org.eclipse.mylar.internal.team.template; >+ >+ >+import org.eclipse.mylar.tasks.core.AbstractRepositoryTask; >+import org.eclipse.mylar.tasks.core.ITask; >+import org.eclipse.mylar.team.ITemplateHandler; >+ >+import java.util.List; >+ >+ >+/** >+ * @author Eike Stepper >+ */ >+public abstract class TemplateHandler implements ITemplateHandler >+{ >+ protected String description; >+ >+ protected String recognizedKeyword; >+ >+ protected TemplateHandler() >+ { >+ } >+ >+ public String getDescription() >+ { >+ return description != null ? description : "Handler for '" + recognizedKeyword + "'"; >+ } >+ >+ public void setDescription(String description) >+ { >+ this.description = description; >+ } >+ >+ public String getRecognizedKeyword() >+ { >+ return recognizedKeyword; >+ } >+ >+ public void setRecognizedKeyword(String recognizedKeyword) >+ { >+ if (recognizedKeyword == null) >+ { >+ throw new IllegalArgumentException("Keyword to recognize must not be null"); //$NON-NLS-1$ >+ } >+ >+ this.recognizedKeyword = recognizedKeyword; >+ } >+ >+ public static String implode(List<String> list, String separator) >+ { >+ StringBuilder builder = new StringBuilder(); >+ for (String cc : list) >+ { >+ if (builder.length() != 0) >+ { >+ builder.append(separator); >+ } >+ >+ builder.append(cc); >+ } >+ >+ return builder.toString(); >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class RepositoryKind extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ if (task instanceof AbstractRepositoryTask) >+ { >+ return ((AbstractRepositoryTask)task).getRepositoryKind(); >+ } >+ >+ return null; >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class RepositoryURL extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ if (task instanceof AbstractRepositoryTask) >+ { >+ return ((AbstractRepositoryTask)task).getRepositoryUrl(); >+ } >+ >+ return null; >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskProduct extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ if (task instanceof AbstractRepositoryTask) >+ { >+ return ((AbstractRepositoryTask)task).getTaskData().getProduct(); >+ } >+ >+ return null; >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskAssignee extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ if (task instanceof AbstractRepositoryTask) >+ { >+ return ((AbstractRepositoryTask)task).getTaskData().getAssignedTo(); >+ } >+ >+ return null; >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskReporter extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ if (task instanceof AbstractRepositoryTask) >+ { >+ return ((AbstractRepositoryTask)task).getTaskData().getReporter(); >+ } >+ >+ return null; >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskResolution extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ if (task instanceof AbstractRepositoryTask) >+ { >+ return ((AbstractRepositoryTask)task).getTaskData().getResolution(); >+ } >+ >+ return null; >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskStatus extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ if (task instanceof AbstractRepositoryTask) >+ { >+ return ((AbstractRepositoryTask)task).getTaskData().getStatus(); >+ } >+ >+ return null; >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskCC extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ if (task instanceof AbstractRepositoryTask) >+ { >+ List<String> list = ((AbstractRepositoryTask)task).getTaskData().getCC(); >+ return implode(list, ", "); >+ } >+ >+ return null; >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskKeywords extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ if (task instanceof AbstractRepositoryTask) >+ { >+ List<String> list = ((AbstractRepositoryTask)task).getTaskData().getKeywords(); >+ return implode(list, ", "); >+ } >+ >+ return null; >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskLastModified extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ if (task instanceof AbstractRepositoryTask) >+ { >+ return ((AbstractRepositoryTask)task).getTaskData().getLastModified(); >+ } >+ >+ return null; >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskSummary extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ if (task instanceof AbstractRepositoryTask) >+ { >+ return ((AbstractRepositoryTask)task).getTaskData().getSummary(); >+ } >+ >+ return task.getDescription(); >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskDescription extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ return task.getDescription(); >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskHandle extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ return task.getHandleIdentifier(); >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskID extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ return AbstractRepositoryTask.getTaskId(task.getHandleIdentifier()); >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskNotes extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ return task.getNotes(); >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskPriority extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ return task.getPriority(); >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskType extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ return task.getTaskType(); >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskURL extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ return task.getUrl(); >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ protected static abstract class Date extends TemplateHandler >+ { >+ public String getValue(ITask task) >+ { >+ java.util.Date date = getDate(task); >+ return formatDate(date); >+ } >+ >+ protected String formatDate(java.util.Date date) >+ { >+ return date.toString(); >+ } >+ >+ protected abstract java.util.Date getDate(ITask task); >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskCompletion extends Date >+ { >+ @Override >+ protected java.util.Date getDate(ITask task) >+ { >+ return task.getCompletionDate(); >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskCreation extends Date >+ { >+ @Override >+ protected java.util.Date getDate(ITask task) >+ { >+ return task.getCreationDate(); >+ } >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ public static class TaskReminder extends Date >+ { >+ @Override >+ protected java.util.Date getDate(ITask task) >+ { >+ return task.getReminderDate(); >+ } >+ } >+ } >+} >Index: src/org/eclipse/mylar/internal/team/template/TemplateHandlerContentProposalProvider.java >=================================================================== >RCS file: src/org/eclipse/mylar/internal/team/template/TemplateHandlerContentProposalProvider.java >diff -N src/org/eclipse/mylar/internal/team/template/TemplateHandlerContentProposalProvider.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/mylar/internal/team/template/TemplateHandlerContentProposalProvider.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,158 @@ >+/*************************************************************************** >+ * Copyright (c) 2004, 2005, 2006 Eike Stepper, Germany. >+ * 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: >+ * Eike Stepper - initial API and implementation >+ **************************************************************************/ >+package org.eclipse.mylar.internal.team.template; >+ >+ >+import org.eclipse.jface.fieldassist.IContentProposal; >+import org.eclipse.jface.fieldassist.IContentProposalProvider; >+import org.eclipse.mylar.team.ITemplateHandlersManager; >+ >+import java.util.ArrayList; >+import java.util.List; >+ >+ >+/** >+ * @author Eike Stepper >+ */ >+public class TemplateHandlerContentProposalProvider implements IContentProposalProvider >+{ >+ public IContentProposal[] getProposals(String contents, int position) >+ { >+ ProposalComputer proposalComputer = new ProposalComputer(contents, position); >+ return proposalComputer.computeProposals(); >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ protected static class ProposalComputer >+ { >+ private String contents; >+ >+ private int position; >+ >+ private List<IContentProposal> result = new ArrayList<IContentProposal>(); >+ >+ private String[] keywords; >+ >+ private String prefix; >+ >+ public ProposalComputer(String contents, int position) >+ { >+ this.contents = contents; >+ this.position = position; >+ initKeywords(); >+ initPrefix(); >+ } >+ >+ public IContentProposal[] computeProposals() >+ { >+ for (String keyword : keywords) >+ { >+ String proposal = getMatch(keyword); >+ if (proposal != null) >+ { >+ addProposal(proposal, keyword); >+ } >+ } >+ >+ return result.toArray(new IContentProposal[result.size()]); >+ } >+ >+ protected ITemplateHandlersManager getTemplateHandlersManager() >+ { >+ return ITemplateHandlersManager.INSTANCE; >+ } >+ >+ private void initKeywords() >+ { >+ keywords = getTemplateHandlersManager().getRecognizedKeywords(); >+ } >+ >+ private void initPrefix() >+ { >+ prefix = ""; >+ String beforePosition = contents.substring(0, position); >+ if (beforePosition.endsWith("$")) >+ { >+ prefix = "$"; >+ } >+ else >+ { >+ int start = beforePosition.lastIndexOf("${"); >+ if (start >= 0) >+ { >+ int end = contents.indexOf('}', start); >+ if (end >= position) >+ { >+ prefix = contents.substring(start, position); >+ } >+ } >+ } >+ } >+ >+ private String getMatch(String keyword) >+ { >+ String wholeProposal = "${" + keyword + "}"; >+ if (wholeProposal.startsWith(prefix)) >+ { >+ return wholeProposal.substring(prefix.length()); >+ } >+ >+ return null; >+ } >+ >+ private void addProposal(String proposal, String keyword) >+ { >+ String description = getTemplateHandlersManager().getHandlerDescription(keyword); >+ result.add(new Proposal(proposal, keyword, description)); >+ } >+ >+ /** >+ * @author Eike Stepper >+ */ >+ private static final class Proposal implements IContentProposal >+ { >+ private final String proposal; >+ >+ private final String keyword; >+ >+ private final String description; >+ >+ private Proposal(String proposal, String keyword, String description) >+ { >+ this.proposal = proposal; >+ this.keyword = keyword; >+ this.description = description; >+ } >+ >+ public String getContent() >+ { >+ return proposal; >+ } >+ >+ public int getCursorPosition() >+ { >+ return proposal.length(); >+ } >+ >+ public String getDescription() >+ { >+ return description; >+ } >+ >+ public String getLabel() >+ { >+ return "${" + keyword + "}"; >+ } >+ } >+ } >+}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 117517
:
49080
|
49343
|
49344
|
49347
|
49369
|
49380
|
50234
|
52014
|
52413