From 0255e982286b46527565e0a0c78e5bd0bf46bde8 Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Thu, 11 Oct 2007 11:47:27 +0000 Subject: [PATCH] added RichTextEditor component. svn changeset:2494/svn branch:trunk --- .../terminal/gwt/client/DefaultWidgetSet.java | 16 +- .../client/ui/richtextarea/IRichTextArea.java | 78 +++ .../RichTextToolbar$Strings.properties | 35 ++ .../ui/richtextarea/RichTextToolbar.java | 492 ++++++++++++++++++ .../gwt/client/ui/richtextarea/backColors.gif | Bin 0 -> 104 bytes .../gwt/client/ui/richtextarea/bold.gif | Bin 0 -> 864 bytes .../gwt/client/ui/richtextarea/createLink.gif | Bin 0 -> 118 bytes .../gwt/client/ui/richtextarea/fontSizes.gif | Bin 0 -> 96 bytes .../gwt/client/ui/richtextarea/fonts.gif | Bin 0 -> 147 bytes .../gwt/client/ui/richtextarea/foreColors.gif | Bin 0 -> 173 bytes .../gwt/client/ui/richtextarea/gwtLogo.png | Bin 0 -> 11454 bytes .../gwt/client/ui/richtextarea/hr.gif | Bin 0 -> 67 bytes .../gwt/client/ui/richtextarea/indent.gif | Bin 0 -> 82 bytes .../client/ui/richtextarea/insertImage.gif | Bin 0 -> 290 bytes .../gwt/client/ui/richtextarea/italic.gif | Bin 0 -> 79 bytes .../client/ui/richtextarea/justifyCenter.gif | Bin 0 -> 70 bytes .../client/ui/richtextarea/justifyLeft.gif | Bin 0 -> 71 bytes .../client/ui/richtextarea/justifyRight.gif | Bin 0 -> 855 bytes .../gwt/client/ui/richtextarea/ol.gif | Bin 0 -> 76 bytes .../gwt/client/ui/richtextarea/outdent.gif | Bin 0 -> 82 bytes .../client/ui/richtextarea/removeFormat.gif | Bin 0 -> 360 bytes .../gwt/client/ui/richtextarea/removeLink.gif | Bin 0 -> 895 bytes .../client/ui/richtextarea/strikeThrough.gif | Bin 0 -> 80 bytes .../gwt/client/ui/richtextarea/subscript.gif | Bin 0 -> 80 bytes .../client/ui/richtextarea/superscript.gif | Bin 0 -> 80 bytes .../gwt/client/ui/richtextarea/ul.gif | Bin 0 -> 863 bytes .../gwt/client/ui/richtextarea/underline.gif | Bin 0 -> 88 bytes .../toolkit/tests/TestForRichTextEditor.java | 52 ++ 28 files changed, 668 insertions(+), 5 deletions(-) create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/IRichTextArea.java create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/RichTextToolbar$Strings.properties create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/RichTextToolbar.java create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/backColors.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/bold.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/createLink.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/fontSizes.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/fonts.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/foreColors.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/gwtLogo.png create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/hr.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/indent.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/insertImage.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/italic.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/justifyCenter.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/justifyLeft.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/justifyRight.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/ol.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/outdent.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/removeFormat.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/removeLink.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/strikeThrough.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/subscript.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/superscript.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/ul.gif create mode 100644 src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/underline.gif create mode 100644 src/com/itmill/toolkit/tests/TestForRichTextEditor.java diff --git a/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetSet.java b/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetSet.java index 20c0bac7e9..1fa5897909 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetSet.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetSet.java @@ -37,6 +37,7 @@ import com.itmill.toolkit.terminal.gwt.client.ui.ITwinColSelect; import com.itmill.toolkit.terminal.gwt.client.ui.IUnknownComponent; import com.itmill.toolkit.terminal.gwt.client.ui.IUpload; import com.itmill.toolkit.terminal.gwt.client.ui.IWindow; +import com.itmill.toolkit.terminal.gwt.client.ui.richtextarea.IRichTextArea; public class DefaultWidgetSet implements WidgetSet { @@ -154,6 +155,9 @@ public class DefaultWidgetSet implements WidgetSet { } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IExpandLayout" .equals(className)) { return new IExpandLayout(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.richtextarea.IRichTextArea" + .equals(className)) { + return new IRichTextArea(); } return new IUnknownComponent(); @@ -190,13 +194,13 @@ public class DefaultWidgetSet implements WidgetSet { } else if ("tree".equals(tag)) { return "com.itmill.toolkit.terminal.gwt.client.ui.ITree"; } else if ("select".equals(tag)) { - if(uidl.hasAttribute("type")) { + if (uidl.hasAttribute("type")) { String type = uidl.getStringAttribute("type"); - if(type.equals("twincol")) + if (type.equals("twincol")) return "com.itmill.toolkit.terminal.gwt.client.ui.ITwinColSelect"; - if(type.equals("optiongroup")) + if (type.equals("optiongroup")) return "com.itmill.toolkit.terminal.gwt.client.ui.IOptionGroup"; - if(type.equals("native")) + if (type.equals("native")) return "com.itmill.toolkit.terminal.gwt.client.ui.ISelect"; } else { return "com.itmill.toolkit.terminal.gwt.client.ui.IFilterSelect"; @@ -210,7 +214,9 @@ public class DefaultWidgetSet implements WidgetSet { } else if ("customlayout".equals(tag)) { return "com.itmill.toolkit.terminal.gwt.client.ui.ICustomLayout"; } else if ("textfield".equals(tag)) { - if (uidl.hasAttribute("multiline")) { + if (uidl.getBooleanAttribute("richtext")) { + return "com.itmill.toolkit.terminal.gwt.client.ui.richtextarea.IRichTextArea"; + } else if (uidl.hasAttribute("multiline")) { return "com.itmill.toolkit.terminal.gwt.client.ui.ITextArea"; } else if (uidl.getBooleanAttribute("secret")) { return "com.itmill.toolkit.terminal.gwt.client.ui.IPasswordField"; diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/IRichTextArea.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/IRichTextArea.java new file mode 100644 index 0000000000..e2af2fd2b8 --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/IRichTextArea.java @@ -0,0 +1,78 @@ +package com.itmill.toolkit.terminal.gwt.client.ui.richtextarea; + +import com.google.gwt.user.client.ui.ChangeListener; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.FocusListener; +import com.google.gwt.user.client.ui.RichTextArea; +import com.google.gwt.user.client.ui.Widget; +import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; +import com.itmill.toolkit.terminal.gwt.client.Paintable; +import com.itmill.toolkit.terminal.gwt.client.UIDL; + +/** + * This class represents a basic text input field with one row. + * + * @author IT Mill Ltd. + * + */ +public class IRichTextArea extends Composite implements Paintable, + ChangeListener, FocusListener { + + /** + * The input node CSS classname. + */ + public static final String CLASSNAME = "i-richtextarea"; + + protected String id; + + protected ApplicationConnection client; + + private boolean immediate = false; + + RichTextArea rta = new RichTextArea(); + + RichTextToolbar formatter = new RichTextToolbar(rta); + + public IRichTextArea() { + FlowPanel fp = new FlowPanel(); + fp.add(formatter); + + rta.setWidth("100%"); + rta.addFocusListener(this); + + fp.add(rta); + + initWidget(fp); + setStyleName(CLASSNAME); + } + + public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { + this.client = client; + id = uidl.getId(); + + if (client.updateComponent(this, uidl, true)) + return; + + immediate = uidl.getBooleanAttribute("immediate"); + + rta.setText(uidl.getStringAttribute("text")); + + } + + public void onChange(Widget sender) { + if (client != null && id != null) + client.updateVariable(id, "text", rta.getText(), immediate); + } + + public void onFocus(Widget sender) { + + } + + public void onLostFocus(Widget sender) { + String html = rta.getHTML(); + client.updateVariable(id, "text", html, immediate); + + } + +} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/RichTextToolbar$Strings.properties b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/RichTextToolbar$Strings.properties new file mode 100644 index 0000000000..363b704584 --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/RichTextToolbar$Strings.properties @@ -0,0 +1,35 @@ +bold = Toggle Bold +createLink = Create Link +hr = Insert Horizontal Rule +indent = Indent Right +insertImage = Insert Image +italic = Toggle Italic +justifyCenter = Center +justifyLeft = Left Justify +justifyRight = Right Justify +ol = Insert Ordered List +outdent = Indent Left +removeFormat = Remove Formatting +removeLink = Remove Link +strikeThrough = Toggle Strikethrough +subscript = Toggle Subscript +superscript = Toggle Superscript +ul = Insert Unordered List +underline = Toggle Underline +color = Color +black = Black +white = White +red = Red +green = Green +yellow = Yellow +blue = Blue +font = Font +normal = Normal +size = Size +xxsmall = XX-Small +xsmall = X-Small +small = Small +medium = Medium +large = Large +xlarge = X-Large +xxlarge = XX-Large \ No newline at end of file diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/RichTextToolbar.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/RichTextToolbar.java new file mode 100644 index 0000000000..2c1a8d7d52 --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/RichTextToolbar.java @@ -0,0 +1,492 @@ +/* + * 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.itmill.toolkit.terminal.gwt.client.ui.richtextarea; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.Constants; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.AbstractImagePrototype; +import com.google.gwt.user.client.ui.ChangeListener; +import com.google.gwt.user.client.ui.ClickListener; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.ImageBundle; +import com.google.gwt.user.client.ui.KeyboardListener; +import com.google.gwt.user.client.ui.ListBox; +import com.google.gwt.user.client.ui.PushButton; +import com.google.gwt.user.client.ui.RichTextArea; +import com.google.gwt.user.client.ui.ToggleButton; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + +/** + * A sample toolbar for use with {@link RichTextArea}. It provides a simple UI + * for all rich text formatting, dynamically displayed only for the available + * functionality. + */ +public class RichTextToolbar extends Composite { + + /** + * This {@link ImageBundle} is used for all the button icons. Using an image + * bundle allows all of these images to be packed into a single image, which + * saves a lot of HTTP requests, drastically improving startup time. + */ + public interface Images extends ImageBundle { + + /** + * @gwt.resource bold.gif + */ + AbstractImagePrototype bold(); + + /** + * @gwt.resource createLink.gif + */ + AbstractImagePrototype createLink(); + + /** + * @gwt.resource hr.gif + */ + AbstractImagePrototype hr(); + + /** + * @gwt.resource indent.gif + */ + AbstractImagePrototype indent(); + + /** + * @gwt.resource insertImage.gif + */ + AbstractImagePrototype insertImage(); + + /** + * @gwt.resource italic.gif + */ + AbstractImagePrototype italic(); + + /** + * @gwt.resource justifyCenter.gif + */ + AbstractImagePrototype justifyCenter(); + + /** + * @gwt.resource justifyLeft.gif + */ + AbstractImagePrototype justifyLeft(); + + /** + * @gwt.resource justifyRight.gif + */ + AbstractImagePrototype justifyRight(); + + /** + * @gwt.resource ol.gif + */ + AbstractImagePrototype ol(); + + /** + * @gwt.resource outdent.gif + */ + AbstractImagePrototype outdent(); + + /** + * @gwt.resource removeFormat.gif + */ + AbstractImagePrototype removeFormat(); + + /** + * @gwt.resource removeLink.gif + */ + AbstractImagePrototype removeLink(); + + /** + * @gwt.resource strikeThrough.gif + */ + AbstractImagePrototype strikeThrough(); + + /** + * @gwt.resource subscript.gif + */ + AbstractImagePrototype subscript(); + + /** + * @gwt.resource superscript.gif + */ + AbstractImagePrototype superscript(); + + /** + * @gwt.resource ul.gif + */ + AbstractImagePrototype ul(); + + /** + * @gwt.resource underline.gif + */ + AbstractImagePrototype underline(); + } + + /** + * This {@link Constants} interface is used to make the toolbar's strings + * internationalizable. + */ + public interface Strings extends Constants { + + String black(); + + String blue(); + + String bold(); + + String color(); + + String createLink(); + + String font(); + + String green(); + + String hr(); + + String indent(); + + String insertImage(); + + String italic(); + + String justifyCenter(); + + String justifyLeft(); + + String justifyRight(); + + String large(); + + String medium(); + + String normal(); + + String ol(); + + String outdent(); + + String red(); + + String removeFormat(); + + String removeLink(); + + String size(); + + String small(); + + String strikeThrough(); + + String subscript(); + + String superscript(); + + String ul(); + + String underline(); + + String white(); + + String xlarge(); + + String xsmall(); + + String xxlarge(); + + String xxsmall(); + + String yellow(); + } + + /** + * We use an inner EventListener class to avoid exposing event methods on the + * RichTextToolbar itself. + */ + private class EventListener implements ClickListener, ChangeListener, + KeyboardListener { + + public void onChange(Widget sender) { + if (sender == backColors) { + basic.setBackColor(backColors.getValue(backColors.getSelectedIndex())); + backColors.setSelectedIndex(0); + } else if (sender == foreColors) { + basic.setForeColor(foreColors.getValue(foreColors.getSelectedIndex())); + foreColors.setSelectedIndex(0); + } else if (sender == fonts) { + basic.setFontName(fonts.getValue(fonts.getSelectedIndex())); + fonts.setSelectedIndex(0); + } else if (sender == fontSizes) { + basic.setFontSize(fontSizesConstants[fontSizes.getSelectedIndex() - 1]); + fontSizes.setSelectedIndex(0); + } + } + + public void onClick(Widget sender) { + if (sender == bold) { + basic.toggleBold(); + } else if (sender == italic) { + basic.toggleItalic(); + } else if (sender == underline) { + basic.toggleUnderline(); + } else if (sender == subscript) { + basic.toggleSubscript(); + } else if (sender == superscript) { + basic.toggleSuperscript(); + } else if (sender == strikethrough) { + extended.toggleStrikethrough(); + } else if (sender == indent) { + extended.rightIndent(); + } else if (sender == outdent) { + extended.leftIndent(); + } else if (sender == justifyLeft) { + basic.setJustification(RichTextArea.Justification.LEFT); + } else if (sender == justifyCenter) { + basic.setJustification(RichTextArea.Justification.CENTER); + } else if (sender == justifyRight) { + basic.setJustification(RichTextArea.Justification.RIGHT); + } else if (sender == insertImage) { + String url = Window.prompt("Enter an image URL:", "http://"); + if (url != null) { + extended.insertImage(url); + } + } else if (sender == createLink) { + String url = Window.prompt("Enter a link URL:", "http://"); + if (url != null) { + extended.createLink(url); + } + } else if (sender == removeLink) { + extended.removeLink(); + } else if (sender == hr) { + extended.insertHorizontalRule(); + } else if (sender == ol) { + extended.insertOrderedList(); + } else if (sender == ul) { + extended.insertUnorderedList(); + } else if (sender == removeFormat) { + extended.removeFormat(); + } else if (sender == richText) { + // We use the RichTextArea's onKeyUp event to update the toolbar status. + // This will catch any cases where the user moves the cursur using the + // keyboard, or uses one of the browser's built-in keyboard shortcuts. + updateStatus(); + } + } + + public void onKeyDown(Widget sender, char keyCode, int modifiers) { + } + + public void onKeyPress(Widget sender, char keyCode, int modifiers) { + } + + public void onKeyUp(Widget sender, char keyCode, int modifiers) { + if (sender == richText) { + // We use the RichTextArea's onKeyUp event to update the toolbar status. + // This will catch any cases where the user moves the cursur using the + // keyboard, or uses one of the browser's built-in keyboard shortcuts. + updateStatus(); + } + } + } + + private static final RichTextArea.FontSize[] fontSizesConstants = new RichTextArea.FontSize[] { + RichTextArea.FontSize.XX_SMALL, RichTextArea.FontSize.X_SMALL, + RichTextArea.FontSize.SMALL, RichTextArea.FontSize.MEDIUM, + RichTextArea.FontSize.LARGE, RichTextArea.FontSize.X_LARGE, + RichTextArea.FontSize.XX_LARGE}; + + private Images images = (Images) GWT.create(Images.class); + private Strings strings = (Strings) GWT.create(Strings.class); + private EventListener listener = new EventListener(); + + private RichTextArea richText; + private RichTextArea.BasicFormatter basic; + private RichTextArea.ExtendedFormatter extended; + + private VerticalPanel outer = new VerticalPanel(); + private HorizontalPanel topPanel = new HorizontalPanel(); + private HorizontalPanel bottomPanel = new HorizontalPanel(); + private ToggleButton bold; + private ToggleButton italic; + private ToggleButton underline; + private ToggleButton subscript; + private ToggleButton superscript; + private ToggleButton strikethrough; + private PushButton indent; + private PushButton outdent; + private PushButton justifyLeft; + private PushButton justifyCenter; + private PushButton justifyRight; + private PushButton hr; + private PushButton ol; + private PushButton ul; + private PushButton insertImage; + private PushButton createLink; + private PushButton removeLink; + private PushButton removeFormat; + + private ListBox backColors; + private ListBox foreColors; + private ListBox fonts; + private ListBox fontSizes; + + /** + * Creates a new toolbar that drives the given rich text area. + * + * @param richText the rich text area to be controlled + */ + public RichTextToolbar(RichTextArea richText) { + this.richText = richText; + this.basic = richText.getBasicFormatter(); + this.extended = richText.getExtendedFormatter(); + + outer.add(topPanel); + outer.add(bottomPanel); + topPanel.setWidth("100%"); + bottomPanel.setWidth("100%"); + + initWidget(outer); + setStyleName("gwt-RichTextToolbar"); + + if (basic != null) { + topPanel.add(bold = createToggleButton(images.bold(), strings.bold())); + topPanel.add(italic = createToggleButton(images.italic(), strings.italic())); + topPanel.add(underline = createToggleButton(images.underline(), + strings.underline())); + topPanel.add(subscript = createToggleButton(images.subscript(), + strings.subscript())); + topPanel.add(superscript = createToggleButton(images.superscript(), + strings.superscript())); + topPanel.add(justifyLeft = createPushButton(images.justifyLeft(), + strings.justifyLeft())); + topPanel.add(justifyCenter = createPushButton(images.justifyCenter(), + strings.justifyCenter())); + topPanel.add(justifyRight = createPushButton(images.justifyRight(), + strings.justifyRight())); + } + + if (extended != null) { + topPanel.add(strikethrough = createToggleButton(images.strikeThrough(), + strings.strikeThrough())); + topPanel.add(indent = createPushButton(images.indent(), strings.indent())); + topPanel.add(outdent = createPushButton(images.outdent(), strings.outdent())); + topPanel.add(hr = createPushButton(images.hr(), strings.hr())); + topPanel.add(ol = createPushButton(images.ol(), strings.ol())); + topPanel.add(ul = createPushButton(images.ul(), strings.ul())); + topPanel.add(insertImage = createPushButton(images.insertImage(), + strings.insertImage())); + topPanel.add(createLink = createPushButton(images.createLink(), + strings.createLink())); + topPanel.add(removeLink = createPushButton(images.removeLink(), + strings.removeLink())); + topPanel.add(removeFormat = createPushButton(images.removeFormat(), + strings.removeFormat())); + } + + if (basic != null) { + bottomPanel.add(backColors = createColorList("Background")); + bottomPanel.add(foreColors = createColorList("Foreground")); + bottomPanel.add(fonts = createFontList()); + bottomPanel.add(fontSizes = createFontSizes()); + + // We only use these listeners for updating status, so don't hook them up + // unless at least basic editing is supported. + richText.addKeyboardListener(listener); + richText.addClickListener(listener); + } + } + + private ListBox createColorList(String caption) { + ListBox lb = new ListBox(); + lb.addChangeListener(listener); + lb.setVisibleItemCount(1); + + lb.addItem(caption); + lb.addItem(strings.white(), "white"); + lb.addItem(strings.black(), "black"); + lb.addItem(strings.red(), "red"); + lb.addItem(strings.green(), "green"); + lb.addItem(strings.yellow(), "yellow"); + lb.addItem(strings.blue(), "blue"); + return lb; + } + + private ListBox createFontList() { + ListBox lb = new ListBox(); + lb.addChangeListener(listener); + lb.setVisibleItemCount(1); + + lb.addItem(strings.font(), ""); + lb.addItem(strings.normal(), ""); + lb.addItem("Times New Roman", "Times New Roman"); + lb.addItem("Arial", "Arial"); + lb.addItem("Courier New", "Courier New"); + lb.addItem("Georgia", "Georgia"); + lb.addItem("Trebuchet", "Trebuchet"); + lb.addItem("Verdana", "Verdana"); + return lb; + } + + private ListBox createFontSizes() { + ListBox lb = new ListBox(); + lb.addChangeListener(listener); + lb.setVisibleItemCount(1); + + lb.addItem(strings.size()); + lb.addItem(strings.xxsmall()); + lb.addItem(strings.xsmall()); + lb.addItem(strings.small()); + lb.addItem(strings.medium()); + lb.addItem(strings.large()); + lb.addItem(strings.xlarge()); + lb.addItem(strings.xxlarge()); + return lb; + } + + private PushButton createPushButton(AbstractImagePrototype img, String tip) { + PushButton pb = new PushButton(img.createImage()); + pb.addClickListener(listener); + pb.setTitle(tip); + return pb; + } + + private ToggleButton createToggleButton(AbstractImagePrototype img, String tip) { + ToggleButton tb = new ToggleButton(img.createImage()); + tb.addClickListener(listener); + tb.setTitle(tip); + return tb; + } + + /** + * Updates the status of all the stateful buttons. + */ + private void updateStatus() { + if (basic != null) { + bold.setDown(basic.isBold()); + italic.setDown(basic.isItalic()); + underline.setDown(basic.isUnderlined()); + subscript.setDown(basic.isSubscript()); + superscript.setDown(basic.isSuperscript()); + } + + if (extended != null) { + strikethrough.setDown(extended.isStrikethrough()); + } + } +} + diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/backColors.gif b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/backColors.gif new file mode 100644 index 0000000000000000000000000000000000000000..ddfc1cea2c7c12f2319b63b8046a919fa77f49d3 GIT binary patch literal 104 zcmZ?wbhEHb6k!lyn8*ME|NsC0`ua5{5L|quPwsyt%ghOjPfSqupZ3S&(!$fz4U$jI@ib6i Gum%9=@*aBt literal 0 HcmV?d00001 diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/createLink.gif b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/createLink.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ab9e599f822b6fd9d2886ee4f06491b49ecda8f GIT binary patch literal 118 zcmZ?wbhEHb6k!lySi}GXXA*Os*4ID%j|vojvM@3*urTO=lz`MSFk5@Yu-R&bl)z_uT!D z1QdU=FfuUkGw6VHg3MrGarki3bM;<}*SQV<8x~Y{Gf7-(Ok!0iJvGg5UJR>3qWv?k m`Weg$i7OL18jkjvMRnT7#h)yU3=I4XIv|}O zGZ=us literal 0 HcmV?d00001 diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/gwtLogo.png b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/gwtLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..80728186d8cadc88b774cdbd1278a6ba02035ba0 GIT binary patch literal 11454 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 Y0R3Q}1uh($07*qoM6N<$f@Yup5C8xG literal 0 HcmV?d00001 diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/hr.gif b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/hr.gif new file mode 100644 index 0000000000000000000000000000000000000000..3fb1607e67a5e8f308167630d8ce6aa07b4c437a GIT binary patch literal 67 zcmZ?wbhEHb6k!lyXkY+=|Ns9h{$ycfU|?j>0r5dH3`|lz{VPwuR!2?&mzW?^W@8I8w%lGX&eqsOpziUrE`1145-~WF;e0u-t z{CS{(V1q$~;!hSv1_l`h9S{d(Cj;wz1@*p^%y}7ALM;pWj+k*o`>ZiMo7LO8QLV9I z!9)*%R?d{B3pqY5Y=?{j!&Xo0S?yvFv%k~(8iQ($u9#Cx;lV3DZEj4mJ9RX;IbMee zC8%+i^E7e^2uek(FiDjQaI^CW@V9oPmI(+{Oy=U}^;b1zojr+bDWAB5iVoY-WplX2 lgjO1`aIR(NQUt$*tD86`yqYXDTQdhGxJ literal 0 HcmV?d00001 diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/italic.gif b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/italic.gif new file mode 100644 index 0000000000000000000000000000000000000000..2b0a5a0a062ac0b66ea119a18243415205e88bf2 GIT binary patch literal 79 zcmZ?wbhEHb6k!lyn8*ME)z#H4EiM25|5yCU!pOkD%%B4j1<5loDa`3#dHOB?VwVNi eELR0r5dH3{0{;{VPwu0r5dH3`}x8{VPwu literal 0 HcmV?d00001 diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/justifyRight.gif b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/justifyRight.gif new file mode 100644 index 0000000000000000000000000000000000000000..99ee25836f15352e94799df649b6594e0bd284f2 GIT binary patch literal 855 zcmZ?wbhEHb6k!ly_|C{M3PwX0r5dH3{1*B{VPwuuqdo{+k&8 z4+{EkZ2VtP@V|=ke`n|aCMNs$?>}?q3}!Kl`L*G~#Ze2%I%J8H`KTrF9Y zq;-OyHCVLHnLn7h*(p{)uiP4$CLo%3i0^>vmSq@hw&d}+qLUIhebDepVSFc&C myljQDROl8Jd1*ccL6=qQ)-WiFs0z!7HS;-(cepz;SOWkbh-TXW literal 0 HcmV?d00001 diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/removeLink.gif b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/removeLink.gif new file mode 100644 index 0000000000000000000000000000000000000000..522ab4b29eef84c2952fc7920ae530f75d6b21b0 GIT binary patch literal 895 zcmZ?wbhEHb6k!ly_|5*%Sk1L5s7kfmD#h%)-GPs42k--`O Ds0r5dH3{2`h{VPwu0r5dH3{2`h{VPwu-QUo{A>o~UEjLcP evP<1bcw6i3?QDu(b2m7j^NHN{>zq9+gEatULm7zx literal 0 HcmV?d00001 diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/ul.gif b/src/com/itmill/toolkit/terminal/gwt/client/ui/richtextarea/ul.gif new file mode 100644 index 0000000000000000000000000000000000000000..01380dbb833be5fd96a1bad898d72fbdeadc1455 GIT binary patch literal 863 zcmZ?wbhEHb6k!ly_|C{M3PwX|Nl;ximB{CakA kLiC)*d5?R2IVUAmF*ORz&=tLUs`d7-bKmy`FfdpH03G5Xz5oCK literal 0 HcmV?d00001 diff --git a/src/com/itmill/toolkit/tests/TestForRichTextEditor.java b/src/com/itmill/toolkit/tests/TestForRichTextEditor.java new file mode 100644 index 0000000000..7b371625ee --- /dev/null +++ b/src/com/itmill/toolkit/tests/TestForRichTextEditor.java @@ -0,0 +1,52 @@ +package com.itmill.toolkit.tests; + +import com.itmill.toolkit.data.Property.ValueChangeEvent; +import com.itmill.toolkit.data.Property.ValueChangeListener; +import com.itmill.toolkit.ui.Button; +import com.itmill.toolkit.ui.CustomComponent; +import com.itmill.toolkit.ui.Label; +import com.itmill.toolkit.ui.OrderedLayout; +import com.itmill.toolkit.ui.RichTextArea; + +/** + * + * @author IT Mill Ltd. + */ +public class TestForRichTextEditor extends CustomComponent implements ValueChangeListener { + + private OrderedLayout main = new OrderedLayout(); + + private Label l; + + private RichTextArea rte; + + public TestForRichTextEditor() { + + setCompositionRoot(main); + createNewView(); + } + + public void createNewView() { + main.removeAllComponents(); + main + .addComponent(new Label( + "RTE uses google richtextArea and their examples toolbar.")); + + + rte = new RichTextArea(); + rte.addListener((ValueChangeListener) this); + + main.addComponent(rte); + + main.addComponent(new Button("commit content to label below")); + + l = new Label("", Label.CONTENT_XHTML); + main.addComponent(l); + + } + + public void valueChange(ValueChangeEvent event) { + l.setValue(rte.getValue()); + } + +} -- 2.39.5