blob: e174aa243dd45089d5401bac077d310807ab7250 [file] [log] [blame]
/*
* 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();
}
}