/* * 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(); } } } }