javauis/lcdui_qt/src/javax/microedition/lcdui/TextWrapper.java
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 03 May 2010 12:27:20 +0300
changeset 21 2a9601315dfc
child 23 98ccebc37403
permissions -rw-r--r--
Revision: v2.1.22 Kit: 201018

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/
package javax.microedition.lcdui;

import org.eclipse.ercp.swt.mobile.ConstrainedText;
import org.eclipse.ercp.swt.mobile.TextExtension;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.*;

/**
 * Dynamic Text component implementation over the TextExtension/ConstrainedText
 * widgets as a wrapper.
 */
class TextWrapper {

    private String text;
    private String inputMode;
    private int constraints;
    private int caret;
    private int size;
    private int maxSize;

    private Control control; // owned
    private int style;
    private int width = -1;
    private int height = -1;
    private int x = -1;
    private int y = -1;
    private Color fgCol; // owned
    private Color bgCol; // owned
    private boolean visible = true;
    private boolean focused = true;

    private Font font;   // not owned
    private ModifyListener modifyListener; // not owned
    private SelectionListener selectionListener; // not owned

    private String retSelectedStr;
    private int retLineHeight;
    private int retLineCount;
    private int retTopPixel;

    /**
     * Constructor.
     *
     * @param aText
     * @param aMaxSize
     * @param aConstraints
     */
    TextWrapper(String aText, int aMaxSize, int aConstraints) {
        setMaxSize(aMaxSize);
        setConstraints(aConstraints);
        setContent(aText);
    }

    /**
     * Construct eSWT control on specified composite.
     *
     * @param parent composite to create on
     * @param addStyle additional style
     */
    void construct(final Composite parent, final int addStyle) {
        ESWTUIThreadRunner.safeSyncExec(new Runnable() {
            public void run() {
                eswtConstruct(parent, addStyle);
            }
        });
    }

    /**
     * Construct eSWT control on specified composite.
     *
     * @param parent composite to create on
     * @param addStyle additional style
     */
    void eswtConstruct(Composite parent, int addStyle) {
        style = addStyle | SWT.MULTI | SWT.WRAP;
        if (parent != null) {
            eswtStoreStateAndDispose();
            eswtRestoreStateAndCreate(parent);
        }
        else {
            Logger.warning("Trying to construct TextWrapper with null parent");
        }
    }

    /**
     * Delete subset of characters from content.
     *
     * @param offset
     * @param length
     */
    void delete(int offset, int length) {
        if ((offset + length) > getSize()) {
            throw new StringIndexOutOfBoundsException(
                    MsgRepository.TEXT_EXCEPTION_ARRAY_INDEX_OUT_OF_BOUNDS);
        }
        StringBuffer sb = new StringBuffer(getContent());
        sb.delete(offset, offset + length);
        setContent(sb.toString());
    }

    /**
     * Dispose eSWT control.
     */
    void dispose() {
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    eswtStoreStateAndDispose();
                }
            });
        }
    }

    /**
     * Get caret position.
     */
    int getCaretPosition() {
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    caret = eswtGetCaretPosition(control);
                }
            });
        }
        return caret;
    }

    /**
     * Get constraints.
     */
    int getConstraints() {
        return constraints;
    }

    /**
     * Get text content.
     */
    String getContent() {
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    text = eswtGetContent(control);
                }
            });
        }
        return text;
    }

    /**
     * Gets the height of this Text control in pixels.
     */
    int getHeight() {
        return height;
    }

    /**
     * Get input mode.
     */
    String getInputMode() {
        return inputMode;
    }

    /**
     * Get line count.
     */
    int getLineCount() {
        retLineCount = 1;
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    retLineCount = eswtGetLineCount(control);
                }
            });
        }
        return retLineCount;
    }

    /**
     * Get line height (in pixels).
     */
    int getLineHeight() {
        retLineHeight = 1;
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    retLineHeight = eswtGetLineHeight(control);
                }
            });
        }
        return retLineHeight;
    }

    /**
     * Get maximum size (in characters).
     */
    int getMaxSize() {
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    maxSize = eswtGetMaxSize(control);
                }
            });
        }
        return maxSize;
    }

    /**
     * Get the preferred height (in pixels) of the text control.
     *
     * @param maxVisibleLines maximum visible lines
     */
    int getPreferredHeight(int maxVisibleLines) {
        // lineCount (1 .. max) * lineHeight
        return Math.min(Math.max(1, getLineCount()), maxVisibleLines)
                * getLineHeight();
    }

    /**
     * Get selected text content.
     */
    String getSelectedContent() {
        retSelectedStr = "";
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    retSelectedStr = eswtGetSelectedContent(control);
                }
            });
        }
        return retSelectedStr;
    }

    /**
     * Get content's length.
     */
    int getSize() {
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    size = eswtGetSize(control);
                }
            });
        }
        return size;
    }

    /**
     * Get visible top pixel position relative to whole content.
     */
    int getTopPixelPosition() {
        retTopPixel = 0;
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    if (control instanceof TextExtension) {
                        retTopPixel = ((TextExtension) control).getTopPixel();
                    }
                    // ConstrainedText does not scroll -> value is 0
                }
            });
        }
        return retTopPixel;
    }

    /**
     * Gets the width of this Text control (in pixels).
     */
    int getWidth() {
        return width;
    }

    /**
     * Insert text content.
     *
     * @param aText text
     * @param aPosition position where to instert
     */
    void insert(String aText, int aPosition) {
        if (aText == null) {
            throw new NullPointerException(
                    MsgRepository.TEXT_EXCEPTION_TXT_IS_NULL);
        }
        StringBuffer sb = new StringBuffer(getContent());
        if (aPosition < 0) {
            sb.insert(0, aText);
        }
        else if (aPosition > sb.length()) {
            sb.append(aText);
        }
        else {
            sb.insert(aPosition, aText);
        }
        setContent(sb.toString());
    }

    /**
     * Set background color.
     *
     * @param alpha alpha component (currently not used)
     * @param red color component
     * @param green color component
     * @param blue color component
     */
    void setBackgroundColor(final int alpha, final int red, final int green, final int blue) {
        ESWTUIThreadRunner.safeSyncExec(new Runnable() {
            public void run() {
                if (bgCol != null) {
                    bgCol.dispose();
                    bgCol = null;
                }
                bgCol = new Color(ESWTUIThreadRunner.getInstance().getDisplay(),
                        red, green, blue);
            }
        });
    }

    /**
     * Set the bounds of the Text control.
     *
     * @param aBounds bounding rectangle
     */
    void setBounds(Rectangle aBounds) {
        if (aBounds.width < 0 || aBounds.height < 0) {
            throw new IllegalArgumentException(
                    MsgRepository.TEXT_EXCEPTION_INVALID_SIZE);
        }
        x = aBounds.x;
        y = aBounds.y;
        width = aBounds.width;
        height = aBounds.height;
        if (control != null && width >= 0 && height >= 0) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    control.setBounds(x, y, width, height);
                }
            });
        }
    }

    /**
     * Set caret position.
     *
     * @param aPosition position
     */
    void setCaretposition(int aPosition) {
        caret = aPosition;
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    eswtSetSelection(control, caret, caret);
                }
            });
        }
    }

    /**
     * Set constraints. Note: this might reconstruct the eSWT text control.
     *
     * @param aConstraints text input constraints
     */
    void setConstraints(int aConstraints) {
        if (!isValidConstraints(aConstraints)) {
            throw new IllegalArgumentException(
                    MsgRepository.TEXT_EXCEPTION_INVALID_CONSTRAINTS);
        }
        constraints = aConstraints;
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    eswtRestoreStateAndCreate(eswtStoreStateAndDispose());
                }
            });
        }
    }

    /**
     * Set text content.
     *
     * @param aText new content
     */
    void setContent(String aText) {
        if (aText == null) {
            text = "";
        }
        else {
            if (aText.length() > maxSize) {
                throw new IllegalArgumentException(
                        MsgRepository.TEXT_EXCEPTION_MAX_SIZE_EXCEEDED);
            }
            if (!isValidText(aText, constraints)) {
                throw new IllegalArgumentException(
                        MsgRepository.TEXT_EXCEPTION_WRONG_TEXT);
            }
            text = aText;
        }
        size = text.length();
        caret = text.length();
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    eswtSetContent(control, text);
                    eswtSetSelection(control, caret, caret);
                }
            });
        }
    }

    /**
     * Set text font.
     *
     * @param aFont new font
     */
    void setFont(Font aFont) {
        font = aFont;
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    if (font != null) {
                        // set custom font
                        control.setFont(Font.getESWTFont(font));
                    }
                    else {
                        // set default font
                        control.setFont(
                                Font.getESWTFont(Font.getDefaultFont()));
                    }
                }
            });
        }
    }

    /**
     * Set this Text control focused.
     *
     * @param aFocused
     */
    void setFocused(boolean aFocused) {
        focused = aFocused;
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    eswtSetFocused(control, focused);
                }
            });
        }
    }

    /**
     * Set foreground color.
     *
     * @param alpha alpha component (currently not used)
     * @param red color component
     * @param green color component
     * @param blue color component
     */
    void setForegroundColor(final int alpha, final int red, final int green, final int blue) {
        ESWTUIThreadRunner.safeSyncExec(new Runnable() {
            public void run() {
                if (fgCol != null) {
                    fgCol.dispose();
                    fgCol = null;
                }
                fgCol = new Color(ESWTUIThreadRunner.getInstance().getDisplay(),
                        red, green, blue);
            }
        });
    }

    /**
     * Set input mode.
     *
     * @param inputMode
     */
    void setInputMode(String aInputMode) {
        inputMode = aInputMode;
        if (control != null && control instanceof TextExtension) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    eswtSetInputMode(control, inputMode, constraints);
                }
            });
        }
    }

    /**
     * Set maximum size (in characters).
     *
     * @param aMaxSize
     */
    void setMaxSize(int aMaxSize) {
        if (aMaxSize < 1) {
            throw new IllegalArgumentException(
                    MsgRepository.TEXT_EXCEPTION_INVALID_MAX_SIZE);
        }

        String content = getContent();
        if (content != null && aMaxSize < content.length()) {
            // we have to truncate content - validates the new text
            setContent(content.substring(0, aMaxSize));
        }

        maxSize = aMaxSize;
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    eswtSetMaxSize(control, maxSize);
                }
            });
        }
    }

    /**
     * Set the modify listener;
     *
     * @param aListener modify listener
     */
    void setModifyListener(final ModifyListener aListener) {
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    eswtRemoveModListener(control, modifyListener);
                    eswtAddModListener(control, aListener);
                }
            });
        }
        modifyListener = aListener;
    }

    /**
     * Set the selection listener.
     *
     * @param aListener selection listener
     */
    void setSelectionListener(final SelectionListener aListener) {
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    eswtRemoveSelListener(control, selectionListener);
                    eswtAddSelListener(control, aListener);
                }
            });
        }
        selectionListener = aListener;
    }

    /**
     * Set the location of the eSWT control.
     *
     * @param aX
     * @param aY
     */
    void setPosition(int aX, int aY) {
        x = aX;
        y = aY;
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    control.setLocation(x, y);
                }
            });
        }
    }

    /**
     * Set the selection in the eSWT text control.
     *
     * @param sta selection start
     * @param end selection end
     */
    void setSelection(final int sta, final int end) {
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    eswtSetSelection(control, sta, end);
                }
            });
        }
    }

    /**
     * Set the size of the eSWT control.
     *
     * @param width
     * @param height
     */
    void setSize(int aWidth, int aHeight) {
        if (aWidth < 0 || aHeight < 0) {
            throw new IllegalArgumentException(
                    MsgRepository.TEXT_EXCEPTION_INVALID_SIZE);
        }
        width = aWidth;
        height = aHeight;
        if (control != null && width >= 0 && height >= 0) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    control.setSize(width, height);
                }
            });
        }
    }

    /**
     * Set the visibility of the eSWT control.
     */
    void setVisible(boolean aVisible) {
        visible = aVisible;
        if (control != null) {
            ESWTUIThreadRunner.safeSyncExec(new Runnable() {
                public void run() {
                    control.setVisible(visible);
                }
            });
        }
    }

    /**
     * Restores a stored state and creates eSWT text control.
     *
     * @param parent parent composite
     */
    private void eswtRestoreStateAndCreate(Composite parent) {
        if (control == null) {
            control = eswtConstructText(parent, style, constraints);
            eswtSetInputMode(control, inputMode, constraints);
            eswtSetMaxSize(control, maxSize);
            eswtSetContent(control, text);
            eswtSetSelection(control, caret, caret);
            if (width >= 0 && height >= 0) {
                control.setBounds(x, y, width, height);
            }
            if (fgCol != null) {
                control.setForeground(fgCol);
            }
            if (bgCol != null) {
                control.setBackground(bgCol);
            }
            if (font != null) {
                control.setFont(Font.getESWTFont(font));
            }
            control.setVisible(visible);
            eswtSetFocused(control, focused);
            eswtAddModListener(control, modifyListener);
            eswtAddSelListener(control, selectionListener);
        }
    }

    /**
     * Stores the current state and disposes the eSWT text control.
     *
     * @return the control's parent composite.
     */
    private Composite eswtStoreStateAndDispose() {
        Composite parent = null;
        if (control != null) {
            parent = control.getParent();
            text = eswtGetContent(control);
            caret = eswtGetCaretPosition(control);
            eswtRemoveModListener(control, modifyListener);
            eswtRemoveSelListener(control, selectionListener);
            control.dispose();
            control = null;
        }
        return parent;
    }

    /**
     * Add modify listener.
     *
     * @param control text control
     * @param ltnr listener
     */
    static void eswtAddModListener(Control control, ModifyListener ltnr) {
        if (control != null && ltnr != null) {
            if (control instanceof TextExtension) {
                ((TextExtension) control).addModifyListener(ltnr);
            }
            else {
                ((ConstrainedText) control).addModifyListener(ltnr);
            }
        }
    }

    /**
     * Add selection listener.
     *
     * @param control text control
     * @param ltnr listener
     */
    static void eswtAddSelListener(Control control, SelectionListener ltnr) {
        if (control != null && ltnr != null) {
            if (control instanceof TextExtension) {
                ((TextExtension) control).addSelectionListener(ltnr);
            }
            else {
                ((ConstrainedText) control).addSelectionListener(ltnr);
            }
        }
    }

    /**
     * Construct text widget with given parameters.
     *
     * @param parent
     * @param aStyle
     * @param aConstraints
     * @return
     */
    static Control eswtConstructText(Composite parent, int aStyle, int aConstraints) {
        Control ret = null;

        int style = aStyle;
        int extractedFlag = aConstraints & ~TextField.CONSTRAINT_MASK;
        int extractedConstraint = aConstraints & TextField.CONSTRAINT_MASK;

        if ((extractedFlag & TextField.PASSWORD) == TextField.PASSWORD) {
            // Text class will remove incompatible flags for SINGLE
            style |= SWT.SINGLE | SWT.PASSWORD;
        }
        if ((extractedFlag & TextField.UNEDITABLE) == TextField.UNEDITABLE) {
            style |= SWT.READ_ONLY;
        }

        if (extractedConstraint == TextField.NUMERIC) {
            ret = new ConstrainedText(parent, style, ConstrainedText.NUMERIC);
        }
        else if (extractedConstraint == TextField.DECIMAL) {
            ret = new ConstrainedText(parent, style, ConstrainedText.DECIMAL);
        }
        else if (extractedConstraint == TextField.PHONENUMBER) {
            ret = new ConstrainedText(parent, style, ConstrainedText.PHONENUMBER);
        }
        else {
            ret = new TextExtension(parent, style);
        }
        return ret;
    }

    /**
     * Get caret position.
     *
     * @param control text control
     */
    static int eswtGetCaretPosition(Control control) {
        int ret = 0;
        if (control != null) {
            if (control instanceof TextExtension) {
                ret = ((TextExtension) control).getCaretPosition();
            }
            else {
                ret = ((ConstrainedText) control).getCaretPosition();
            }
        }
        return ret;
    }

    /**
     * Get caret line number.
     *
     * @param control text control
     */
    static int eswtGetCaretLine(Control control) {
        int ret = 0;
        if (control != null) {
            if (control instanceof TextExtension) {
                ret = ((TextExtension) control).getCaretLineNumber();
            }
        }
        return ret;
    }

    /**
     * Get content.
     *
     * @param control text control
     */
    static String eswtGetContent(Control control) {
        String ret = "";
        if (control != null) {
            if (control instanceof TextExtension) {
                ret = ((TextExtension) control).getText();
            }
            else {
                ret = ((ConstrainedText) control).getText();
            }
        }
        return ret;
    }

    /**
     * Get line count.
     *
     * @param control text control
     */
    static int eswtGetLineCount(Control control) {
        int ret = 1;
        if (control != null) {
            if (control instanceof TextExtension) {
                ret = ((TextExtension) control).getLineCount();
            }
        }
        return ret;
    }

    /**
     * Get line height.
     *
     * @param control text control
     */
    static int eswtGetLineHeight(Control control) {
        int ret = 0;
        if (control != null) {
            if (control instanceof TextExtension) {
                ret = ((TextExtension) control).getLineHeight();
            }
            else {
                ret = ((ConstrainedText) control).getSize().y;
            }
        }
        return ret;
    }

    /**
     * Get maximum content size.
     *
     * @param control text control
     */
    static int eswtGetMaxSize(Control control) {
        int ret = 0;
        if (control != null) {
            if (control instanceof TextExtension) {
                ret = ((TextExtension) control).getTextLimit();
            }
            else {
                ret = ((ConstrainedText) control).getTextLimit();
            }
        }
        return ret;
    }

    /**
     * Get selected content.
     *
     * @param control text control
     */
    static String eswtGetSelectedContent(Control control) {
        String ret = "";
        if (control != null) {
            if (control instanceof TextExtension) {
                ret = ((TextExtension) control).getSelectionText();
            }
            else {
                // TODO: eSWT support required - get selection in ConstrainedText
                ret = ((ConstrainedText) control).getText();
            }
        }
        return ret;
    }

    /**
     * Get content size.
     *
     * @param control text control
     */
    static int eswtGetSize(Control control) {
        int ret = 0;
        if (control != null) {
            if (control instanceof TextExtension) {
                ret = ((TextExtension) control).getCharCount();
            }
            else {
                ret = ((ConstrainedText) control).getCharCount();
            }
        }
        return ret;
    }

    /**
     * Remove modify listener.
     *
     * @param control text control
     * @param ltnr listener
     */
    static void eswtRemoveModListener(Control control, ModifyListener ltnr) {
        if (control != null && ltnr != null) {
            if (control instanceof TextExtension) {
                ((TextExtension) control).removeModifyListener(ltnr);
            }
            else {
                ((ConstrainedText) control).removeModifyListener(ltnr);
            }
        }
    }

    /**
     * Remove modify listener.
     *
     * @param control text control
     * @param ltnr listener
     */
    static void eswtRemoveSelListener(Control control, SelectionListener ltnr) {
        if (control != null && ltnr != null) {
            if (control instanceof TextExtension) {
                ((TextExtension) control).removeSelectionListener(ltnr);
            }
            else {
                ((ConstrainedText) control).removeSelectionListener(ltnr);
            }
        }
    }

    /**
     * Set content.
     *
     * @param control text control
     * @param text content
     */
    static void eswtSetContent(Control control, String text) {
        if (control != null) {
            if (control instanceof TextExtension) {
                ((TextExtension) control).setText(text);
            }
            else {
                ((ConstrainedText) control).setText(text);
            }
        }
    }

    /**
     * Set text control focus on/off.
     *
     * @param control text control
     * @param focus
     */
    static void eswtSetFocused(Control control, boolean focus) {
        if (control != null) {
            if (focus) {
                control.setFocus();
            }
            else {
                control.getParent().forceFocus();
            }
        }
    }

    /**
     * Set input mode.
     *
     * @param control text control
     * @param inputMode input mode
     * @param aConstraints constraints
     */
    static void eswtSetInputMode(Control control, String inputMode,
            int aConstraints) {
        if (control != null && control instanceof TextExtension) {
            TextExtension te = (TextExtension) control;
            int capitalize = getCapitalize(aConstraints);
            if (inputMode == null) {
                te.setInitialInputMode(TextExtension.TEXTCASE,
                        "UCB_BASIC_LATIN");
            }
            else if (inputMode.equals("MIDP_UPPERCASE_LATIN")) {
                if (capitalize > 0 && !isUrlEmailSet(aConstraints)) {
                    te.setInitialInputMode(capitalize, "UCB_BASIC_LATIN");
                }
                else {
                    te.setInitialInputMode(TextExtension.UPPERCASE,
                            "UCB_BASIC_LATIN");
                }
            }
            else if (inputMode.equals("MIDP_LOWERCASE_LATIN")) {
                if (capitalize > 0 && !isUrlEmailSet(aConstraints)) {
                    te.setInitialInputMode(capitalize, "UCB_BASIC_LATIN");
                }
                else {
                    te.setInitialInputMode(TextExtension.LOWERCASE,
                            "UCB_BASIC_LATIN");
                }
            }
            else {
                te.setInitialInputMode(TextExtension.TEXTCASE, inputMode);
            }
        }
    }

    /**
     * Set maximum size.
     *
     * @param control text control
     * @param maxSize maximum size
     */
    static void eswtSetMaxSize(Control control, int maxSize) {
        if (control != null) {
            if (control instanceof TextExtension) {
                ((TextExtension) control).setTextLimit(maxSize);
            }
            else {
                ((ConstrainedText) control).setTextLimit(maxSize);
            }
        }
    }

    /**
     * Set selection.
     *
     * @param control text control
     * @param sta start index
     * @param end end index
     */
    static void eswtSetSelection(Control control, int sta, int end) {
        if (control != null) {
            if (control instanceof TextExtension) {
                ((TextExtension) control).setSelection(sta, end);
            }
            else {
                ((ConstrainedText) control).setSelection(sta, end);
            }
        }
    }

    /**
     * Update vertical scroll bar.
     *
     * @param control text control
     */
    static void eswtUpdateVScrollbar(Control control) {
        if (control != null) {
            if ((control.getStyle() & SWT.V_SCROLL) == SWT.V_SCROLL) {
                if (control instanceof TextExtension) {
                    TextExtension te = (TextExtension) control;
                    ScrollBar sb = te.getVerticalBar();
                    if (sb != null) {
                        int height = te.getLineCount() * te.getLineHeight();
                        sb.setVisible(te.getSize().y < height);
                    }
                }
            }
        }
    }

    /**
     * Get eSWT capitalize style flags for TextExtension.
     *
     * @param aConstraints constraints
     */
    static int getCapitalize(int aConstraints) {
        int ret = 0;
        int extractedFlag = aConstraints & ~TextField.CONSTRAINT_MASK;
        if ((extractedFlag & TextField.INITIAL_CAPS_WORD)
                == TextField.INITIAL_CAPS_WORD) {
            ret = TextExtension.TITLECASE;
        }
        if ((extractedFlag & TextField.INITIAL_CAPS_SENTENCE)
                == TextField.INITIAL_CAPS_SENTENCE) {
            ret = TextExtension.TEXTCASE;
        }
        return ret;
    }

    /**
     * Is Url or Email constraints flags set.
     *
     * @param aConstraints constraints
     */
    static boolean isUrlEmailSet(int aConstraints) {
        int extractedConstraint = aConstraints & TextField.CONSTRAINT_MASK;
        return (extractedConstraint == TextField.EMAILADDR
                || extractedConstraint == TextField.URL);
    }

    /**
     * Validates input constraints.
     *
     * @param aConstraints constraints to check.
     * @return true if constraints are OK, false otherwise.
     */
    static boolean isValidConstraints(int aConstraints) {
        int smallestFlag;
        int highestFlag;
        smallestFlag = TextField.PASSWORD - 1;
        highestFlag = TextField.PASSWORD + TextField.UNEDITABLE
                + TextField.SENSITIVE + TextField.NON_PREDICTIVE
                + TextField.INITIAL_CAPS_WORD + TextField.INITIAL_CAPS_SENTENCE
                + 1;

        int typeConstraint = getTypeConstraint(aConstraints);
        if (typeConstraint == TextField.ANY
                || typeConstraint == TextField.EMAILADDR
                || typeConstraint == TextField.NUMERIC
                || typeConstraint == TextField.PHONENUMBER
                || typeConstraint == TextField.DECIMAL
                || typeConstraint == TextField.URL) {
            int extractedFlag = aConstraints & ~TextField.CONSTRAINT_MASK;
            if (extractedFlag == 0
                    || ((extractedFlag > smallestFlag)
                         && (extractedFlag < highestFlag))) {
                return true;
            }
        }
        return false;
    }

    /**
     * Get constraint type.
     *
     * @param aConstraints constraints
     */
    static int getTypeConstraint(int aConstraints) {
        return aConstraints & TextField.CONSTRAINT_MASK;
    }

    /**
     * Checks if the text meets the requirements from constraint.
     *
     * @param aText
     * @return
     */
    static boolean isValidText(String aText, int aConstraints) {
        return TextFieldLayouter.checkText(aConstraints, aText);
    }

}