<!-- 
	DO NOT EDIT THIS FILE WITH HTML EDITORS
-->

<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>

<head>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
   <meta name="GENERATOR" content="Mozilla/4.76 [en] (Windows NT 5.0; U) [Netscape]">
   <title>Eclipse Platform Build Notes - Text</title>
</head>

<body>
<h1>
Eclipse Platform Build Notes<br>
Text</h1>
To see which bugs have been addressed in one of the builds simply open the <a href="http://bugs.eclipse.org/bugs/query.cgi?short_desc_type=allwordssubstr&amp;product=Platform&amp;component=Text&amp;long_desc_type=allwordssubstr&amp;long_desc=&amp;bug_file_loc_type=allwordssubstr&amp;bug_file_loc=&amp;keywords_type=allwords&amp;keywords=&amp;emailtype1=substring&amp;email1=&amp;emailtype2=substring&amp;email2=&amp;bugidtype=include&amp;bug_id=&amp;votes=&amp;changedin=&amp;chfieldfrom=&amp;chfieldto=Now&amp;chfieldvalue=&amp;namedcmd=Assigned&amp;newqueryname=&amp;field0-0-0=noop&amp;type0-0-0=noop&amp;value0-0-0=">Platform-Text bugzilla query page</a>, select status, resolution and the time frame.
<br>
<br>
<br>
========== Eclipse Build Input May 18th 2004 ==========<br>
<pre>
- removed last dependency on compatibility plug-in
- bug fixing

The infrastructure for collapsing and expanding ranges of lines in editors (referred to as folding)
is now officially available. The effected plug-ins are org.eclipse.text and org.eclipse.jface.text.

The org.eclipse.text plug-in contains the package org.eclipse.jface.text.projection. This package
defines the UI independent document infrastructure needed for folding. The center piece is the
ProjectionDocument. The content of a projection document is a projection of the content of a master
document. In other words fragments of the master document constitute the segments of the projection
document. The mapping is enacted by the ProjectionMapping implementing IDocumentInformationMapping.
After an instance of ProjectionDocument has been created it is initially empty. The content is defined
by calling addMasterDocumentRange(offsetInMasterDocument, lengthInMasterDocument) and
removeMasterDocumentRange(offsetInMasterDocument, lengthInMasterDocument). The projection document
and its master document are causally connected. Thus, any manipulation of the projection document also
causes master document changes. Any manipulation effecting ranges in the master document that have been
added to the projection document also cause projection document changes.

The org.eclipse.jface.text plug-in contains the package org.eclipse.jface.text.source.projection.
This package defines the UI needed for folding based on the projection document infrastructure. The
center piece is the ProjectionViewer and the ProjectionSupport. A projection support can be installed on
projection viewer. It controls the existence of a vertical ruler column for collapsing/expanding ranges
of lines, the hover behavior, and the presentation of collapsed regions in the viewer. The projection viewer
defines a set of text operations for managing the expansion state of collapsable regions. Collapsable regions
can be defined by requesting the ProjectionSupport to provide an adapter for ProjectionAnnotationModel.class
for the viewer it is installed on. The ProjectionAnnotations managed by this projection annotation model
define the collapsable regions.

ITextViewer defines the concept of a visible region. This concepts is incompatible with folding. Several
assumptions that were safe to make in the world of visible regions are no longer valid in the presence of folding.
For example, in order to determine the document line number of the fifth line in the viewer's widget it was
good enough to determine the start line of the viewer's visible region and to take the fifth line after that.
When folding is enabled, any number of lines can be between two visible lines. Thus, in order to convert between
widget and model coordinates, the methods provided by ITextViewerExtension5 should be used.

Editor implementers (based on AbstractTextEditor) who want to support folding have to do the following:
- override createSourceViewer and return a ProjectionViewer
- override createPartControl resembling:

	public void createPartControl(Composite parent) {
		super.createPartControl(parent);
		
		ProjectionViewer projectionViewer= (ProjectionViewer) getSourceViewer();

		fProjectionSupport= new ProjectionSupport(projectionViewer, getAnnotationAccess(), getSharedColors());
		fProjectionSupport.addSummarizableAnnotationType("org.eclipse.ui.workbench.texteditor.error");
		fProjectionSupport.addSummarizableAnnotationType("org.eclipse.ui.workbench.texteditor.warning");
		fProjectionSupport.setHoverControlCreator(new IInformationControlCreator() {
			public IInformationControl createInformationControl(Shell shell) {
				return new CustomSourceInformationControl(shell, IDocument.DEFAULT_CONTENT_TYPE);
			}
		});
		fProjectionSupport.install();

		...
		
		if (isFoldingEnabled())
			projectionViewer.doOperation(ProjectionViewer.TOOGLE);
	}

- extend getAdapter with 

	public Object getAdapter(Class required) {
		...	
		if (fProjectionSupport != null) {
			Object adapter= fProjectionSupport.getAdapter(getSourceViewer(), required);
			if (adapter != null)
				return adapter;
		}
		
		return super.getAdapter(required);
	}
	
- provide a way to allow the definition of collpsable regions such as:

		ITextEditor editor= getTextEditor();
		ISelection selection= editor.getSelectionProvider().getSelection();
		if (selection instanceof ITextSelection) {
			ITextSelection textSelection= (ITextSelection) selection;
			if (!textSelection.isEmpty()) {
				IAnnotationModel model= (IAnnotationModel) editor.getAdapter(ProjectionAnnotationModel.class);
				if (model != null) {
					int start= textSelection.getStartLine();
					int end= textSelection.getEndLine();
					try {
						IDocument document= editor.getDocumentProvider().getDocument(editor.getEditorInput());
						int offset= document.getLineOffset(start);
						int endOffset= document.getLineOffset(end + 1);
						Position position= new Position(offset, endOffset - offset);
						model.addAnnotation(new ProjectionAnnotation(), position);
					} catch (BadLocationException x) {
					}
				}
			}
		}

</pre>
========== Eclipse Build Input May 11th 2004 ==========<br>
<pre>
- reworked editor preference pages:
  - Annotations and Quick Diff sub-pages are gone: they are now centralized under
    Workbench > Editors
  - added API which allows to configure a client's preference store to use the
    centralized preference pages:
    see: EditorsUI.useAnnotationsPreferencePage(IPreferenceStore)
    see: EditorsUI.useQuickDiffPreferencePage(IPreferenceStore)
  - added ChainedPreferenceStore which allows to chain preference stores
  - the text editor's Appearance sub-page is now the only Text Editor's preference page
- removed all but one dependencies on compatibility plug-in
- externalized all strings
- bug fixing
</pre>
========== Eclipse Build Input May 4th 2004 ==========<br>
<pre>
- ICompletionProposalExtension3: renamed methods:
	- getCompletionText -> getPrefixCompletionText
	- getCompletionOffset -> getPrefixCompletionOffset
	

Headless annotation model support for text file buffers:

We added headless annotation model support to text file buffers. Each text
file buffer can now have its own annotation model. 
        ITextFileBuffer buffer= FileBuffers.getTextFileBufferManager().getTextFileBuffer(<location>); 
        IAnnotationModel model= buffer.getAnnotationModel(); 
When the buffer's document is changed, all annotations in the buffer's annotation 
model are accordingly updated. 

As annotations (org.eclipse.jface.text.source.Annotation) had dependencies on 
SWT the following changes have been applied. These changes might break existing 3.0 clients. 
The changes in detail: 
- ImageUtilities has been moved from org.eclipse.ui.texteditors to org.eclipse.jface.text.source 
- removed static Annotation.drawImage methods -> use org.eclipse.jface.text.source.ImageUtilities 
- removed setLayer, getLayer, and paint from Annotation -> annotations which want to draw 
  themselves should implement IAnnotationPresentation (as has been introduced by Dec. 18th) 
- MarkerAnnotation now directly implements the methods removed from Annotation (setLayer, getLayer, paint) 
- MarkerAnnotation extends SimpleMarkerAnnotation, SimpleMarkerAnnotation just provides 
  access to the represented IMarker 
- the following classes have been moved from the plug-in org.eclipse.jface.text to the plug-in 
  org.eclipse.text, the package names remain the same 
        org.eclipse.jface.text.ISynchronizable 
        org.eclipse.jface.text.source.Annotation 
        org.eclipse.jface.text.source.AnnotationMap 
        org.eclipse.jface.text.source.AnnotationModel 
        org.eclipse.jface.text.source.AnnotationModelEvent 
        org.eclipse.jface.text.source.IAnnotationMap 
        org.eclipse.jface.text.source.IAnnotationModel 
        org.eclipse.jface.text.source.IAnnotationModelExtension 
        org.eclipse.jface.text.source.IAnnotationModelListener 
        org.eclipse.jface.text.source.IAnnotationModelListenerExtension 

The following changes were made to add headless annotation model support to filebuffers. 
        - added ITextFileBuffer.getAnnotationModel(IPath) 
        - added ITextFileBufferManager.createAnnotationModel(IPath) 
        - introduced IPersistableAnnotationModel give annotations model a sense of a life cycle 
        - added new extension point org.eclipse.core.filebuffers.annotationModelCreation for 
          registering factories for file buffer annotation models 
        - introduced IAnnotationModelFactory to reify the contract for the extension point 
        - changed TextFileDocumentProvider to take the text file buffer annotation models into 
          account. This is only the case when a subclass does override 
              TextFileDocumentProvider.createAnnotationModel 

Theses changes affect the following plug-ins: 
        org.eclipse.core.filebuffers 
        org.eclipse.jface.text 
        org.eclipse.text 
        org.eclipse.ui.editors 
	
</pre>
<br>
========== Eclipse Build Input April 27th 2004 ==========<br>
<pre>
- Added org.eclipse.ui.contentassist.ContentAssistHandler which can
  be used to install and control enablement of the visual cue and the
  key binding for subject control content assistants.
</pre>
<br>
========== Eclipse Build Input April 20th 2004 ==========<br>
<pre>
Open / closed partitions:
From IDocumentPartitionerExtension2:
This extension introduces the concept of open and closed (or delimited)
partitions. A delimited partition has a textual token delimiting its start
and end, while an open partition can fill any space between two delimited
partitions.
An open partition of zero length can occur between two delimited partitions,
thus having the same offset as the following delimited partition. The
document start and end are considered to be delimiters of open partitions,
i.e. there may be a zero-length partition between the document start and a
closed partition starting at offset 0.

The partition information queries on IDocumentPartitionerExtension2 carry a 
boolean argument that specifies whether such open partitions should be returned.

-----

API changes:

plug-in: org.eclipse.text 

- pkg: org.eclipse.jface.text
	- renamed FindReplaceDocumentAdapter.search to FindReplaceDocumentAdapter.find
	- changed FindReplaceDocumentAdapter.findReplace to private
	- merged FindReplaceOperationCode into FindReplaceDocumentAdapter, removed FindReplaceOperationCode
	- deleted deprecated classes whose Javadoc stated that these classes were internal
		- ChildDocument
		- ChildDocumentManager
		- ParentChildMapping
		- CoordinatesTranslator
		- Fragment
		- FragmentUpdater
		- ProjectionDocument
		- ProjectionDocumentManager
		- ProjectionPosition
		- ProjectionPositionUpdater
		- ProjectionTextStore

- pkg: org.eclipse.jface.text.link
	- removed ExclusivePositionUpdater
	- marked InclusivePositionUpdater as internal class using Javadoc
	- renamed LinkedEnvironment to LinkedModeModel
		- renamed methods accordingly
  	- renamed LinkedManager to LinkedModeManager
  	- renamed ILinkedListener to ILinkedModeListener
	- renamed LinkedUIControl to LinkedModeUI
	- removed LinkedPositionGroup.createPosition methods
		- use LinkedPositionGroup.addPosition instead

- pkg: org.eclipse.jface.text.templates
	- renamed ContextType to TemplateContextType
	- renamed GlobalVariables to GlobalTemplateVariables
	- renamed SimpleVariableResolver to SimpleTemplateVariableResolver


----------------------------------------

plug-in org.eclipse.jface.text

- pkg: org.eclipse.jface.text
	- renamed IAnnotationHoverExtension.getInformationControlCreator to IAnnotationHoverExtension.getHoverControlCreator
	- renamed ITextHoverExtension.getInformationControlCreator to ITextHoverExtension.getHoverControlCreator

- pkg: org.eclipse.jface.text.formatter
	- merged IContentFormatterExtension2 into IContentFormatterExtension
	- removed IContentFormatterExtension.getPartitioning
	- changed configuration methods of MultipassContentFormatter: substituted IFormattingStrategy for IFormattingStrategyExtension, added assert statements
	- deprecated ContentFormatter

- pkg: org.eclipse.jface.text.source
	- deleted deprecated classes whose Javadoc stated that these classes were internal
		- OutlinerRulerColumn
		- ProjectionAnnotation
		- ProjectionSourceViewer

- pkg: org.eclipse.jface.text.reconciler
	- deleted DocumentAdapter
	- renamed AnnotationEvent to VerticalRulerEvent
	- renamed VerticalRulerEvent.getAnnotation to VerticalRulerEvent.getSelectedAnnotation
	- renamed VerticalRulerEvent.setAnnotation to VerticalRulerEvent.setSelectedAnnotation
	- CompositeRuler no longer implements IVerticalRulerListener
	- renamed CompositeRuler.annotationSelected to CompositeRuler.fireAnnotationSelected
	- renamed CompositeRuler.annotationDefaultSelected to CompositeRuler.fireAnnotationDefaultSelected
	- renamed CompositeRuler.annotationContextMenuAboutToShow to CompositeRuler.fireAnnotationContextMenuAboutToShow
	- changed constructor of AnnotationExpandHover to accept CompositeRuler rather than IVerticalRulerInfo and IVerticalRulerListener

- pkg: org.eclipse.jface.text.contentassist
	- moved AbstractControlContentAssistSubjectAdapter to package org.eclipse.jface.contentassist
	- moved ComboContentAssistSubjectAdapter to package org.eclipse.jface.contentassist
	- moved ContentAssistant to package org.eclipse.jface.contentassist
	- moved IContentAssistProcessorExtension to package org.eclipse.jface.contentassist
	- renamed IContentAssistProcessorExtension to ISubjectControlContentAssistProcessor.java
	- moved IContentAssistSubject to package org.eclipse.jface.contentassist
	- renamed to IContentAssistSubject IContentAssistSubjectControl
	- moved IContextInformationPresenterExtension to package org.eclipse.jface.contentassist
	- renamed IContextInformationPresenterExtension to ISubjectControlContextInformationPresenter
	- moved IContextInformationValidatorExtension to package org.eclipse.jface.contentassist
	- renamed IContextInformationValidatorExtension to ISubjectControlContextInformationValidator
	- moved TextContentAssistSubjectAdapter to package org.eclipse.jface.contentassist
	- added ISubjectControlContentAssistant to package org.eclipse.jface.contentassist
	- moved IContentAssistantExtension.install(IContentAssistSubjectControl) to ISubjectControlContentAssistant
	- added SubjectControlContentAssistant to package org.eclipse.jface.contentassist
	- added SubjectControlContextInformationValidator to package org.eclipse.jface.contentassist

-----------------------------------------------

plug-in org.eclipse.ui.workbench.texteditor

- pkg: org.eclipse.ui.texteditor.templates
	- changed EditTemplateDialog to package visible
	- changed TemplateContentProvider to package visible
	
- org.eclipse.ui.texteditor
	- removed ChainedPreferenceStore (there is a copy in JDT UI)
	- removed PreferencesAdapter (there is copy in JDT UI)
	- deprecated InfoForm
	- renamed SelectMarkerRulerAction2 to SelectAnnotationRulerAction
	- renamed SmartEnterAction to InsertLineAction

- org.eclipse.ui.texteditor.link
	- removed EditorTarget
	- replaced EditorHistoryUpdater with EditorLinkedModeUI
		- clients no longer configure a LinkedModeUI with the EditorHistoryUpdater but instantiate EditorLinedModeUI

-------------------------------------------------

plug-in org.eclipse.ui.editors

- pkg: org.eclipse.ui.texteditor
	- moved AnnotationType to package org.eclipse.ui.internal.texteditor
	- moved AnnotationTypeHierarchy to package org.eclipse.ui.internal.texteditor
	- moved DelegatingAnnotationPreference to package org.eclipse.ui.internal.texteditor
	- marked  AnnotationPreferenceLookup.getAnnotationPreferenceFragment as internal method using Javadoc
	- renamed ExtendedTextEditor to AbstractDecoratedTextEditor
	- renamed ExtendedTextEditorPreferenceConstants to AbstractDecoratedTextEditorPreferenceConstants

- pkg: org.eclipse.ui.editors.text
	- removed EditorUI.getAnnotationTypeHierarchy
	- moved WorkspaceOperationRunner to package org.eclipse.ui.internal.editors.text
	- moved UISynchronizationContext to package org.eclipse.ui.internal.editors.text
	
	
--------------------------------------------------

plug-in org.eclipse.core.filebuffers
- extension point org.eclipse.core.filebuffers.documentSetup now supports the attribute 'fileNames'. The union of
  'fileNames' and 'extensions' is used for setting up a document.
- extension point org.eclipse.core.filebuffers.documentCreation now supports the attribute 'fileNames'.
  'fileName' has precedence over any matching criterion of 'extensions' when creating a document.
	
	
</pre>
========== Eclipse Build Input March 23rd 2004 ==========<br>
<pre>
- Added the <tt>org.eclipse.ui.editors.templates</tt> extension point to the templates infrastructure.
- Added an example of using the extension point to the <tt>org.eclipse.ui.examples.javaeditor</tt> 
  project, see the <tt>Template Editor Example</tt> source folder and the html description for reference.
</pre>
========== Eclipse Build Input March 9th 2004 ==========<br>
<pre>
- Moved the templates infrastructure to the text, jface.text and ui.workbench.texteditor 
  projects, making it API. The template API is still in the flow and might change considerably.
  
  For people that have been using the internal template code, please note:
    - TemplateVariable has been renamed to TemplateVariableResolver
    - TemplatePosition has benn renamed to TemplateVariable
    - there is first support for adding multiple proposals for a variable
</pre>
========== Eclipse Build Input March 2nd 2004 ==========<br>
<pre>
- Moved the linked position infrastructure to the text, jface.text and ui.workbench.texteditor 
  projects, making in API. See package.html in the relevant sections. This is an intermediate step
  in making templates part of the text infrastructure.
- The content assistant can now be configured to restore the completion proposal
  popup's size. For details see:
  - ContentAssistant.setRestoreCompletionProposalSize(IDialogSettings)
- Completion proposal popup of the content assistants in Find/Replace dialog
  now remember their size.
- Several bugs fixed.
</pre>
<br>
========== Eclipse Build Input February 24th 2004 ==========<br>
<pre>
- A source viewer can now be unconfigured and afterwards configured again.
- Information control managers can now be configured to restore the information
  control's location and size. The information control must implement
  IInformationControlExtension3. For details see:
  - AbstractInformationControlManager.setRestoreInformationControlBounds(...)
  - IInformationControlExtension3.getBounds()
- Several bugs fixed.
</pre>
<br>
========== Eclipse Build Input February 17th 2004 ==========<br>
<pre>
- Several bugs fixed.
</pre>
<br>
========== Eclipse Build Input February 10th 2004 ==========<br>
<pre>
- ComboContentAssistSubjectAdapter and TextContentAssistSubjectAdapter allow to
  show cue with tooltip.
- Annotations drawing in text may now be configured. Current drawing styles are boxes, underline, 
  squiggly lines, and an i-beam.
  We might introduce an extension point for specifying custom drawing strategies.
- A roll-over annotation hover has been introduced to cope with many annotations drawn over each 
  other in the vertical ruler. Enable for the Java editor using the roll over preference under 
  Java->Work in Progress. 
</pre>
<br>
========== Eclipse Build Input January 27th 2004 ==========<br>
<pre>
- Improved performance when installing contributed actions.
- The displayed tab width in the text editor can now be configured,
    see Workbench > Editors > Text Editor preferences.
- Enhanced content assistant to be usable in Text and Combo,
    see ComboContentAssistSubjectAdapter and TextContentAssistSubjectAdapter.
- The DefaultAnnotation and its usages which was introduced in 3.0 to be
    create non-marker based annotations has been replaced by new API in Annotation.
</pre>
<br>
========== Eclipse Build Input January 20th 2004 ==========<br>
<pre>
- Improved annotation painting: adapted painter to fine grained annotation model delta.
</pre>
<br>
========== Eclipse Build Input December 18th 2003 ==========<br>
<pre>
This build contains several changes and additions to the annotation mechanism.

1) Annotation Types

There is now the explicit notion of an annotation type. See Annotation.getType() and Annotation.setType().
The type of an annotation can change over it's lifetime. A new extension point has been added for the declaration
of annotation types: "org.eclipse.ui.editors.annotationTypes". An annotation type has a name and can be declared 
as being a subtype of another declared annotation type. An annotation type declaration may also use the attributes 
"markerType" and "markerSeverity" in order to specify that markers of a given type and a given severity should be 
represented in text editors as annotations of a particular annotation type. The attributes "markerType" and 
"markerSeverity" in the "org.eclipse.ui.editors.markerAnnotationSpecification" should no longer be used. Marker 
annotation specifications are thus becoming independent from markers and the name thus misleading. However, the 
name is kept in order to ensure backward compatibility.

Instances of subclasses of AbstractMarkerAnnotationModel automatically detect and set the correct  annotation 
types for annotations they create from markers. In order to programmatically retrieve the annotation type for 
a given marker or a given pair of markerType and markerSeverity use org.eclipse.ui.texteditor.AnnotationTypeLookup.

Access to the hierarchy of annotation types is provided by AnnotationTypeHierarchy. For a given annotation type 
name you can get an AnnotationType that provides information about the chain of super types and a method to check 
whether an annotation type given as name is a subtype. You can also retrieve the information from 
IAnnotationAccessExtension. DefaultMarkerAnnotationAccess implements this interface.

2) MarkerAnnotationSpecification

The annotation type is the key with which to find the associated marker annotation specification. As annotation 
types can extend other annotation types, there is an implicit relation between marker annotation specifications 
as well. Therefore a marker annotation specification for a given annotation type is completed by the marker 
annotation specifications given for the super types of the given annotation type. Therefore, marker annotation 
specification do not have to be complete as this was required before. Marker annotation specifications are 
reified by AnnotationPreferences. By using org.eclipse.ui.texteditor.AnnotationPreferenceLookup, you can retrieve 
an annotation preference for a given annotation type that transparently performs the completion of the preference 
along the annotation super type chain.

3) Painting annotation

Marker annotation specification has been extended with three addition attributed in order to allow the definition 
of custom appearances of a given annotation type in the vertical ruler. These attributes are: "icon", "symbolicIcon", 
and "annotationImageProvider". The value for "icon" is the path to a file containing the icon image. The value of 
"symbolicIcon" can be one of "error", "warning", "info", "task", "bookmark". The attribute "symbolicIcon" is used 
to tell the platform that annotation should be depicted with the same images that are used by the platform to 
present errors, warnings, infos, tasks, and bookmarks respectively. The value of "annotationImageProvider" is a 
class implementing org.eclipse.ui.texteditor.IAnnotationImageProvider that allows for a full custom annotation 
presentation.

The vertical ruler uses it's associated IAnnotationAccess/IAnnotationAccessExtension to draw annotations. 
The vertical ruler does not call Annotation.paint any longer. In general, Annotations are no longer supposed 
to draw themselves. The "paint" and "getLayer" methods have been deprecated in order to make annotation eventually 
UI independent. DefaultMarkerAnnotationAccess serves as default implementation of IAnnotationAccess/IAnnotationAccessExtension. 
DefaultMarkerAnnotationAccess implements the following strategy for painting annotations: If an annotation implements 
IAnnotationPresentation, IAnnotationPresentation.paint is called. If not, the annotation image provider is looked up 
in the annotation preference. The annotation image provider is only available if specified and if the plug-in defining 
the enclosing marker annotation specification has already been loaded. If there is an annotation image provider, the 
call is forwarded to it. If not, the specified "icon" is looked up. "symbolicIcon" is used as the final fallback. For 
drawing annotations, the annotation presentation layer is relevant. DefaultMarkerAnnotationAccess looks up the presentation 
layer using the following strategy: If the annotation preference specifies a presentation layer, the specified layer is 
used. If there is no layer and the annotation implements IAnnotationPresentation, IAnnotationPresentation.getLayer is used 
otherwise the default presentation layer (which is 0) is returned.

4) Additions to Annotation

Annotations additionally support: a message, a flag to indicate whether the annotation is marked as deleted, a 
flag to indicate whether the annotation is persistent or temporary.

5) Migration

The following annotation types are declared by the org.eclipse.ui.editors plug-in:

   &lt;extension point="org.eclipse.ui.editors.annotationTypes"&gt;
      &lt;type
         name="org.eclipse.ui.workbench.texteditor.error"
         markerType="org.eclipse.core.resources.problemmarker"
         markerSeverity="2"&gt;
      &lt;/type&gt;
      &lt;type
         name="org.eclipse.ui.workbench.texteditor.warning"
         markerType="org.eclipse.core.resources.problemmarker"
         markerSeverity="1"&gt;
      &lt;/type&gt;
      &lt;type
         name="org.eclipse.ui.workbench.texteditor.info"
         markerType="org.eclipse.core.resources.problemmarker"
         markerSeverity="0"&gt;
      &lt;/type&gt;
      &lt;type
         name="org.eclipse.ui.workbench.texteditor.task"
         markerType="org.eclipse.core.resources.taskmarker"&gt;
      &lt;/type&gt;
      &lt;type
         name="org.eclipse.ui.workbench.texteditor.bookmark"
         markerType="org.eclipse.core.resources.bookmark"&gt;
      &lt;/type&gt;
   &lt;/extension&gt;

The defined markerAnnotationSpecification extension no longer provide "markerType" and "markerSeverity" 
attributes. They define the "symbolicIcon" attribute with the according value. Thus, MarkerAnnotation.paint 
and MarkerAnnotation.getLayer are not called any longer, i.e. overriding these methods does not have 
any effect.
</pre>
<br>
========== Eclipse Build Input November 11th 2003 ==========<br>
<pre>
- Finished annotation background painter
- Added new concept of ITextPresentationListener which should be used by clients
  to apply a presentation style (e.g. color, bold) to the text. Clients using
  the StyledText.*styleRange* API methods should convert to this new API. A
  ITextPresentationListener can be added and removed from a text viewer (see
  ITextViewerExtension4)
</pre>
<br>
<br>

========== Eclipse Build Input October 28th 2003 ==========<br>
<pre>
- Vertical ruler annotations can be disabled via editor's Annotation preference
  page.
- Added support to set background for annotations
	- annotation background painter <work in progress>
	- key/value attributes to "org.eclipse.ui.workbench.texteditor.markerAnnotationSpecification" extension-point
	- updated annotation preference page to show this attribute
	- enabled this feature for Search annotations
</pre>
<br>
<br>
========== Eclipse Build Input October 21th 2003 ==========<br>
<pre>
- Incremental find has its own editor status line field (findField)
- IStatusField has been extended (IStatusFieldExtension) with the following concepts:
  - set error text and image
  - set tool tip
  - control visibility
</pre>
<br>
<br>
========== Eclipse Build Input October 7th 2003 ==========<br>
<pre>
- Find/Replace dialog now offers content assist for regular expression search and replace
- Changes found by Quickdiff are now ordinary annotations. I.e. they can serve as
  navigation target, can be shown in the overview ruler, and in the text. Their presentation
  colors can also be configured.
- "Open External File" can be found in the Files menu. It opens files which are not workspace files
  with the associated editor or the default text editor if no editor is specified. Text editors support
  external files.
</pre>
<br>
<br>
========== Eclipse Build Input September 30th 2003 ==========<br>
<pre>
- Find/Replace dialog now supports regular expression search and replace
- Quick Diff annotations can now be displayed on the overview ruler and support Go to Next / Previous
</pre>
<br>
<br>
========== Eclipse Build Input August 26th 2003 ==========<br>
<pre>
- Improved overview ruler:
	- can now handle annotations on same layer
	- added tool tip text to overview ruler header
	- tool tip text for disabled annotation no longer appears
	- click on overview ruler item respects layer
	- clicking on same overview ruler item jumps to next annotation
- several bugs fixed
</pre>
<br>
<br>
========== Eclipse Build Input August 19th 2003 ==========<br>
<pre>
- added concept of reconcile step: a reconcile step is one of n steps of a
  reconcile strategy that consists of several steps. See the Java Family example
  to see it in action.
- added concept of translator:  a translator translates a given file into another
  language. The translator is also responsible to provide line mapping information
  for the translation and to compute which offset in an original line corresponds
  to a given offset in a target line. See the Java Family example to see it in action.
- TextEditor extends now ExtendedTextEditor, an additional layer combining features 
  used in rich editors, such as the annotation, line number and overview rulers, 
  the print margin, current text highlighting, and quick diff.
- several bugs fixed
</pre>
<br>
<br>
========== Eclipse Build Input August 12th 2003 ==========<br>
<pre>
- the marker annotation specification can now be used to specify if the annotation
  should allow to be a navigation target. For details read the documentation of
  org.eclipse.workbench.texteditor.markerAnnotationSpecification extension point.
- several bugs fixed
</pre>
<br>
<br>
========== Eclipse Build Input July 29th 2003 ==========<br>
<pre>
- several bugs fixed
</pre>
<br>
<br>
========== Eclipse Build Input July 22th 2003 ==========<br>
<pre>
- several bugs fixed
</pre>
<br>
<br>
========== Eclipse Build Input July 16th 2003 ==========<br>
<!-- Add what's new below and end each line with br tag -->
<pre>
- several bugs fixed
- Improvements and framework changes for the light weight change indication. Change indication
  can now happen in the line number ruler or a dedicated change ruler column.
</pre>
<br>
<br>
========== Eclipse Build Input July 8th 2003 ==========<br>
<!-- Add what's new below and end each line with br tag -->
<pre>
- several bugs fixed
- The TextViewer sends out time-out based selection changed events for
  caret position changes for clients registered as post selection changed listeners.
- The default text editor supports a light weight change indicator integrated with the line number ruler. 
  Can be globally enabled on the Text Editor preference page. Can be enabled/disabled for the current editor
  in the editor's context menu or using the short cut "Ctrl+Shift+Q".
- Text frameworks have been extended to support light weight diffing.
</pre>
<br>
<br>
========== Eclipse Build Input June 17th 2003 ==========<br>
<!-- Add what's new below and end each line with br tag -->
<pre>
- several bugs fixed
- The TextViewer sends out time-out based selection changed events for caret position changes.
- added extension interfaces which allow completion proposals to specify their custom
   information control creator
</pre>
<br>
<br>
========== Eclipse Build Input June 4th 2003 ==========<br>
<!-- Add what's new below and end each line with br tag -->
<pre>
- several bugs fixed
- The TextViewer sends out time-out based selection changed events for caret position changes.
- added extension interfaces which allow text hovers and information providers to specify their custom
   information control creator
- text editors support three typing modes: Overwrite, Insert, Smart Insert
	- typing modes are toggled by INS in the default key binding
	- each mode is represented with its own caret
	- modes can be disabled per editor, i.e. when toggling insert modes, disabled modes will not be selected
- status line contribution items can now be associated with an action that is called when double clicking the status item
</pre>
<br>
<br>
========== Eclipse Build Input May 13th 2003 ==========<br>
<!-- Add what's new below and end each line with br tag -->
<pre>
- several bugs fixed
- released new features:
	- Insert new line above the caret line (ui name: "Smart Enter (Inverse)", default key binding: Ctrl+Shift+Enter)
	- Insert new line after the caret line (ui name: "Smart Enter", default key binding: Shift+Enter)
	- Move selected lines upwards (ui name: "Move Lines Up", default key binding: Alt+Arrow_UP)
	- Move selected lines down (ui name: "Move Lines Down", default key binding: Alt+Arrow_Down)
	- Change case of selection to upper case (ui name: "To Upper Case", default key binding: Ctrl+Shift+X)
	- Change case of selection to lower case (ui name: "To Lower Case", default key binding: Ctrl+Shift+Y)
</pre>
<br>
<br>
========== Eclipse Build Input April 29th 2003 ==========<br>
<!-- Add what's new below and end each line with br tag -->
<pre>
- several bugs fixed
</pre>
<br>
<br>
========== Eclipse Build Input April 22nd 2003 ==========<br>
<!-- Add what's new below and end each line with br tag -->
<pre>
- several bugs fixed
</pre>
<br>
<br>
</body></html>