com.google.gwt.user.client.ui.RichTextArea.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gwt.user.client.ui.RichTextArea.java

Source

/*
 * Copyright 2007 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.user.client.ui;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.HasInitializeHandlers;
import com.google.gwt.event.logical.shared.InitializeEvent;
import com.google.gwt.event.logical.shared.InitializeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.safehtml.client.HasSafeHtml;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.user.client.ui.impl.RichTextAreaImpl;

/**
 * A rich text editor that allows complex styling and formatting.
 * 
 * Because some browsers do not support rich text editing, and others support
 * only a limited subset of functionality, there are two formatter interfaces,
 * accessed via {@link #getBasicFormatter()} and {@link #getExtendedFormatter()}
 * . A browser that does not support rich text editing at all will return
 * <code>null</code> for both of these, while one that supports only the basic
 * functionality will return <code>null</code> for the latter.
 * 
 * <p>
 * <img class='gallery' src='doc-files/RichTextArea.png'/>
 * </p>
 * 
 * <h3>CSS Style Rules</h3> 
 * <dl>
 *   <dt>.gwt-RichTextArea</dt>
 *   <dd>Applied to the rich text element.</dd>
 * </dl>
 */
public class RichTextArea extends FocusWidget implements HasHTML, HasInitializeHandlers, HasSafeHtml {

    /**
     * <p>
     * This interface is used to access basic formatting options, when available.
     * If the implementation supports basic formatting, then
     * {@link RichTextArea#getBasicFormatter()} will return an instance of this
     * class.
     * </p>
     * <p>
     * The formatter will format the user selected text in the
     * {@link RichTextArea}. As a result, it will only work reliably if the
     * {@link RichTextArea} is attached, visible to on the page, and has been
     * focused at least once. If you just want to initialize the content of the
     * {@link RichTextArea}, use {@link RichTextArea#setHTML(String)} instead.
     * </p>
     * 
     * @deprecated use {@link RichTextArea.Formatter} instead
     */
    @Deprecated
    public interface BasicFormatter {

        /**
         * Gets the background color.
         * 
         * @return the background color
         */
        String getBackColor();

        /**
         * Gets the foreground color.
         * 
         * @return the foreground color
         */
        String getForeColor();

        /**
         * Is the current region bold?
         * 
         * @return true if the current region is bold
         */
        boolean isBold();

        /**
         * Is the current region italic?
         * 
         * @return true if the current region is italic
         */
        boolean isItalic();

        /**
         * Is the current region subscript?
         * 
         * @return true if the current region is subscript
         */
        boolean isSubscript();

        /**
         * Is the current region superscript?
         * 
         * @return true if the current region is superscript
         */
        boolean isSuperscript();

        /**
         * Is the current region underlined?
         * 
         * @return true if the current region is underlined
         */
        boolean isUnderlined();

        /**
         * Selects all the text.
         */
        void selectAll();

        /**
         * Sets the background color.
         * 
         * @param color the new background color
         */
        void setBackColor(String color);

        /**
         * Sets the font name.
         * 
         * @param name the new font name
         */
        void setFontName(String name);

        /**
         * Sets the font size.
         * 
         * @param fontSize the new font size
         */
        void setFontSize(FontSize fontSize);

        /**
         * Sets the foreground color.
         * 
         * @param color the new foreground color
         */
        void setForeColor(String color);

        /**
         * Sets the justification.
         * 
         * @param justification the new justification
         */
        void setJustification(Justification justification);

        /**
         * Toggles bold.
         */
        void toggleBold();

        /**
         * Toggles italic.
         */
        void toggleItalic();

        /**
         * Toggles subscript.
         */
        void toggleSubscript();

        /**
         * Toggles superscript.
         */
        void toggleSuperscript();

        /**
         * Toggles underline.
         */
        void toggleUnderline();
    }

    /**
     * <p>
     * This interface is used to access full formatting options, when available.
     * If the implementation supports full formatting, then
     * {@link RichTextArea#getExtendedFormatter()} will return an instance of this
     * class.
     * </p>
     * <p>
     * The formatter will format the user selected text in the
     * {@link RichTextArea}. As a result, it will only work reliably if the
     * {@link RichTextArea} is attached, visible to on the page, and has been
     * focused at least once. If you just want to initialize the content of the
     * {@link RichTextArea}, use {@link RichTextArea#setHTML(String)} instead.
     * </p>
     * 
     * @deprecated use {@link RichTextArea.Formatter} instead
     */
    @Deprecated
    public interface ExtendedFormatter extends BasicFormatter {

        /**
         * Creates a link to the supplied URL.
         * 
         * @param url the URL to be linked to
         */
        void createLink(String url);

        /**
         * Inserts a horizontal rule.
         */
        void insertHorizontalRule();

        /**
         * Inserts an image element.
         * 
         * @param url the url of the image to be inserted
         */
        void insertImage(String url);

        /**
         * Starts an numbered list. Indentation will create nested items.
         */
        void insertOrderedList();

        /**
         * Starts an bulleted list. Indentation will create nested items.
         */
        void insertUnorderedList();

        /**
         * Is the current region strikethrough?
         * 
         * @return true if the current region is strikethrough
         */
        boolean isStrikethrough();

        /**
         * Left indent.
         */
        void leftIndent();

        /**
         * Removes all formatting on the selected text.
         */
        void removeFormat();

        /**
         * Removes any link from the selected text.
         */
        void removeLink();

        /**
         * Right indent.
         */
        void rightIndent();

        /**
         * Toggles strikethrough.
         */
        void toggleStrikethrough();
    }

    /**
     * Font size enumeration. Represents the seven basic HTML font sizes, as
     * defined in CSS.
     */
    public static class FontSize {

        /**
         * Represents a Large font.
         */
        public static final FontSize LARGE = new FontSize(5);

        /**
         * Represents a Medium font.
         */
        public static final FontSize MEDIUM = new FontSize(4);

        /**
         * Represents a Small font.
         */
        public static final FontSize SMALL = new FontSize(3);

        /**
         * Represents an X-Large font.
         */
        public static final FontSize X_LARGE = new FontSize(6);

        /**
         * Represents an X-Small font.
         */
        public static final FontSize X_SMALL = new FontSize(2);

        /**
         * Represents an XX-Large font.
         */
        public static final FontSize XX_LARGE = new FontSize(7);

        /**
         * Represents an XX-Small font.
         */
        public static final FontSize XX_SMALL = new FontSize(1);

        private int number;

        private FontSize(int number) {
            this.number = number;
        }

        /**
         * Gets the HTML font number associated with this font size.
         * 
         * @return an integer from 1 to 7 inclusive
         */
        public int getNumber() {
            return number;
        }

        @Override
        public String toString() {
            return Integer.toString(number);
        }
    }

    /**
     * <p>
     * This interface is used to access full formatting options, when available.
     * If the implementation supports full formatting, then
     * {@link RichTextArea#getFormatter()} will return an instance of this class.
     * </p>
     * <p>
     * The formatter will format the user selected text in the
     * {@link RichTextArea}. As a result, it will only work reliably if the
     * {@link RichTextArea} is attached, visible to on the page, and has been
     * focused at least once. If you just want to initialize the content of the
     * {@link RichTextArea}, use {@link RichTextArea#setHTML(String)} instead.
     * </p>
     */
    public interface Formatter extends ExtendedFormatter {
        /**
         * Creates a link to the supplied URL.
         * 
         * @param url the URL to be linked to
         */
        void createLink(String url);

        /**
         * Gets the background color.
         * 
         * @return the background color
         */
        String getBackColor();

        /**
         * Gets the foreground color.
         * 
         * @return the foreground color
         */
        String getForeColor();

        /**
         * Inserts a horizontal rule.
         */
        void insertHorizontalRule();

        /**
         * Inserts generic html.
         * 
         * @param html the HTML to insert
         */
        void insertHTML(String html);

        /**
         * Inserts an image element.
         * 
         * @param url the url of the image to be inserted
         */
        void insertImage(String url);

        /**
         * Starts an numbered list. Indentation will create nested items.
         */
        void insertOrderedList();

        /**
         * Starts an bulleted list. Indentation will create nested items.
         */
        void insertUnorderedList();

        /**
         * Is the current region bold?
         * 
         * @return true if the current region is bold
         */
        boolean isBold();

        /**
         * Is the current region italic?
         * 
         * @return true if the current region is italic
         */
        boolean isItalic();

        /**
         * Is the current region strikethrough?
         * 
         * @return true if the current region is strikethrough
         */
        boolean isStrikethrough();

        /**
         * Is the current region subscript?
         * 
         * @return true if the current region is subscript
         */
        boolean isSubscript();

        /**
         * Is the current region superscript?
         * 
         * @return true if the current region is superscript
         */
        boolean isSuperscript();

        /**
         * Is the current region underlined?
         * 
         * @return true if the current region is underlined
         */
        boolean isUnderlined();

        /**
         * Left indent.
         */
        void leftIndent();

        /**
         * Redo an action that was just undone.
         */
        void redo();

        /**
         * Removes all formatting on the selected text.
         */
        void removeFormat();

        /**
         * Removes any link from the selected text.
         */
        void removeLink();

        /**
         * Right indent.
         */
        void rightIndent();

        /**
         * Selects all the text.
         */
        void selectAll();

        /**
         * Sets the background color.
         * 
         * @param color the new background color
         */
        void setBackColor(String color);

        /**
         * Sets the font name.
         * 
         * @param name the new font name
         */
        void setFontName(String name);

        /**
         * Sets the font size.
         * 
         * @param fontSize the new font size
         */
        void setFontSize(FontSize fontSize);

        /**
         * Sets the foreground color.
         * 
         * @param color the new foreground color
         */
        void setForeColor(String color);

        /**
         * Sets the justification.
         * 
         * @param justification the new justification
         */
        void setJustification(Justification justification);

        /**
         * Toggles bold.
         */
        void toggleBold();

        /**
         * Toggles italic.
         */
        void toggleItalic();

        /**
         * Toggles strikethrough.
         */
        void toggleStrikethrough();

        /**
         * Toggles subscript.
         */
        void toggleSubscript();

        /**
         * Toggles superscript.
         */
        void toggleSuperscript();

        /**
         * Toggles underline.
         */
        void toggleUnderline();

        /**
         * Undo the last action.
         */
        void undo();
    }

    /**
     * Justification enumeration. The three values are <code>left</code>,
     * <code>right</code>, <code>center</code>.
     */
    public static class Justification {

        /**
         * Center justification.
         */
        public static final Justification CENTER = new Justification("Center");

        /**
         * Full justification.
         */
        public static final Justification FULL = new Justification("Full");

        /**
         * Left justification.
         */
        public static final Justification LEFT = new Justification("Left");

        /**
         * Right justification.
         */
        public static final Justification RIGHT = new Justification("Right");

        private String tag;

        private Justification(String tag) {
            this.tag = tag;
        }

        @Override
        public String toString() {
            return "Justify " + tag;
        }
    }

    private RichTextAreaImpl impl = GWT.create(RichTextAreaImpl.class);

    /**
     * Creates a new, blank {@link RichTextArea} object with no stylesheet.
     */
    public RichTextArea() {
        setElement(impl.getElement());
        setStyleName("gwt-RichTextArea");
        impl.setOwner(this);
    }

    public HandlerRegistration addInitializeHandler(InitializeHandler handler) {
        return addHandler(handler, InitializeEvent.getType());
    }

    /**
     * Gets the basic rich text formatting interface. Note that formatting can
     * only be done when the {@link RichTextArea} is attached, visible on the
     * page, and has been focused by the user.
     * 
     * @return <code>null</code> if basic formatting is not supported
     * @deprecated use {@link #getFormatter()} instead
     */
    @Deprecated
    public BasicFormatter getBasicFormatter() {
        return getFormatter();
    }

    /**
     * Gets the full rich text formatting interface. Note that formatting can only
     * be done when the {@link RichTextArea} is attached, visible on the page, and
     * has been focused by the user.
     * 
     * @return <code>null</code> if full formatting is not supported
     * @deprecated use {@link #getFormatter()} instead
     */
    @Deprecated
    public ExtendedFormatter getExtendedFormatter() {
        return getFormatter();
    }

    /**
     * Gets the rich text formatting interface. Note that formatting can only be
     * done when the {@link RichTextArea} is attached, visible on the page, and
     * has been focused by the user.
     * 
     * @return <code>null</code> if full formatting is not supported
     */
    public Formatter getFormatter() {
        if (impl instanceof Formatter) {
            return (Formatter) impl;
        }
        return null;
    }

    public String getHTML() {
        return impl.getHTML();
    }

    public String getText() {
        return impl.getText();
    }

    @Override
    public boolean isEnabled() {
        return impl.isEnabled();
    }

    @Override
    public void setEnabled(boolean enabled) {
        impl.setEnabled(enabled);
    }

    @Override
    public void setFocus(boolean focused) {
        // There are different problems on each browser when you try to focus an
        // unattached rich text iframe, so just cut it off early.
        if (isAttached()) {
            impl.setFocus(focused);
        }
    }

    public void setHTML(String html) {
        impl.setHTML(html);
    }

    public void setHTML(SafeHtml html) {
        setHTML(html.asString());
    }

    public void setText(String text) {
        impl.setText(text);
    }

    @Override
    protected void onAttach() {
        super.onAttach();
        impl.initElement();
    }

    @Override
    protected void onDetach() {
        super.onDetach();
        impl.uninitElement();
    }
}