/******************************************************************************* * Copyright (c) 2012, 2015 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation ******************************************************************************/ package org.eclipse.jface.util; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.equinox.bidi.StructuredTextTypeHandlerFactory; import org.eclipse.equinox.bidi.advanced.IStructuredTextExpert; import org.eclipse.equinox.bidi.advanced.StructuredTextEnvironment; import org.eclipse.equinox.bidi.advanced.StructuredTextExpertFactory; import org.eclipse.equinox.bidi.custom.StructuredTextTypeHandler; import org.eclipse.swt.events.SegmentEvent; import org.eclipse.swt.events.SegmentListener; /** * Segment listener that implements bidi-structured text reordering. * The reordering is specified by the structured text type that is passed to the constructor. * * <p> * <strong>Note:</strong> This class only works if the <code>org.eclipse.equinox.bidi</code> * bundle is on the classpath! * </p> * * @since 3.9 * @noextend This class is not intended to be subclassed by clients. */ public class StructuredTextSegmentListener implements SegmentListener { private final IStructuredTextExpert expert; private boolean logExceptions = true; /** * Creates a new structured text segment listener. * * @param textType * the structured text type. Possible values are the structured * text type ids supported by * {@link StructuredTextTypeHandlerFactory#getHandler(String)}. * @throws IllegalArgumentException * if <code>textType</code> is not a known type identifier */ public StructuredTextSegmentListener(String textType) { expert = StructuredTextExpertFactory.getExpert(textType); } /** * Creates a new structured text segment listener. * * @param textTypeHandler the structured text type handler * @throws IllegalArgumentException if the <code>handler</code> is <code>null</code> */ public StructuredTextSegmentListener(StructuredTextTypeHandler textTypeHandler) { expert = StructuredTextExpertFactory.getStatefulExpert(textTypeHandler, StructuredTextEnvironment.DEFAULT); } @Override public void getSegments(SegmentEvent event) { int length = event.lineText.length(); if (length > 0) { try { int segments[] = expert.leanBidiCharOffsets(event.lineText); event.segments = new int[segments.length + 2]; event.segments[0] = 0; System.arraycopy(segments, 0, event.segments, 1, segments.length); event.segments[segments.length + 1] = length; event.segmentsChars = new char[event.segments.length]; event.segmentsChars[0] = BidiUtils.LRE; for (int i = 1; i < event.segments.length - 1; i++) event.segmentsChars[i] = BidiUtils.LRM; event.segmentsChars[event.segments.length - 1] = BidiUtils.PDF; } catch (RuntimeException ex) { // Only log the first exception. Logging every exception would make the system unusable. if (logExceptions) { Policy.getLog().log(new Status(IStatus.ERROR, Policy.JFACE, "An error occurred while processing \"" + event.lineText + "\" with " + expert, ex)); //$NON-NLS-1$//$NON-NLS-2$ logExceptions = false; } } } } }