BreakIterator

The FlowUtilities class uses the native BreakIterator class to determine the boundaries between words. Clients may contribute their own implementation by contributing a custom BreakIteratorProvider via SPI. If multiple services are contributed, the first one is chosen.

Example: How to supply a custom BreakIterator

Users may want to use the break rules from e.g. ICU instead of the JDK rules. Because those classes don’t share a common interface, the user has to extend the abstract BreakIterator class and call the corresponding ICU method for abstract method that is overwritten.

Solution:

SPI uses the context-classloader to instantiate the custom implementation. In order to use this mechanism in OSGi with minimal complications, it is recommended to create this class within a Draw2D fragment. Also note that this class needs to be registered via META-INF/services/java.text.spi.BreakIteratorProvider

public class CustomBreakIteratorProvider extends BreakIteratorProvider {
	@Override
	public BreakIterator getWordInstance(Locale locale) {
		...
	}

	@Override
	public BreakIterator getLineInstance(Locale locale) {
		...
	}

	@Override
	public BreakIterator getCharacterInstance(Locale locale) {
		...
	}

	@Override
	public BreakIterator getSentenceInstance(Locale locale) {
		...
	}

	@Override
	public Locale[] getAvailableLocales() {
		...
	}
}

Bidi

Similarly to the BreakIterator, the BidiProcessor class uses the native Bidi class to determine whether a text requires a Bidi analysis. Clients may contribute their own implementation by contributing a custom BidiProvider via SPI. If multiple services are contributed, the first one is chosen.

Example: Custom BidiProvider Service

The Bidi algorithm provided by the JDK might not be sufficient to determine, whether a given text requires further analysis.

Solution:

SPI uses the context-classloader to instantiate the custom implementation. In order to use this mechanism in OSGi with minimal complications, it is recommended to create this class within a Draw2D fragment. Also note that this class needs to be registered via META-INF/services/org.eclipse.draw2d.text.BidiProvider.

public class CustomBidiProvider implements BidiProvider {
	@Override
	public boolean requiresBidi(char[] text, int start, int limit) {
		...
	}
}