Implementar un visor de contenidos

El conector de comparación permite suministrar visores especializados para ver y fusionar diferencias de contenido entre elementos no estructurados.

Visores de contenidos simples

Los visores de contenido se utilizan en los lugares donde solo está disponible una entrada y, por lo tanto, no hace falta realizar una comparación.  Por ejemplo, en la función "Restaurar a partir del historial local".   El punto de extensión org.eclipse.compare.contentViewers permite definir un visor de contenidos especializado que no compara sus entradas.

Visores de fusión de contenidos

Un visor de fusión de contenidos efectúa una comparación de dos o tres vías de sus entradas y presenta los resultados a dos columnas, o de cualquier otro modo que sea adecuado.   El visor permite que el usuario fusione las entradas. Los visores de fusión de contenido son comunes para texto o imágenes.

Si los visores de fusión estándar no son adecuados para la función del conector, puede optar por implementar su propio visor de contenidos.  Dicho visor de contenidos debe registrarse en la plataforma mediante el punto de extensión org.eclipse.compare.contentMergeViewers .  El código que figura a continuación muestra la definición de visores de fusión de contenidos especializados destinados a ver archivos Java y de propiedades en el IDE de Java:

   <extension
	point="org.eclipse.compare.contentMergeViewers">
	<viewer
		id="org.eclipse.jdt.internal.ui.compare.JavaContentViewerCreator"
		extensions="java,java2"
		class="org.eclipse.jdt.internal.ui.compare.JavaContentViewerCreator">
	</viewer>
	<viewer
		id="org.eclipse.jdt.internal.ui.compare.TextMergeViewerCreator"
		extensions="properties"
		class="org.eclipse.jdt.internal.ui.compare.TextMergeViewerCreator">
	</viewer>
</extension>

En el código, se especifica el id del visor, la clase que lo crea y la extensión de archivo para la que debe utilizarse el visor de contenidos.   

El objeto ContentMergeViewer es un visor abstracto de comparación y fusión que tiene dos áreas de contenido, situadas una al lado de la otra, y un área de contenido opcional para un ancestro común (en las comparaciones de tres vías).  Dado que la implementación no realiza ninguna presunción acerca del tipo del contenido, es responsabilidad de la subclase manejar el tipo de contenido específico.   

El objeto ImageMergeViewer de org.eclipse.compare.internal muestra cómo implementar un visor de fusión simple de imágenes utilizando un objeto ContentMergeViewer.   El objeto ContentMergeViewer accede a su modelo por medio de un proveedor de contenidos que debe implementar la interfaz IMergeViewerContentProvider.

Fusión de texto

Si el visor utiliza texto, pueden utilizarse clases adicionales que  comparen y fusionen contenido textual.

TextMergeViewer es la subclase concreta de ContentMergeViewer utilizada para comparar y fusionar contenido textual.  Un visor de fusión de texto utiliza RangeDifferencer para realizar una comparación textual línea por línea de dos (o tres) documentos de entrada. 

En el caso de que las líneas de texto sean distintas, el visor TextMergeViewer utiliza una interfaz ITokenComparator para localizar las secuencias más largas de símbolos coincidentes y no coincidentes. La comparación de símbolos por omisión de TextMergeViewer funciona en los caracteres separados por espacios en blanco. Si se necesita una estrategia diferente (por ejemplo, símbolos Java en un visor de fusión sensible a Java), los clientes pueden crear sus propios comparadores de símbolos implementando la interfaz ITokenComparator.  

TextMergeViewer funciona en documentos completos y en subrangos de documentos. En el caso de los documentos parciales, la entrada del visor debe ser una interfaz IDocumentRange, en vez de una interfaz IDocument.

Diferenciación de rangos

El objeto RangeDifferencer localiza las secuencias más largas de entidades comparables coincidentes y no coincidentes en el contenido textual. Su implementación está basada en una versión convertida en objeto del algoritmo descrito en la publicación A File Comparison Program, de Webb Miller y Eugene W. Myers, Software Practice and Experience, Vol. 15, Noviembre de 1985.   Los clientes deben suministrar la entrada del diferenciador que implementa la interfaz IRangeComparator. Una interfaz IRangeComparator descompone los datos de entrada en una secuencia de entidades y proporciona un método para comparar una entidad con la entidad situada en otra interfaz IRangeComparator.

Por ejemplo, para comparar dos documentos de texto y localizar las secuencias comunes más largas de líneas coincidentes y no coincidentes, la implementación de IRangeComparator debe descomponer el documento en líneas y proporcionar un método para comprobar si dos líneas se consideran iguales. En org.eclipse.compare.internal.DocLineComparator hallará un ejemplo de cómo hacerlo.

El diferenciador devuelve las diferencias existentes entre estas secuencias en forma de matriz de objetos RangeDifference. Cada RangeDifference individual describe el tipo de diferencia (sin cambio, cambio, adición, supresión) y los correspondientes rangos de las entidades comparables subyacentes de las dos o tres entradas.

 

Copyright IBM Corporation y otros 2000, 2003.