/*
* Ext GWT - Ext for GWT
* Copyright(c) 2007-2009, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
package com.extjs.gxt.ui.client.widget.form;
import java.util.ArrayList;
import java.util.List;
import com.extjs.gxt.ui.client.GXT;
import com.extjs.gxt.ui.client.core.El;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.FieldEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.widget.ColorPalette;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.ComponentHelper;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.button.ToggleButton;
import com.extjs.gxt.ui.client.widget.menu.ColorMenu;
import com.extjs.gxt.ui.client.widget.tips.ToolTipConfig;
import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.RichTextArea.BasicFormatter;
import com.google.gwt.user.client.ui.RichTextArea.ExtendedFormatter;
import com.google.gwt.user.client.ui.RichTextArea.FontSize;
import com.google.gwt.user.client.ui.RichTextArea.Justification;
import com.google.gwt.user.client.ui.impl.RichTextAreaImpl;
/**
* Provides a lightweight HTML Editor component.
*
* <p />
* <b>Note: The focus/blur and validation marking functionality inherited from
* {@link Field} is NOT supported by this editor.</b>
*
* <p />
* An Editor is a sensitive component that can't be used in all spots standard
* fields can be used. Putting an Editor within any element that has display set
* to 'none' can cause problems in Safari and Firefox due to their default
* iframe reloading bugs.
*
*
* <dl>
* <dt>Events:</dt>
*
* <dd><b>BeforeSync</b> : HtmlEditorEvent(htmlEditor, change)<br>
* <div>Fires before the iframe editor is updated with content from the
* textarea.</div>
* <ul>
* <li>htmlEditor : this</li>
* <li>change : true for edit mode</li>
* </ul>
* </dd>
*
* <dd><b>Sync</b> : HtmlEditorEvent(htmlEditor, change)<br>
* <div>Fires when the iframe editor is updated with content from the
* textarea.</div>
* <ul>
* <li>htmlEditor : this</li>
* <li>change : true for edit mode</li>
* </ul>
* </dd>
*
* <dd><b>EditModeChange</b> : HtmlEditorEvent(htmlEditor, change)<br>
* <div>Fires when the editor switches edit modes.</div>
* <ul>
* <li>htmlEditor : this</li>
* <li>change : true for edit mode</li>
* </ul>
* </dd>
*
* </dl>
*/
public class HtmlEditor extends Field<String> {
public class HtmlEditorImages extends FieldImages {
private AbstractImagePrototype source = GXT.IMAGES.editor_source();
private AbstractImagePrototype bold = GXT.IMAGES.editor_bold();
private AbstractImagePrototype underline = GXT.IMAGES.editor_underline();
private AbstractImagePrototype italic = GXT.IMAGES.editor_italic();
private AbstractImagePrototype fontColor = GXT.IMAGES.editor_font_color();
private AbstractImagePrototype fontDecrease = GXT.IMAGES.editor_font_decrease();
private AbstractImagePrototype fontIncrease = GXT.IMAGES.editor_font_increase();
private AbstractImagePrototype fontHighlight = GXT.IMAGES.editor_font_highlight();
private AbstractImagePrototype justifyCenter = GXT.IMAGES.editor_justify_center();
private AbstractImagePrototype justifyLeft = GXT.IMAGES.editor_justify_left();
private AbstractImagePrototype justifyRight = GXT.IMAGES.editor_justify_right();
private AbstractImagePrototype ul = GXT.IMAGES.editor_ul();
private AbstractImagePrototype ol = GXT.IMAGES.editor_ol();
private AbstractImagePrototype link = GXT.IMAGES.editor_link();
public AbstractImagePrototype getBold() {
return bold;
}
public AbstractImagePrototype getFontColor() {
return fontColor;
}
public AbstractImagePrototype getFontDecrease() {
return fontDecrease;
}
public AbstractImagePrototype getFontHighlight() {
return fontHighlight;
}
public AbstractImagePrototype getFontIncrease() {
return fontIncrease;
}
public AbstractImagePrototype getItalic() {
return italic;
}
public AbstractImagePrototype getJustifyCenter() {
return justifyCenter;
}
public AbstractImagePrototype getJustifyLeft() {
return justifyLeft;
}
public AbstractImagePrototype getJustifyRight() {
return justifyRight;
}
public AbstractImagePrototype getLink() {
return link;
}
public AbstractImagePrototype getOl() {
return ol;
}
public AbstractImagePrototype getUl() {
return ul;
}
public AbstractImagePrototype getUnderline() {
return underline;
}
public AbstractImagePrototype getSource() {
return source;
}
public void setBold(AbstractImagePrototype bold) {
this.bold = bold;
}
public void setFontColor(AbstractImagePrototype fontColor) {
this.fontColor = fontColor;
}
public void setFontDecrease(AbstractImagePrototype fontDecrease) {
this.fontDecrease = fontDecrease;
}
public void setFontHighlight(AbstractImagePrototype fontHighlight) {
this.fontHighlight = fontHighlight;
}
public void setFontIncrease(AbstractImagePrototype fontIncrease) {
this.fontIncrease = fontIncrease;
}
public void setItalic(AbstractImagePrototype italic) {
this.italic = italic;
}
public void setJustifyCenter(AbstractImagePrototype justifyCenter) {
this.justifyCenter = justifyCenter;
}
public void setJustifyLeft(AbstractImagePrototype justifyLeft) {
this.justifyLeft = justifyLeft;
}
public void setJustifyRight(AbstractImagePrototype justifyRight) {
this.justifyRight = justifyRight;
}
public void setLink(AbstractImagePrototype link) {
this.link = link;
}
public void setUnderline(AbstractImagePrototype underline) {
this.underline = underline;
}
public void setOl(AbstractImagePrototype ol) {
this.ol = ol;
}
public void setUl(AbstractImagePrototype ul) {
this.ul = ul;
}
public void setSource(AbstractImagePrototype source) {
this.source = source;
}
}
protected class EventHandler implements ClickHandler, KeyUpHandler, FocusHandler,
BlurHandler {
public void onClick(ClickEvent event) {
updateStatus();
syncValue();
}
public void onKeyUp(KeyUpEvent event) {
updateStatus();
syncValue();
}
public void onFocus(FocusEvent event) {
}
public void onBlur(BlurEvent event) {
}
}
protected class rte extends Component {
protected void onRender(Element target, int index) {
Element e = impl.getElement();
e.setPropertyInt("frameBorder", 0);
setElement(e, target, index);
addDomHandler(handler, ClickEvent.getType());
addDomHandler(handler, FocusEvent.getType());
addDomHandler(handler, BlurEvent.getType());
addDomHandler(handler, KeyUpEvent.getType());
}
@Override
protected void onAttach() {
super.onAttach();
impl.initElement();
}
@Override
protected void onDetach() {
super.onDetach();
impl.uninitElement();
}
}
public class HtmlEditorMessages extends FieldMessages {
private String backColorTipText = GXT.MESSAGES.htmlEditor_backColorTipText();
private String backColorTipTitle = GXT.MESSAGES.htmlEditor_backColorTipTitle();
private String boldTipText = GXT.MESSAGES.htmlEditor_boldTipText();
private String boldTipTitle = GXT.MESSAGES.htmlEditor_boldTipTitle();
private String createLinkText = GXT.MESSAGES.htmlEditor_createLinkText();
private String decreaseFontSizeTipText = GXT.MESSAGES.htmlEditor_decreaseFontSizeTipText();
private String decreaseFontSizeTipTitle = GXT.MESSAGES.htmlEditor_decreaseFontSizeTipTitle();
private String foreColorTipText = GXT.MESSAGES.htmlEditor_foreColorTipText();
private String foreColorTipTitle = GXT.MESSAGES.htmlEditor_foreColorTipTitle();
private String increaseFontSizeTipText = GXT.MESSAGES.htmlEditor_increaseFontSizeTipText();
private String increaseFontSizeTipTitle = GXT.MESSAGES.htmlEditor_increaseFontSizeTipTitle();
private String italicTipText = GXT.MESSAGES.htmlEditor_italicTipText();
private String italicTipTitle = GXT.MESSAGES.htmlEditor_italicTipTitle();
private String justifyCenterTipText = GXT.MESSAGES.htmlEditor_justifyCenterTipText();
private String justifyCenterTipTitle = GXT.MESSAGES.htmlEditor_justifyCenterTipTitle();
private String justifyLeftTipText = GXT.MESSAGES.htmlEditor_justifyLeftTipText();
private String justifyLeftTipTitle = GXT.MESSAGES.htmlEditor_justifyLeftTipTitle();
private String justifyRightTipText = GXT.MESSAGES.htmlEditor_justifyRightTipText();
private String justifyRightTipTitle = GXT.MESSAGES.htmlEditor_justifyRightTipTitle();
private String linkTipText = GXT.MESSAGES.htmlEditor_linkTipText();
private String linkTipTitle = GXT.MESSAGES.htmlEditor_linkTipTitle();
private String olTipText = GXT.MESSAGES.htmlEditor_olTipText();
private String olTipTitle = GXT.MESSAGES.htmlEditor_olTipTitle();
private String ulTipText = GXT.MESSAGES.htmlEditor_ulTipText();
private String ulTipTitle = GXT.MESSAGES.htmlEditor_ulTipTitle();
private String underlineTipText = GXT.MESSAGES.htmlEditor_underlineTipText();
private String underlineTipTitle = GXT.MESSAGES.htmlEditor_underlineTipTitle();
private String sourceEditTipText = GXT.MESSAGES.htmlEditor_sourceEditTipText();
private String sourceEditTipTitle = GXT.MESSAGES.htmlEditor_sourceEditTipTitle();
public String getBackColorTipText() {
return backColorTipText;
}
public String getBackColorTipTitle() {
return backColorTipTitle;
}
public String getBoldTipText() {
return boldTipText;
}
public String getBoldTipTitle() {
return boldTipTitle;
}
public String getCreateLinkText() {
return createLinkText;
}
public String getDecreaseFontSizeTipText() {
return decreaseFontSizeTipText;
}
public String getDecreaseFontSizeTipTitle() {
return decreaseFontSizeTipTitle;
}
public String getForColorTipTitle() {
return foreColorTipTitle;
}
public String getForeColorTipText() {
return foreColorTipText;
}
public String getIncreaseFontSizeTipText() {
return increaseFontSizeTipText;
}
public String getIncreaseFontSizeTipTitle() {
return increaseFontSizeTipTitle;
}
public String getItalicTipText() {
return italicTipText;
}
public String getItalicTipTitle() {
return italicTipTitle;
}
public String getJustifyCenterTipText() {
return justifyCenterTipText;
}
public String getJustifyCenterTipTitle() {
return justifyCenterTipTitle;
}
public String getJustifyLeftTipText() {
return justifyLeftTipText;
}
public String getJustifyLeftTipTitle() {
return justifyLeftTipTitle;
}
public String getJustifyRightTipText() {
return justifyRightTipText;
}
public String getJustifyRightTipTitle() {
return justifyRightTipTitle;
}
public String getLinkTipText() {
return linkTipText;
}
public String getLinkTipTitle() {
return linkTipTitle;
}
public String getOlTipText() {
return olTipText;
}
public String getOlTipTitle() {
return olTipTitle;
}
public String getUlTipTitle() {
return ulTipTitle;
}
public String getUlTipText() {
return ulTipText;
}
public String getUnderlineTipText() {
return underlineTipText;
}
public String getUnderlineTipTitle() {
return underlineTipTitle;
}
public String getSourceEditTipText() {
return sourceEditTipText;
}
public String getSourceEditTipTitle() {
return sourceEditTipTitle;
}
public void setBackColorTipText(String backColorTipText) {
this.backColorTipText = backColorTipText;
}
public void setBackColorTipTitle(String backColorTipTitle) {
this.backColorTipTitle = backColorTipTitle;
}
public void setBoldTipText(String boldTipText) {
this.boldTipText = boldTipText;
}
public void setBoldTipTitle(String boldTipTitle) {
this.boldTipTitle = boldTipTitle;
}
public void setCreateLinkText(String createLinkText) {
this.createLinkText = createLinkText;
}
public void setDecreaseFontSizeTipText(String decreaseFontSizeTipText) {
this.decreaseFontSizeTipText = decreaseFontSizeTipText;
}
public void setDecreaseFontSizeTipTitle(String decreaseFontSizeTipTitle) {
this.decreaseFontSizeTipTitle = decreaseFontSizeTipTitle;
}
public void setForeColorTipText(String foreColorTipText) {
this.foreColorTipText = foreColorTipText;
}
public void setForeColorTipTitle(String foreColorTipTitle) {
this.foreColorTipTitle = foreColorTipTitle;
}
public void setIncreaseFontSizeTipText(String increaseFontSizeTipText) {
this.increaseFontSizeTipText = increaseFontSizeTipText;
}
public void setIncreaseFontSizeTipTitle(String increaseFontSizeTipTitle) {
this.increaseFontSizeTipTitle = increaseFontSizeTipTitle;
}
public void setItalicTipText(String italicTipText) {
this.italicTipText = italicTipText;
}
public void setItalicTipTitle(String italicTipTitle) {
this.italicTipTitle = italicTipTitle;
}
public void setJustifyCenterTipText(String justifyCenterTipText) {
this.justifyCenterTipText = justifyCenterTipText;
}
public void setJustifyCenterTipTitle(String justifyCenterTipTitle) {
this.justifyCenterTipTitle = justifyCenterTipTitle;
}
public void setJustifyLeftTipText(String justifyLeftTipText) {
this.justifyLeftTipText = justifyLeftTipText;
}
public void setJustifyLeftTipTitle(String justifyLeftTipTitle) {
this.justifyLeftTipTitle = justifyLeftTipTitle;
}
public void setJustifyRightTipText(String justifyRightTipText) {
this.justifyRightTipText = justifyRightTipText;
}
public void setJustifyRightTipTitle(String justifyRightTipTitle) {
this.justifyRightTipTitle = justifyRightTipTitle;
}
public void setLinkTipText(String linkTipText) {
this.linkTipText = linkTipText;
}
public void setLinkTipTitle(String linkTipTitle) {
this.linkTipTitle = linkTipTitle;
}
public void setOlTipText(String olTipText) {
this.olTipText = olTipText;
}
public void setOlTipTitle(String olTipTitle) {
this.olTipTitle = olTipTitle;
}
public void setUlTipText(String ulTipText) {
this.ulTipText = ulTipText;
}
public void setUlTipTitle(String ulTipTitle) {
this.ulTipTitle = ulTipTitle;
}
public void setUnderlineTipText(String underlineTipText) {
this.underlineTipText = underlineTipText;
}
public void setUnderlineTipTitle(String underlineTipTitle) {
this.underlineTipTitle = underlineTipTitle;
}
public void setSourceEditTipText(String sourceEditTipText) {
this.sourceEditTipText = sourceEditTipText;
}
public void setSourceEditTipTitle(String sourceEditTipTitle) {
this.sourceEditTipTitle = sourceEditTipTitle;
}
}
protected RichTextAreaImpl impl = GWT.create(RichTextAreaImpl.class);
protected El textarea;
protected ToolBar toolbar;
// the toolbar buttons
protected ToggleButton bold;
protected ToggleButton italic;
protected ToggleButton underline;
protected Button justifyLeft;
protected Button justifyRight;
protected Button justifyCenter;
protected ToggleButton sourceEdit;
protected Button ol;
protected Button ul;
protected Button link;
protected Button increasefontsize;
protected Button decreasefontsize;
protected Button forecolor;
protected Button backcolor;
protected SelectionListener<ButtonEvent> btnListener;
protected FontSize activeFontSize = FontSize.SMALL;
protected List<FontSize> fontSizesConstants = new ArrayList<FontSize>();
protected EventHandler handler = new EventHandler();
protected rte rte;
private boolean sourceEditMode = true;
private boolean showToolbar = true;
private boolean enableFormat = true;
private boolean enableFontSize = true;
private boolean enableColors = true;
private boolean enableAlignments = true;
private boolean enableLists = true;
private boolean enableLinks = true;
private boolean enableFont = true;
public HtmlEditor() {
super();
disabledStyle = null;
fontSizesConstants.add(FontSize.XX_SMALL);
fontSizesConstants.add(FontSize.X_SMALL);
fontSizesConstants.add(FontSize.SMALL);
fontSizesConstants.add(FontSize.MEDIUM);
fontSizesConstants.add(FontSize.LARGE);
fontSizesConstants.add(FontSize.X_LARGE);
fontSizesConstants.add(FontSize.XX_LARGE);
setSize(500, 300);
if (GXT.isWebKit) {
setValue("");
}
messages = new HtmlEditorMessages();
}
@Override
public void blur() {
}
@Override
public void focus() {
}
/**
* Gets the basic rich text formatting interface.
*
* @return <code>null</code> if basic formatting is not supported
*/
public BasicFormatter getBasicFormatter() {
if ((impl instanceof BasicFormatter) && (impl.isBasicEditingSupported())) {
return (BasicFormatter) impl;
}
return null;
}
/**
* Gets the full rich text formatting interface.
*
* @return <code>null</code> if full formatting is not supported
*/
public ExtendedFormatter getExtendedFormatter() {
if ((impl instanceof ExtendedFormatter) && (impl.isExtendedEditingSupported())) {
return (ExtendedFormatter) impl;
}
return null;
}
@Override
public HtmlEditorMessages getMessages() {
return (HtmlEditorMessages) messages;
}
@Override
public String getRawValue() {
syncValue();
return super.getRawValue();
}
@Override
public String getValue() {
syncValue();
return super.getValue();
}
@Override
public HtmlEditorImages getImages() {
if (images == null) {
images = new HtmlEditorImages();
}
return (HtmlEditorImages) images;
}
public boolean isEnableAlignments() {
return enableAlignments;
}
public boolean isEnableColors() {
return enableColors;
}
public boolean isEnableFont() {
return enableFont;
}
public boolean isEnableFontSize() {
return enableFontSize;
}
public boolean isEnableFormat() {
return enableFormat;
}
public boolean isEnableLinks() {
return enableLinks;
}
public boolean isEnableLists() {
return enableLists;
}
public boolean isShowToolbar() {
return showToolbar;
}
public boolean isSourceEditMode() {
return sourceEditMode;
}
public void pushValue() {
impl.setHTML(getInputEl().getValue());
}
public void setEnableAlignments(boolean enableAlignments) {
this.enableAlignments = enableAlignments;
}
public void setEnableColors(boolean enableColors) {
this.enableColors = enableColors;
}
public void setEnableFont(boolean enableFont) {
this.enableFont = enableFont;
}
public void setEnableFontSize(boolean enableFontSize) {
this.enableFontSize = enableFontSize;
}
public void setEnableFormat(boolean enableFormat) {
this.enableFormat = enableFormat;
}
public void setEnableLinks(boolean enableLinks) {
this.enableLinks = enableLinks;
}
public void setEnableLists(boolean enableLists) {
this.enableLists = enableLists;
}
@Override
public void setRawValue(String value) {
impl.setHTML(value);
super.setRawValue(value);
}
public void setShowToolbar(boolean showToolbar) {
this.showToolbar = showToolbar;
}
public void setSourceEditMode(boolean mode) {
assertPreRender();
sourceEditMode = mode;
}
@Override
public void setValue(String value) {
impl.setHTML(value);
super.setValue(value);
}
public void syncValue() {
getInputEl().setValue(impl.getHTML());
}
@Override
public boolean validate(boolean silent) {
return true;
}
protected Button createColorButton(AbstractImagePrototype icon, String toolTip,
String toolTipTitle, Listener<ComponentEvent> listener) {
Button item = new Button();
item.setIcon(icon);
item.setTabIndex(-1);
ToolTipConfig cfg = new ToolTipConfig(toolTipTitle, toolTip);
item.setToolTip(cfg);
ColorMenu menu = new ColorMenu();
menu.getColorPalette().addListener(Events.Select, listener);
item.setMenu(menu);
return item;
}
protected ToggleButton createToggleButton(AbstractImagePrototype icon, String toolTip,
String toolTipTitle) {
ToggleButton item = new ToggleButton();
item.setTabIndex(-1);
ToolTipConfig cfg = new ToolTipConfig(toolTipTitle, toolTip);
item.setToolTip(cfg);
item.setIcon(icon);
item.addSelectionListener(btnListener);
return item;
}
protected Button createButton(AbstractImagePrototype icon, String toolTip,
String toolTipTitle) {
Button item = new Button();
item.setIcon(icon);
item.setTabIndex(-1);
ToolTipConfig cfg = new ToolTipConfig(toolTipTitle, toolTip);
item.setToolTip(cfg);
item.addSelectionListener(btnListener);
return item;
}
protected void doAttachChildren() {
super.doAttachChildren();
ComponentHelper.doAttach(toolbar);
ComponentHelper.doAttach(rte);
}
protected void doDetachChildren() {
super.doAttachChildren();
ComponentHelper.doDetach(toolbar);
ComponentHelper.doDetach(rte);
}
@Override
protected El getInputEl() {
return textarea;
}
@Override
protected void onBlur(ComponentEvent ce) {
}
@Override
protected void onDisable() {
super.onDisable();
if (toolbar != null) {
toolbar.disable();
}
mask();
}
@Override
protected void onEnable() {
super.onEnable();
if (toolbar != null) {
toolbar.enable();
}
unmask();
}
@Override
protected void onFocus(ComponentEvent ce) {
}
@Override
protected void onRender(Element target, int index) {
setElement(DOM.createDiv(), target, index);
el().setStyleName("x-html-editor-wrap");
rte = new rte();
rte.render(el().dom);
textarea = new El(DOM.createTextArea());
textarea.addStyleName("x-hidden");
textarea.addStyleName("x-form-textarea");
textarea.addStyleName("x-form-field");
textarea.setStyleAttribute("border", "0 none");
el().appendChild(textarea.dom);
setupToolbar();
super.onRender(target, index);
}
@Override
protected void onResize(int width, int height) {
super.onResize(width, height);
int aw = width - el().getFrameWidth("lr");
int ah = height - el().getFrameWidth("tb");
if (showToolbar) {
el().down(".x-html-editor-tb").setWidth(aw);
toolbar.setWidth(aw);
ah -= toolbar.getHeight();
}
rte.el().setSize(aw, ah);
textarea.setSize(adjustWidth("textarea", aw), adjustWidth("textarea", ah));
}
protected void setupToolbar() {
if (showToolbar) {
btnListener = new SelectionListener<ButtonEvent>() {
@Override
public void componentSelected(ButtonEvent ce) {
Component item = ce.getComponent();
if (item == bold) {
getBasicFormatter().toggleBold();
} else if (item == italic) {
getBasicFormatter().toggleItalic();
} else if (item == underline) {
getBasicFormatter().toggleUnderline();
} else if (item == sourceEdit) {
toggleSourceEditMode();
focus();
} else if (item == ol) {
getExtendedFormatter().insertOrderedList();
} else if (item == ul) {
getExtendedFormatter().insertUnorderedList();
} else if (item == link) {
String link = Window.prompt(getMessages().getCreateLinkText(), "http://");
if (link != null && link.length() > 0) {
getExtendedFormatter().createLink(link);
} else {
getExtendedFormatter().removeLink();
}
} else if (item == justifyLeft) {
getBasicFormatter().setJustification(Justification.LEFT);
} else if (item == justifyCenter) {
getBasicFormatter().setJustification(Justification.CENTER);
} else if (item == justifyRight) {
getBasicFormatter().setJustification(Justification.RIGHT);
} else if (item == increasefontsize) {
int i = fontSizesConstants.indexOf(activeFontSize);
if (i < (fontSizesConstants.size() - 1)) {
i++;
activeFontSize = fontSizesConstants.get(i);
getBasicFormatter().setFontSize(activeFontSize);
} else {
// brings focus back to the editor
focus();
}
} else if (item == decreasefontsize) {
int i = fontSizesConstants.indexOf(activeFontSize);
if (i > 0) {
i--;
activeFontSize = fontSizesConstants.get(i);
getBasicFormatter().setFontSize(activeFontSize);
} else {
// brings focus back to the editor
focus();
}
}
}
};
toolbar = new ToolBar();
if (sourceEditMode) {
toolbar.add(sourceEdit = createToggleButton(getImages().getSource(),
getMessages().getSourceEditTipText(), getMessages().getSourceEditTipTitle()));
toolbar.add(new SeparatorToolItem());
}
if (impl.isBasicEditingSupported()) {
if (enableFont) {
SimpleComboBox<String> scbf = new SimpleComboBox<String>();
scbf.setTabIndex(-1);
scbf.add("Arial");
scbf.add("Times New Roman");
scbf.add("Verdana");
scbf.setEditable(false);
scbf.addListener(Events.Select, new Listener<FieldEvent>() {
@SuppressWarnings("unchecked")
public void handleEvent(FieldEvent be) {
SimpleComboBox<String> field = (SimpleComboBox<String>) be.getField();
getBasicFormatter().setFontName(field.getSimpleValue());
}
});
toolbar.add(scbf);
toolbar.add(new SeparatorToolItem());
}
if (enableFontSize) {
toolbar.add(increasefontsize = createButton(getImages().getFontIncrease(),
getMessages().getIncreaseFontSizeTipText(),
getMessages().getIncreaseFontSizeTipTitle()));
toolbar.add(decreasefontsize = createButton(getImages().getFontDecrease(),
getMessages().getDecreaseFontSizeTipText(),
getMessages().getDecreaseFontSizeTipTitle()));
toolbar.add(new SeparatorToolItem());
}
if (enableFormat) {
toolbar.add(bold = createToggleButton(getImages().getBold(),
getMessages().getBoldTipText(), getMessages().getBackColorTipTitle()));
toolbar.add(italic = createToggleButton(getImages().getItalic(),
getMessages().getItalicTipText(), getMessages().getItalicTipTitle()));
toolbar.add(underline = createToggleButton(getImages().getUnderline(),
getMessages().getUnderlineTipText(), getMessages().getUnderlineTipTitle()));
toolbar.add(new SeparatorToolItem());
}
if (enableAlignments) {
toolbar.add(justifyLeft = createButton(getImages().getJustifyLeft(),
getMessages().getJustifyLeftTipText(),
getMessages().getJustifyLeftTipTitle()));
toolbar.add(justifyCenter = createButton(getImages().getJustifyCenter(),
getMessages().getJustifyCenterTipText(),
getMessages().getJustifyCenterTipTitle()));
toolbar.add(justifyRight = createButton(getImages().getJustifyRight(),
getMessages().getJustifyRightTipText(),
getMessages().getJustifyRightTipTitle()));
}
}
if (impl.isExtendedEditingSupported()) {
if (enableLists) {
toolbar.add(new SeparatorToolItem());
toolbar.add(ol = createButton(getImages().getOl(),
getMessages().getOlTipText(), getMessages().getOlTipTitle()));
toolbar.add(ul = createButton(getImages().getUl(),
getMessages().getUlTipText(), getMessages().getUlTipTitle()));
toolbar.add(new SeparatorToolItem());
}
if (enableLinks) {
toolbar.add(link = createButton(getImages().getLink(),
getMessages().getLinkTipText(), getMessages().getLinkTipTitle()));
toolbar.add(new SeparatorToolItem());
}
if (enableColors) {
toolbar.add(forecolor = createColorButton(getImages().getFontColor(),
getMessages().getForeColorTipText(), getMessages().getForColorTipTitle(),
new Listener<ComponentEvent>() {
public void handleEvent(ComponentEvent be) {
getBasicFormatter().setForeColor(
((ColorPalette) be.getComponent()).getValue());
}
}));
toolbar.add(backcolor = createColorButton(getImages().getFontHighlight(),
getMessages().getBackColorTipText(), getMessages().getBackColorTipTitle(),
new Listener<ComponentEvent>() {
public void handleEvent(ComponentEvent be) {
getBasicFormatter().setBackColor(
((ColorPalette) be.getComponent()).getValue());
}
}));
}
}
Element e = DOM.createDiv();
e.setClassName("x-html-editor-tb");
el().insertFirst(e);
toolbar.render(e);
}
}
protected void toggleSourceEditMode() {
if (sourceEdit.isPressed()) {
syncValue();
rte.el().addStyleName("x-hidden");
textarea.removeStyleName("x-hidden");
} else {
pushValue();
rte.el().removeStyleName("x-hidden");
textarea.addStyleName("x-hidden");
}
for (Component item : toolbar.getItems()) {
if (item != sourceEdit) {
item.setEnabled(!item.isEnabled());
}
}
}
protected void updateStatus() {
if (showToolbar && rendered) {
if (impl.isBasicEditingSupported()) {
BasicFormatter basic = getBasicFormatter();
bold.toggle(basic.isBold());
underline.toggle(basic.isUnderlined());
italic.toggle(basic.isItalic());
}
if (impl.isExtendedEditingSupported()) {
// ExtendedFormatter extended = getExtendedFormatter();
}
}
}
}