javauis/lcdui_akn/javalcdui/javasrc.nokialcdui/com/nokia/mid/ui/TextEditorImpl.java
branchRCL_3
changeset 14 04becd199f91
child 17 0fd27995241b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_akn/javalcdui/javasrc.nokialcdui/com/nokia/mid/ui/TextEditorImpl.java	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,656 @@
+/* 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 private class implementing the S40 and S60 interfaces
+ * for TextEditor
+ *
+ */
+
+// PACKAGE
+package com.nokia.mid.ui;
+
+// INTERNAL IMPORTS
+import com.nokia.mid.ui.impl.LCDUIPackageInvoker;
+import com.nokia.mid.ui.impl.TextEditorListenerImpl;
+import com.nokia.mid.ui.impl.TextEditorContainer;
+
+// EXTERNAL IMPORTS
+import com.nokia.mj.impl.rt.legacy.NativeError;
+import com.nokia.mj.impl.rt.legacy.ToolkitInvoker;
+import javax.microedition.lcdui.Canvas;
+
+/*
+ *
+ *
+ * @since 1.4
+ */
+class TextEditorImpl
+        extends com.nokia.mid.ui.TextEditor
+        implements com.nokia.mid.ui.S60TextEditor
+{
+    /*
+     * Indicates that all input methods are available.
+     * <p>
+     * Can be used in {@link #setDisabledTouchInputModes}.
+     */
+    public static final int TOUCH_INPUT_ALL_AVAILABLE   = 0;
+
+    /*
+     *  Handwriting recognition
+     */
+    public static final int TOUCH_INPUT_HWR             = 1;
+
+    /*
+     *  Virtual QWERTY keyboard
+     */
+    public static final int TOUCH_INPUT_VKB             = 2;
+
+    /*
+     *  Full screen QWERTY keyboard
+     */
+    public static final int TOUCH_INPUT_FSQ             = 4;
+
+    /*
+     *  Alphanumeric keyboard with ITU-T input
+     */
+    public static final int TOUCH_INPUT_ITUT            = 8;
+
+    /*
+     *  Full screen handwriting recognition
+     */
+    public static final int TOUCH_INPUT_FSC             = 16;
+
+    /*
+     *  Mini ITU-T for Japanese devices
+     */
+    public static final int TOUCH_INPUT_MINI_ITUT       = 32;
+
+    // Private static data.
+    private static final int INDICATOR_SIZE_COUNT       = 2;
+
+    // Mask of all bits defined
+    private static final int MASK =
+        TOUCH_INPUT_HWR | TOUCH_INPUT_VKB | TOUCH_INPUT_FSQ |
+        TOUCH_INPUT_ITUT | TOUCH_INPUT_FSC | TOUCH_INPUT_MINI_ITUT;
+
+    /*
+     * <P>
+     * Creates a new <code>TextEditor</code> object with the given initial contents,
+     * maximum size in characters, constraints and editor size in pixels.
+     * </P>
+     *
+     * <P>
+     * If the text parameter is <code>null</code>, the <code>TextEditor</code> is
+     * created empty.
+     * </P>
+     *
+     * <P>
+     * The <code>maxSize</code> parameter must be greater than zero. An
+     * <code>IllegalArgumentException</code> is thrown if the length of the initial
+     * contents string exceeds <code>maxSize</code>. However, the implementation
+     * may assign a maximum size smaller than the application had requested. If
+     * this occurs, and if the length of the contents exceeds the newly assigned
+     * maximum size, the contents are truncated from the end in order to fit,
+     * and no exception is thrown.
+     * </P>
+     *
+     * @param aText
+     *            the initial contents, or <code>null</code> if the
+     *            <code>TextEditor</code> is to be created empty
+     * @param aMaxSize
+     *            the maximum capacity in characters
+     * @param aConstraints
+     *            see the input constraints in <code>TextField</code></a>
+     * @param aWidth
+     *            the width of the bounding box, in pixels
+     * @param aHeight
+     *            the height of the bounding box, in pixels
+     *
+     * @throws IllegalArgumentException
+     *             if <code>aMaxSize</code> is zero or less
+     * @throws IllegalArgumentException
+     *             if the value of the constraints parameter is invalid
+     * @throws IllegalArgumentException
+     *             if <code>aText</code> is illegal for the specified
+     *             constraints
+     * @throws IllegalArgumentException
+     *             if the length of the string exceeds the requested maximum
+     *             capacity
+     * @throws IllegalArgumentException
+     *             if the width or height is less than one pixel
+     */
+    TextEditorImpl(String aText, int aMaxSize, int aConstraints, int aWidth,
+                   int aHeight)
+    {
+        super(aText, aMaxSize, aConstraints, aWidth, aHeight, false);
+    }
+
+    /*
+     * <P>
+     * Creates a new empty <code>TextEditor</code> with the given maximum size in
+     * characters, constraints and editor size as number of visible rows.
+     * </P>
+     *
+     * <P>
+     * The <code>rows</code> parameter indicates the requested number of visible
+     * rows in the editor. TextEditor then assigns the initial
+     * height for the editor based on the requested number of rows and width of the
+     * editor.
+     * </P>
+     *
+     * <P>
+     * The <code>maxSize</code> parameter must be greater than zero. An
+     * <code>IllegalArgumentException</code> is thrown if the length of the initial
+     * contents string exceeds <code>maxSize</code>. However, the implementation
+     * may assign a maximum size smaller than the application had requested. If
+     * this occurs, and if the length of the contents exceeds the newly assigned
+     * maximum size, the contents are truncated from the end in order to fit,
+     * and no exception is thrown.
+     * </P>
+     *
+     * @param aMaxSize
+     *            the maximum capacity in characters
+     * @param aConstraints
+     *            see the input constraints in <code>TextField</code></a>
+     * @param aWidth
+     *            the width of the bounding box, in pixels
+     * @param aRows
+     *            the requested number of visible rows in the editor
+     *
+     * @throws IllegalArgumentException
+     *             if <code>aMaxSize</code> or <code>rows</code> is zero or less
+     * @throws IllegalArgumentException
+     *             if the value of the constraints parameter is invalid
+     * @throws IllegalArgumentException
+     *             if the width is less than one pixel
+     */
+    TextEditorImpl(int aMaxSize, int aConstraints, int aWidth, int aRows)
+    {
+        super(null, aMaxSize, aConstraints, aWidth, aRows, true);
+    }
+
+    /*
+     * Set the parent object of this TextEditor. Typically in LCDUI the parent
+     * object would be Canvas or CustomItem. Setting the parameter to null
+     * removes the association to the parent.
+     * <p>
+     * @param aParent the parent object
+     * <p>
+     * @throws IllegalArgumentException
+     *              if <code>aParent</code> is not a valid object with which a
+     *              TextEditor can be associated
+     */
+    public void setParent(Object aParent)
+    {
+        super.setParent(aParent);
+        // Update indicator location to their default position.
+        if (aParent != null)
+        {
+            setDefaultIndicators();
+        }
+    }
+
+    /*
+     * <P>
+     * If the default indicator location is not used then sets the drawing
+     * location for input indicators relative to the <code>TextEditor</code>'s
+     * parent.
+     * </P>
+     *
+     * <P>
+     * The anchor point given is relative to the upper left corner of the
+     * <code>Canvas</code>. The location may be outside the
+     * <code>TextEditor</code> boundaries. The z-order of the indicators is the
+     * same as <code>TextEditor</code> textual content. If indicators and the
+     * editor content overlap indicators are rendered on top of the editor
+     * content.
+     * </P>
+     *
+     * <P>
+     * The application should first query the size of the input indicators with
+     * {@link #getIndicatorSize} method to determine that the indicators will
+     * not be clipped outside the available display area when drawn to the
+     * requested location.
+     * </P>
+     *
+     * <P>
+     * If there are no indicators present, the usability of complex device
+     * specific input methods may be compromised.
+     * </P>
+     *
+     * @param x
+     *            the x coordinate of the anchor point, in pixels.
+     * @param y
+     *            the y coordinate of the anchor point, in pixels.
+     *
+     */
+    public void setIndicatorLocation(int x, int y)
+    {
+        synchronized (iToolkit)
+        {
+            NativeError.check(_setIndicatorLocation(getToolkitHandle(),
+                                                    iHandle, x, y));
+        }
+    }
+
+    /*
+     * <P>
+     * Resets the implementation provided input indicators to their default
+     * position.
+     * </P>
+     *
+     * <P>
+     * This position may be outside the area of parent in case the default
+     * position is in status area. In this case if the status area is missing
+     * (full screen mode Canvas) the default position is inside the parent area
+     * e.g. on top of the editor. When default position is in use the
+     * <code>TextEditor</code> automatically positions the indicators relative
+     * to the <code>TextEditor</code> even when <code>TextEditor</code> location
+     * is changed. However, client is responsible of making sure indicators are
+     * visible inside the parent area positioning <code>TextEditor</code> so
+     * that indicators fit to the visible area e.g. on top of the
+     * <code>TextEditor</code>. Positioning <code>TextEditor</code> directly on
+     * top of <code>Canvas</code> may mean that indicators in the default
+     * position are not visible.
+     * </P>
+     *
+     * @throws IllegalStateException
+     *             If the <code>TextEditor</code> is not added to
+     *             <code>Canvas</code>
+     */
+    public void setDefaultIndicators()
+    {
+        synchronized (iToolkit)
+        {
+            Object parent = getParent();
+            boolean fullScreen = false;
+
+            if (parent instanceof Canvas)
+            {
+                fullScreen = iLCDUIPackageInvoker.isFullScreen((Canvas) parent);
+            }
+
+            NativeError.check(_setDefaultIndicators(getToolkitHandle(),
+                                                    iHandle, fullScreen));
+        }
+    }
+
+    /*
+     * <P>
+     * By default indicators visibility is set to <code>true</code> and they are
+     * made visible when the associated <code>TextEditor</code> is focused.
+     * </P>
+     * <P>
+     * If the application controls the position of the indicators, those can be
+     * explicitly made not visible by calling
+     * <code>setIndicatorVisibility(false)</code>. Indicators are never visible
+     * if <code>TextEditor</code> itself is not visible so having indicator
+     * visibility set to <code>true</code> does not make them visible unless
+     * editor itself is set visible.
+     * </P>
+     *
+     * @param visible
+     *            controls indicator visibility state
+     *
+     * @see #setIndicatorLocation(int, int)
+     * @see #setDefaultIndicators()
+     */
+    public void setIndicatorVisibility(boolean visible)
+    {
+        synchronized (iToolkit)
+        {
+            NativeError.check(_setIndicatorVisibility(getToolkitHandle(),
+                              iHandle, visible));
+        }
+    }
+
+    /*
+     * Gets the size of the area needed for drawing the input indicators.
+     * <p>
+     * The returned array contains two integers for width (array index 0) and
+     * height (array index 1) of the indicator graphics. Size (0,0) is returned
+     * if the device UI does not use any input indicators in the text editors or
+     * if the indicators are curretly positioned outside parent area e.g. in
+     * status area. This happens if {@link #setIndicatorLocation(int, int)
+     * setIndicatorLocation(int x, int y)} has not been ever called for the
+     * editor, or if {@link #setDefaultIndicators() setDefaultIndicators()} has
+     * been called.
+     * <p>
+     *
+     * @return the width and height of area needed for drawing input indicators
+     * @see #setDefaultIndicators()
+     */
+    public int[] getIndicatorSize()
+    {
+        int[] size = new int[INDICATOR_SIZE_COUNT];
+
+        synchronized (iToolkit)
+        {
+            NativeError.check(_getIndicatorSize(getToolkitHandle(), iHandle,
+                                                size));
+        }
+        return size;
+    }
+
+    /*
+     * Disables one or multiple touch input modes from use.
+     * <p>
+     * User is not able to switch to the disable touch input modes. Multiple
+     * touch input modes may be combined together in <code>touchInputMode</code>
+     * parameter using bitwise or operator. The method does not have any impact
+     * if called in non-touch device. A device may not support all touch input
+     * modes specified. Specifying not supported input modes is silently
+     * ignored.
+     * <p>
+     * The possible values are defined in the class with TOUCH_INPUT_* starting
+     * constant values.
+     * <p>
+     *
+     * @param touchInputModes
+     *            bitwise or combined list of disabled touch input modes
+     * @throws IllegalArgumentException
+     *             if the given input modes are not valid.
+     *             <p>
+     * @see #setPreferredTouchMode(int)
+     * @see #getDisabledTouchInputModes()
+     */
+    public void setDisabledTouchInputModes(int touchInputModes)
+    {
+        // Validate touch input modes. There must not be additional modes
+        // 0 is valid.
+        // See com.nokia.mid.ui.s60.TextEditor.TOUCH_INPUT_ALL_AVAILABLE.
+        if ((touchInputModes & ~MASK) != 0)
+        {
+            throw new IllegalArgumentException();
+        }
+
+        synchronized (iToolkit)
+        {
+            NativeError.check(_setDisabledTouchInputModes(getToolkitHandle(),
+                              iHandle, touchInputModes));
+        }
+    }
+
+    /*
+     * By default all supported touch input modes are available. Returns the
+     * disabled touch input modes set with {@link #setDisabledTouchInputModes}.
+     * <p>
+     * Note that the disabled touch input modes may be device specific so this
+     * method may return some modes as disabled by default.
+     * <p>
+     * Note that if the device does not support touch input this method returns
+     * all modes.
+     * <p>
+     *
+     * @return The disabled touch input modes.
+     * @see #setDisabledTouchInputModes(int)
+     * @see #setPreferredTouchMode(int)
+     */
+    public int getDisabledTouchInputModes()
+    {
+        int disabled = 0;
+
+        synchronized (iToolkit)
+        {
+            disabled = _getDisabledTouchInputModes(getToolkitHandle(), iHandle);
+        }
+
+        NativeError.check(disabled);
+        return disabled;
+    }
+
+    /*
+     * Set the preferred touch input mode overriding the device default
+     * preferred mode. User may still change the touch input mode from touch
+     * input window to all available modes.
+     * <p>
+     * The possible values are defined in the class with TOUCH_INPUT_* starting
+     * constant values.
+     * <p>
+     * Note that if the device does not support touch input this method has no
+     * effect.
+     * <p>
+     *
+     * @param touchInputModes
+     *            a touch input mode to be set as preferred one.
+     * @throws IllegalArgumentException
+     *             if the input mode is not valid or if it contains multiple
+     *             input modes as bit mask.
+     * @see #setDisabledTouchInputModes(int)
+     * @see #getPreferredTouchMode()
+     *
+     */
+    public void setPreferredTouchMode(int touchInputModes)
+    {
+        int mask = touchInputModes & MASK;
+        // Validate touch input mode.
+        if (touchInputModes == 0 || (touchInputModes & ~MASK) != 0
+                || (mask & (mask - 1)) != 0)
+        {
+            throw new IllegalArgumentException();
+        }
+
+        synchronized (iToolkit)
+        {
+            NativeError.check(_setPreferredTouchMode(getToolkitHandle(),
+                              iHandle, touchInputModes));
+        }
+    }
+
+    /*
+     * Gets the preferred touch input mode.
+     * <p>
+     * Note that if the device does not support touch input this method returns
+     * <code>0</code>
+     * <p>
+     *
+     * @return The preferred touch input mode.
+     *         <p>
+     * @see #setPreferredTouchMode(int)
+     * @see #setDisabledTouchInputModes(int)
+     */
+    public int getPreferredTouchMode()
+    {
+        int preferredMode = 0;
+
+        synchronized (iToolkit)
+        {
+            preferredMode = _getPreferredTouchMode(getToolkitHandle(), iHandle);
+        }
+
+        NativeError.check(preferredMode);
+        return preferredMode;
+    }
+
+    /*
+     * Sets the caret in the Editor at x, y location.
+     *
+     * @param x
+     *      The x coordinate of the wanted caret position.
+     *
+     * @param y
+     *      The y coordinate of the wanted caret position.
+     */
+    public void setCaretXY(int x, int y)
+    {
+        synchronized (iToolkit)
+        {
+            NativeError.check(_setCaretXY(getToolkitHandle(), iHandle, x, y));
+        }
+    }
+
+    /*
+     * Hidden default constructor.
+     */
+    private TextEditorImpl()
+    {
+    }
+
+    // Private methods.
+
+    /*
+     * Sets the visibility status of the indicator of the editor.
+     *
+     * @param aToolkitHandle A handle to the LCDUI toolkit.
+     *
+     * @param aNativePeerHandle A handle to the native side peer object.
+     *
+     * @param aVisible The visibility status of the indicator.
+     *
+     * @return NativeError.KErrNone if the operation was successful. Otherwise,
+     * a system-wide error code is returned.
+     */
+    private native int _setIndicatorVisibility(
+        int aToolkitHandle,
+        int aNativePeerHandle,
+        boolean aVisible);
+
+    /*
+     * Sets the position of the indicator.
+     *
+     * @param aToolkitHandle A handle to the LCDUI toolkit.
+     *
+     * @param aNativePeerHandle A handle to the native side peer object.
+     *
+     * @param aX The x coordinate of the anchor point.
+     *
+     * @param aY The y coordinate of the anchor point.
+     *
+     * @return NativeError.KErrNone if the operation was successful. Otherwise,
+     * a system-wide error code is returned.
+     */
+    private native int _setIndicatorLocation(
+        int aToolkitHandle,
+        int aNativePeerHandle,
+        int aX,
+        int aY);
+
+    /*
+     * Gets the size of the area needed for drawing the input indicators.
+     *
+     * @param aToolkitHandle A handle to the LCDUI toolkit.
+     *
+     * @param aNativePeerHandle A handle to the native side peer object.
+     *
+     * @param aSize On return, contains the size of the indicator (w,h).
+     *
+     * @return NativeError.KErrNone if the operation was successful. Otherwise,
+     * a system-wide error code is returned.
+     */
+    private native int _getIndicatorSize(
+        int aToolkitHandle,
+        int aNativePeerHandle,
+        int[] aSize);
+
+    /*
+     * Resets the default input indicators to be used.
+     *
+     * @param aToolkitHandle A handle to the LCDUI toolkit.
+     *
+     * @param aNativePeerHandle A handle to the native side peer object.
+     *
+     * @param aParentFullScreen Indicates if parent is the size of the whole
+     * screen.
+     *
+     * @return NativeError.KErrNone if the operation was successful. Otherwise,
+     * a system-wide error code is returned.
+     */
+    private native int _setDefaultIndicators(
+        int aToolkitHandle,
+        int aNativePeerHandle,
+        boolean aParentFullScreen);
+
+    /*
+     * Sets the disabled touch input modes.
+     *
+     * @param aToolkitHandle A handle to the LCDUI toolkit.
+     *
+     * @param aNativePeerHandle A handle to the native side peer object.
+     *
+     * @param aTouchInputModes The disabled touch input modes.
+     *
+     * @return NativeError.KErrNone if the operation was successful. Otherwise,
+     * a system-wide error code is returned.
+     */
+    private native int _setDisabledTouchInputModes(
+        int aToolkitHandle,
+        int aNativePeerHandle,
+        int aTouchInputModes);
+
+    /*
+     * Gets the disabled touch input mode.
+     *
+     * @param aToolkitHandle A handle to the LCDUI toolkit.
+     *
+     * @param aNativePeerHandle A handle to the native side peer object.
+     *
+     * @param aTouchInputMode The preferred touch input mode.
+     *
+     * @return The disabled touch input modes if the operation was successful.
+     * Otherwise, a system-wide error code is returned.
+     */
+    private native int _getDisabledTouchInputModes(
+        int aToolkitHandle,
+        int aNativePeerHandle);
+
+    /*
+     * Sets the preferred touch input mode.
+     *
+     * @param aToolkitHandle A handle to the LCDUI toolkit.
+     *
+     * @param aNativePeerHandle A handle to the native side peer object.
+     *
+     * @param aTouchInputMode The preferred touch input mode.
+     *
+     * @return NativeError.KErrNone if the operation was successful. Otherwise,
+     * a system-wide error code is returned.
+     */
+    private native int _setPreferredTouchMode(
+        int aToolkitHandle,
+        int aNativePeerHandle,
+        int aTouchInputMode);
+
+    /*
+     * Gets the preferred touch input mode.
+     *
+     * @param aToolkitHandle A handle to the LCDUI toolkit.
+     *
+     * @param aNativePeerHandle A handle to the native side peer object.
+     *
+     * @return The preferred touch input mode if the operation was successful.
+     * Otherwise, a system-wide error code is returned.
+     */
+    private native int _getPreferredTouchMode(
+        int aToolkitHandle,
+        int aNativePeerHandle);
+
+    /*
+     * Sets the caret in the Editor at x, y location.
+     *
+     * @param aToolkitHandle A handle to the LCDUI toolkit.
+     *
+     * @param aNativePeerHandle A handle to the native side peer object.
+     *
+     * @param x
+     *      The x coordinate of the wanted caret position.
+     *
+     * @param y
+     *      The y coordinate of the wanted caret position.
+     */
+    public native int _setCaretXY(
+        int aToolkitHandle,
+        int aNativePeerHandle,
+        int x,
+        int y);
+}
+
+// End of file