r1040 - in trunk/src/main: java/org/ourproject/kune/platf java/org/ourproject/kune/platf/client/ui java/org/ourproject/kune/platf/client/ui/rte java/org/ourproject/kune/platf/client/ui/rte/impl java/org/ourproject/kune/workspace java/org/ourproject/kune/workspace/client/editor java/org/ourproject/kune/workspace/client/editor/insert java/org/ourproject/kune/workspace/client/editor/insert/abstractlink rails/publicspace/public/templates/basic
Author: vjrj Date: 2009-01-27 02:24:24 +0100 (Tue, 27 Jan 2009) New Revision: 1040 Added: trunk/src/main/java/org/ourproject/kune/platf/RichText.gwt.xml trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/RichTextArea.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImpl.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplIE6.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplMozilla.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplOpera.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplSafari.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplStandard.java Modified: trunk/src/main/java/org/ourproject/kune/platf/Kune-Platform.gwt.xml trunk/src/main/java/org/ourproject/kune/workspace/Kune-Workspace.gwt.xml trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPanel.java trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorToolbar.java trunk/src/main/java/org/ourproject/kune/workspace/client/editor/WrappedRichTextAreaImplIE6.java trunk/src/main/java/org/ourproject/kune/workspace/client/editor/WrappedRichTextAreaImplMozilla.java trunk/src/main/java/org/ourproject/kune/workspace/client/editor/WrappedRichTextAreaImplOpera.java trunk/src/main/java/org/ourproject/kune/workspace/client/editor/WrappedRichTextAreaImplSafari.java trunk/src/main/java/org/ourproject/kune/workspace/client/editor/insert/TextEditorInsertElement.java trunk/src/main/java/org/ourproject/kune/workspace/client/editor/insert/TextEditorInsertElementPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/editor/insert/abstractlink/TextEditorInsertAbstractPresenter.java trunk/src/main/rails/publicspace/public/templates/basic/docs.liquid.html Log: RichTextArea copy and extension to add insertHtml Modified: trunk/src/main/java/org/ourproject/kune/platf/Kune-Platform.gwt.xml =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/Kune-Platform.gwt.xml 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/platf/Kune-Platform.gwt.xml 2009-01-27 01:24:24 UTC (rev 1040) @@ -4,7 +4,7 @@ <inherits name='com.google.gwt.user.User' /> <inherits name='com.google.gwt.i18n.I18N' /> <inherits name="com.google.gwt.user.UserAgent" /> - + <inherits name="org.ourproject.kune.platf.RichText" /> <public path="public" /> </module> Added: trunk/src/main/java/org/ourproject/kune/platf/RichText.gwt.xml =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/RichText.gwt.xml 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/platf/RichText.gwt.xml 2009-01-27 01:24:24 UTC (rev 1040) @@ -0,0 +1,59 @@ +<!-- --> +<!-- Copyright 2008 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 --> +<!-- 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. License for the specific language governing permissions and --> +<!-- limitations under the License. --> + +<!-- Deferred binding rules for browser selection. --> +<!-- --> +<module> + <inherits name="com.google.gwt.core.Core" /> + <inherits name="com.google.gwt.user.UserAgent" /> + + <!-- IE-specific implementation --> + <replace-with + class="org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplIE6"> + <when-type-is + class="org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl" /> + <when-property-is name="user.agent" value="ie6" /> + </replace-with> + + <!-- Mozilla-specific implementation --> + <replace-with + class="org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplMozilla"> + <when-type-is + class="org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl" /> + <any> + <when-property-is name="user.agent" value="gecko1_8" /> + <when-property-is name="user.agent" value="gecko" /> + </any> + </replace-with> + + <!-- Safari-specific implementation --> + <replace-with + class="org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplSafari"> + <when-type-is + class="org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl" /> + <any> + <when-property-is name="user.agent" value="safari" /> + </any> + </replace-with> + + <!-- Opera-specific implementation --> + <replace-with + class="org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplOpera"> + <when-type-is + class="org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl" /> + <any> + <when-property-is name="user.agent" value="opera" /> + </any> + </replace-with> +</module> Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/RichTextArea.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/RichTextArea.java 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/RichTextArea.java 2009-01-27 01:24:24 UTC (rev 1040) @@ -0,0 +1,451 @@ +/* + * 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 org.ourproject.kune.platf.client.ui.rte; + +import org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.ui.FocusWidget; +import com.google.gwt.user.client.ui.HasHTML; +import com.google.gwt.user.client.ui.MouseListener; +import com.google.gwt.user.client.ui.MouseListenerCollection; +import com.google.gwt.user.client.ui.SourcesMouseEvents; + +/** + * 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='RichTextArea.png'/> + * </p> + * + * <h3>CSS Style Rules</h3> <ul class="css"> <li>.gwt-RichTextArea { }</li> + * </ul> + */ +public class RichTextArea extends FocusWidget implements HasHTML, SourcesMouseEvents { + + /** + * 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. + */ + 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(); + } + + /** + * 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. + */ + 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 html + */ + 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 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 an XX-Small font. + */ + public static final FontSize XX_SMALL = new FontSize(1); + + /** + * Represents an X-Small font. + */ + public static final FontSize X_SMALL = new FontSize(2); + + /** + * Represents a Small font. + */ + public static final FontSize SMALL = new FontSize(3); + + /** + * Represents a Medium font. + */ + public static final FontSize MEDIUM = new FontSize(4); + + /** + * Represents a Large font. + */ + public static final FontSize LARGE = new FontSize(5); + + /** + * Represents an X-Large font. + */ + public static final FontSize X_LARGE = new FontSize(6); + + /** + * Represents an XX-Large font. + */ + public static final FontSize XX_LARGE = new FontSize(7); + + private final 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); + } + } + + /** + * 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"); + + /** + * Left justification. + */ + public static final Justification LEFT = new Justification("Left"); + + /** + * Right justification. + */ + public static final Justification RIGHT = new Justification("Right"); + + private final String tag; + + private Justification(String tag) { + this.tag = tag; + } + + @Override + public String toString() { + return "Justify " + tag; + } + } + + private final RichTextAreaImpl impl = GWT.create(RichTextAreaImpl.class); + private MouseListenerCollection mouseListeners; + + /** + * Creates a new, blank {@link RichTextArea} object with no stylesheet. + */ + public RichTextArea() { + setElement(impl.getElement()); + setStyleName("gwt-RichTextArea"); + } + + public void addMouseListener(MouseListener listener) { + if (mouseListeners == null) { + mouseListeners = new MouseListenerCollection(); + } + mouseListeners.add(listener); + } + + /** + * 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; + } + + public String getHTML() { + return impl.getHTML(); + } + + public String getText() { + return impl.getText(); + } + + @Override + public void onBrowserEvent(Event event) { + switch (DOM.eventGetType(event)) { + case Event.ONMOUSEDOWN: + case Event.ONMOUSEUP: + case Event.ONMOUSEMOVE: + case Event.ONMOUSEOVER: + case Event.ONMOUSEOUT: + if (mouseListeners != null) { + mouseListeners.fireMouseEvent(this, event); + } + break; + + default: + // ClickEvents, KeyboardEvents, and FocusEvents + super.onBrowserEvent(event); + } + } + + public void removeMouseListener(MouseListener listener) { + if (mouseListeners != null) { + mouseListeners.remove(listener); + } + } + + @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 setText(String text) { + impl.setText(text); + } + + @Override + protected void onAttach() { + super.onAttach(); + impl.initElement(); + } + + @Override + protected void onDetach() { + super.onDetach(); + impl.uninitElement(); + } +} Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImpl.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImpl.java 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImpl.java 2009-01-27 01:24:24 UTC (rev 1040) @@ -0,0 +1,92 @@ +/* + * 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 org.ourproject.kune.platf.client.ui.rte.impl; + +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.Event; + +/** + * Base class for RichText platform implementations. The default version simply + * creates a text area with no rich text support. + * + * This is not currently used by any user-agent, but will provide a + * <textarea> fallback in the event a future browser fails to implement + * rich text editing. + */ +public class RichTextAreaImpl { + + protected Element elem; + + public RichTextAreaImpl() { + elem = createElement(); + } + + public Element getElement() { + return elem; + } + + public String getHTML() { + return DOM.getElementProperty(elem, "value"); + } + + public String getText() { + return DOM.getElementProperty(elem, "value"); + } + + public void initElement() { + onElementInitialized(); + } + + public boolean isBasicEditingSupported() { + return false; + } + + public boolean isExtendedEditingSupported() { + return false; + } + + public native void setFocus(boolean focused) /*-{ + if (focused) { + this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.focus(); + } else { + this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.blur(); + } + }-*/; + + public void setHTML(String html) { + DOM.setElementProperty(elem, "value", html); + } + + public void setText(String text) { + DOM.setElementProperty(elem, "value", text); + } + + public void uninitElement() { + } + + protected Element createElement() { + return DOM.createTextArea(); + } + + protected void hookEvents() { + DOM.sinkEvents(elem, Event.MOUSEEVENTS | Event.KEYEVENTS | Event.ONCHANGE | Event.ONCLICK | Event.FOCUSEVENTS); + } + + protected void onElementInitialized() { + hookEvents(); + } +} Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplIE6.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplIE6.java 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplIE6.java 2009-01-27 01:24:24 UTC (rev 1040) @@ -0,0 +1,130 @@ +/* + * Copyright 2008 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 org.ourproject.kune.platf.client.ui.rte.impl; + +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Element; + +/** + * IE6-specific implementation of rich-text editing. + */ +public class RichTextAreaImplIE6 extends RichTextAreaImplStandard { + + @Override + public Element createElement() { + Element elem = super.createElement(); + DOM.setElementProperty(elem, "src", "javascript:''"); + return elem; + } + + @Override + public native void initElement() /*-{ + var _this = this; + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplStandard::initializing = true; + + setTimeout(function() { + if (_this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplStandard::initializing == false) { + return; + } + + // Attempt to set the iframe document's body to 'contentEditable' mode. + // There's no way to know when the body will actually be available, so + // keep trying every so often until it is. + // Note: The body seems to be missing only rarely, so please don't remove + // this retry loop just because it's hard to reproduce. + var elem = _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem; + var doc = elem.contentWindow.document; + if (!doc.body) { + // Retry in 50 ms. Faster would run the risk of pegging the CPU. Slower + // would increase the probability of a user-visible delay. + setTimeout(arguments.callee, 50); + return; + } + doc.body.contentEditable = true; + + // Send notification that the iframe has reached design mode. + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplStandard::onElementInitialized()(); + }, 1); + }-*/; + + @Override + protected native String getTextImpl() /*-{ + var elem = this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem; + return elem.contentWindow.document.body.innerText; + }-*/; + + @Override + protected native void hookEvents() /*-{ + var elem = this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem; + var body = elem.contentWindow.document.body; + + var handler = function() { + if (elem.__listener) { + // Weird: this code has the context of the script frame, but we need the + // event from the edit iframe's window. + var evt = elem.contentWindow.event; + elem.__listener.@org.ourproject.kune.platf.client.ui.rte.RichTextArea::onBrowserEvent(Lcom/google/gwt/user/client/Event;)(evt); + } + }; + + body.onkeydown = + body.onkeyup = + body.onkeypress = + body.onmousedown = + body.onmouseup = + body.onmousemove = + body.onmouseover = + body.onmouseout = + body.onclick = handler; + + elem.contentWindow.onfocus = + elem.contentWindow.onblur = handler; + }-*/; + + @Override + protected native void setTextImpl(String text) /*-{ + var elem = this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem; + elem.contentWindow.document.body.innerText = text; + }-*/; + + @Override + protected native void unhookEvents() /*-{ + var elem = this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem; + var body = elem.contentWindow.document.body; + + if (body) { + // The body can be undefined in the relatively obscure case that the RTA + // is attached and detached before it has a chance to finish initializing. + body.onkeydown = + body.onkeyup = + body.onkeypress = + body.onmousedown = + body.onmouseup = + body.onmousemove = + body.onmouseover = + body.onmouseout = + body.onclick = null; + + elem.contentWindow.onfocus = + elem.contentWindow.onblur = null; + } + }-*/; + + @Override + boolean isRichEditingActive(Element elem) { + return true; + } +} Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplMozilla.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplMozilla.java 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplMozilla.java 2009-01-27 01:24:24 UTC (rev 1040) @@ -0,0 +1,59 @@ +/* + * Copyright 2008 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 org.ourproject.kune.platf.client.ui.rte.impl; + +/** + * Mozilla-specific implementation of rich-text editing. + */ +public class RichTextAreaImplMozilla extends RichTextAreaImplStandard { + + @Override + public native void initElement() /*-{ + // Mozilla doesn't allow designMode to be set reliably until the iframe is + // fully loaded. + var _this = this; + var iframe = _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem; + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplStandard::initializing = true; + + iframe.onload = function() { + // Some Mozillae have the nasty habit of calling onload again when you set + // designMode, so let's avoid doing it more than once. + iframe.onload = null; + + // Send notification that the iframe has finished loading. + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplStandard::onElementInitialized()(); + + // Don't set designMode until the RTA actually gets focused. This is + // necessary because editing won't work on Mozilla if the iframe is + // *hidden, but attached*. Waiting for focus gets around this issue. + // + // Note: This onfocus will not conflict with the addEventListener('focus', + // ...) // in RichTextAreaImplStandard. + iframe.contentWindow.onfocus = function() { + iframe.contentWindow.onfocus = null; + iframe.contentWindow.document.designMode = 'On'; + }; + }; + }-*/; + + @Override + public void setBackColor(String color) { + // Gecko uses 'BackColor' for the *entire area's* background. + // 'HiliteColor' + // does what we actually want. + execCommand("HiliteColor", color); + } +} Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplOpera.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplOpera.java 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplOpera.java 2009-01-27 01:24:24 UTC (rev 1040) @@ -0,0 +1,40 @@ +/* + * 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 org.ourproject.kune.platf.client.ui.rte.impl; + +/** + * Opera implementation of rich-text editing. + */ +public class RichTextAreaImplOpera extends RichTextAreaImplStandard { + + @Override + public void setBackColor(String color) { + // Opera uses 'BackColor' for the *entire area's* background. + // 'HiliteColor' + // does what we actually want. + execCommand("HiliteColor", color); + } + + @Override + public native void setFocus(boolean focused) /*-{ + // Opera needs the *iframe* focused, not its window. + if (focused) { + this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.focus(); + } else { + this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.blur(); + } + }-*/; +} Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplSafari.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplSafari.java 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplSafari.java 2009-01-27 01:24:24 UTC (rev 1040) @@ -0,0 +1,227 @@ +/* + * 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 org.ourproject.kune.platf.client.ui.rte.impl; + +import com.google.gwt.user.client.Element; +import org.ourproject.kune.platf.client.ui.rte.RichTextArea.FontSize; + +/** + * Safari rich text platform implementation. + */ +public class RichTextAreaImplSafari extends RichTextAreaImplStandard { + + private static final String[] sizeNumberCSSValues = new String[] { "medium", "xx-small", "x-small", "small", + "medium", "large", "x-large", "xx-large" }; + + private static int webKitVersion = getWebKitVersion(); + + /** + * WebKit v420 began suppporting full rich text editing. + */ + private static boolean extendedEditingSupported = (webKitVersion >= 420); + + /** + * WebKit v420 changed BackColor to HiliteColor. + */ + private static boolean useHiliteColor = (webKitVersion >= 420); + + /** + * WebKit version up to *and including* 420 require CSS font-size values + * (e.g. 'medium', 'x-large') rather than size numbers. All subsequent + * versions use size numbers like other browsers. + */ + private static boolean oldSchoolSizeValues = (webKitVersion <= 420); + + private static native int getWebKitVersion() /*-{ + var exp = / AppleWebKit\/([\d]+)/; + var result = exp.exec(navigator.userAgent); + if (result) { + var version = parseInt(result[1]); + if (version) { + return version; + } + } + + // Intentionally conservative fallback. + return 0; + }-*/;; + + @Override + public Element createElement() { + return super.createElement(); + } + + @Override + public native boolean isBold() /*-{ + return !!this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.__gwt_isBold; + }-*/; + + @Override + public boolean isExtendedEditingSupported() { + return extendedEditingSupported; + } + + @Override + public native boolean isItalic() /*-{ + return !!this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.__gwt_isItalic; + }-*/; + + @Override + public native boolean isUnderlined() /*-{ + return !!this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.__gwt_isUnderlined; + }-*/; + + @Override + public void setBackColor(String color) { + if (useHiliteColor) { + execCommand("HiliteColor", color); + } else { + super.setBackColor(color); + } + } + + @Override + public native void setFocus(boolean focused) /*-{ + // Safari needs the *iframe* focused, not its window. + var elem = this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem; + if (focused) { + elem.focus(); + if (elem.__gwt_restoreSelection) { + elem.__gwt_restoreSelection(); + } + } else { + elem.blur(); + } + }-*/; + + @Override + public void setFontSize(FontSize fontSize) { + if (oldSchoolSizeValues) { + // Safari2 only accepts css-style 'small, medium, large, etc' + // values. + // Setting these doesn't seem to hurt Safari3. + int number = fontSize.getNumber(); + if ((number >= 0) && (number <= 7)) { + execCommand("FontSize", sizeNumberCSSValues[number]); + } + } else { + super.setFontSize(fontSize); + } + } + + @Override + protected native String getTextImpl() /*-{ + return this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.contentWindow.document.body.innerText; + }-*/; + + @Override + protected native void hookEvents() /*-{ + var elem = this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem; + var wnd = elem.contentWindow; + var doc = wnd.document; + + // Create an expando on the element to hold the selection state. + elem.__gwt_selection = { baseOffset:0, extentOffset:0, baseNode:null, + extentNode:null }; + + // A function for restoring the selection state. + elem.__gwt_restoreSelection = function() { + var sel = elem.__gwt_selection; + + // wnd.getSelection is not defined if the iframe isn't attached. + if (wnd.getSelection) { + wnd.getSelection().setBaseAndExtent(sel.baseNode, sel.baseOffset, + sel.extentNode, sel.extentOffset); + } + }; + + // Generic event dispatcher. Also stores selection state. + elem.__gwt_handler = function(evt) { + // Store the editor's selection state. + var s = wnd.getSelection(); + elem.__gwt_selection = { + baseOffset:s.baseOffset, + extentOffset:s.extentOffset, + + baseNode:s.baseNode, + extentNode:s.extentNode + }; + + // Hang on to bold/italic/underlined states. + elem.__gwt_isBold = doc.queryCommandState('Bold'); + elem.__gwt_isItalic = doc.queryCommandState('Italic'); + elem.__gwt_isUnderlined = doc.queryCommandState('Underline'); + + // Dispatch the event. + if (elem.__listener) { + elem.__listener.@org.ourproject.kune.platf.client.ui.rte.RichTextArea::onBrowserEvent(Lcom/google/gwt/user/client/Event;)(evt); + } + }; + + wnd.addEventListener('keydown', elem.__gwt_handler, true); + wnd.addEventListener('keyup', elem.__gwt_handler, true); + wnd.addEventListener('keypress', elem.__gwt_handler, true); + wnd.addEventListener('mousedown', elem.__gwt_handler, true); + wnd.addEventListener('mouseup', elem.__gwt_handler, true); + wnd.addEventListener('mousemove', elem.__gwt_handler, true); + wnd.addEventListener('mouseover', elem.__gwt_handler, true); + wnd.addEventListener('mouseout', elem.__gwt_handler, true); + wnd.addEventListener('click', elem.__gwt_handler, true); + + // Focus/blur event handlers. For some reason, [add|remove]eventListener() + // doesn't work on the iframe element (at least not for focus/blur). Don't + // dispatch through the normal handler method, as some of the querying we do + // there interferes with focus. + elem.onfocus = function(evt) { + if (elem.__listener) { + elem.__listener.@org.ourproject.kune.platf.client.ui.rte.RichTextArea::onBrowserEvent(Lcom/google/gwt/user/client/Event;)(evt); + } + }; + + elem.onblur = function(evt) { + if (elem.__listener) { + elem.__listener.@org.ourproject.kune.platf.client.ui.rte.RichTextArea::onBrowserEvent(Lcom/google/gwt/user/client/Event;)(evt); + } + }; + }-*/; + + @Override + protected native void setTextImpl(String text) /*-{ + this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.contentWindow.document.body.innerText = text; + }-*/; + + @Override + protected native void unhookEvents() /*-{ + var elem = this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem; + var wnd = elem.contentWindow; + + wnd.removeEventListener('keydown', elem.__gwt_handler, true); + wnd.removeEventListener('keyup', elem.__gwt_handler, true); + wnd.removeEventListener('keypress', elem.__gwt_handler, true); + wnd.removeEventListener('mousedown', elem.__gwt_handler, true); + wnd.removeEventListener('mouseup', elem.__gwt_handler, true); + wnd.removeEventListener('mousemove', elem.__gwt_handler, true); + wnd.removeEventListener('mouseover', elem.__gwt_handler, true); + wnd.removeEventListener('mouseout', elem.__gwt_handler, true); + wnd.removeEventListener('click', elem.__gwt_handler, true); + + elem.__gwt_restoreSelection = null; + elem.__gwt_handler = null; + + elem.onfocus = null; + elem.onblur = null; + }-*/; +} Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplStandard.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplStandard.java 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/impl/RichTextAreaImplStandard.java 2009-01-27 01:24:24 UTC (rev 1040) @@ -0,0 +1,406 @@ +/* + * Copyright 2008 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 org.ourproject.kune.platf.client.ui.rte.impl; + +import org.ourproject.kune.platf.client.ui.rte.RichTextArea; +import org.ourproject.kune.platf.client.ui.rte.RichTextArea.FontSize; +import org.ourproject.kune.platf.client.ui.rte.RichTextArea.Justification; + +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Element; + +/** + * Basic rich text platform implementation. + */ +public abstract class RichTextAreaImplStandard extends RichTextAreaImpl implements RichTextArea.BasicFormatter, + RichTextArea.ExtendedFormatter { + + /** + * Holds a cached copy of any user setHTML/setText actions until the real + * text area is fully initialized. Becomes <code>null</code> after init. + */ + private Element beforeInitPlaceholder = DOM.createDiv(); + + /** + * Set to true when the {@link RichTextArea} is attached to the page and + * {@link #initElement()} is called. If the {@link RichTextArea} is detached + * before {@link #onElementInitialized()} is called, this will be set to + * false. See issue 1897 for details. + */ + protected boolean initializing; + + @Override + public native Element createElement() /*-{ + return $doc.createElement('iframe'); + }-*/; + + public void createLink(String url) { + execCommand("CreateLink", url); + } + + public String getBackColor() { + return queryCommandValue("BackColor"); + } + + public String getForeColor() { + return queryCommandValue("ForeColor"); + } + + @Override + public final String getHTML() { + return beforeInitPlaceholder == null ? getHTMLImpl() : DOM.getInnerHTML(beforeInitPlaceholder); + } + + @Override + public final String getText() { + return beforeInitPlaceholder == null ? getTextImpl() : DOM.getInnerText(beforeInitPlaceholder); + } + + @Override + public native void initElement() /*-{ + // Most browsers don't like setting designMode until slightly _after_ + // the iframe becomes attached to the DOM. Any non-zero timeout will do + // just fine. + var _this = this; + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplStandard::initializing = true; + setTimeout(function() { + // Turn on design mode. + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.contentWindow.document.designMode = 'On'; + + // Send notification that the iframe has reached design mode. + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplStandard::onElementInitialized()(); + }, 1); + }-*/; + + public void insertHorizontalRule() { + execCommand("InsertHorizontalRule", null); + } + + public void insertHtml(String html) { + execCommand("InsertHtml", html); + } + + public void insertImage(String url) { + execCommand("InsertImage", url); + } + + public void insertOrderedList() { + execCommand("InsertOrderedList", null); + } + + public void insertUnorderedList() { + execCommand("InsertUnorderedList", null); + } + + @Override + public boolean isBasicEditingSupported() { + return true; + } + + public boolean isBold() { + return queryCommandState("Bold"); + } + + @Override + public boolean isExtendedEditingSupported() { + return true; + } + + public boolean isItalic() { + return queryCommandState("Italic"); + } + + public boolean isStrikethrough() { + return queryCommandState("Strikethrough"); + } + + public boolean isSubscript() { + return queryCommandState("Subscript"); + } + + public boolean isSuperscript() { + return queryCommandState("Superscript"); + } + + public boolean isUnderlined() { + return queryCommandState("Underline"); + } + + public void leftIndent() { + execCommand("Outdent", null); + } + + public void removeFormat() { + execCommand("RemoveFormat", null); + } + + public void removeLink() { + execCommand("Unlink", "false"); + } + + public void rightIndent() { + execCommand("Indent", null); + } + + public void selectAll() { + execCommand("SelectAll", null); + } + + public void setBackColor(String color) { + execCommand("BackColor", color); + } + + @Override + public native void setFocus(boolean focused) /*-{ + if (focused) { + this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.contentWindow.focus(); + } else { + this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.contentWindow.blur(); + } + }-*/; + + public void setFontName(String name) { + execCommand("FontName", name); + } + + public void setFontSize(FontSize fontSize) { + execCommand("FontSize", Integer.toString(fontSize.getNumber())); + } + + public void setForeColor(String color) { + execCommand("ForeColor", color); + } + + @Override + public final void setHTML(String html) { + if (beforeInitPlaceholder == null) { + setHTMLImpl(html); + } else { + DOM.setInnerHTML(beforeInitPlaceholder, html); + } + } + + public void setJustification(Justification justification) { + if (justification == Justification.CENTER) { + execCommand("JustifyCenter", null); + } else if (justification == Justification.LEFT) { + execCommand("JustifyLeft", null); + } else if (justification == Justification.RIGHT) { + execCommand("JustifyRight", null); + } + } + + @Override + public final void setText(String text) { + if (beforeInitPlaceholder == null) { + setTextImpl(text); + } else { + DOM.setInnerText(beforeInitPlaceholder, text); + } + } + + public void toggleBold() { + execCommand("Bold", "false"); + } + + public void toggleItalic() { + execCommand("Italic", "false"); + } + + public void toggleStrikethrough() { + execCommand("Strikethrough", "false"); + } + + public void toggleSubscript() { + execCommand("Subscript", "false"); + } + + public void toggleSuperscript() { + execCommand("Superscript", "false"); + } + + public void toggleUnderline() { + execCommand("Underline", "False"); + } + + @Override + public void uninitElement() { + // Issue 1897: initElement uses a timeout, so its possible to call this + // method after calling initElement, but before the event system is in + // place. + if (initializing) { + initializing = false; + return; + } + + // Unhook all custom event handlers when the element is detached. + unhookEvents(); + + // Recreate the placeholder element and store the iframe's contents in + // it. + // This is necessary because some browsers will wipe the iframe's + // contents + // when it is removed from the DOM. + String html = getHTML(); + beforeInitPlaceholder = DOM.createDiv(); + DOM.setInnerHTML(beforeInitPlaceholder, html); + } + + protected native String getHTMLImpl() /*-{ + return this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.contentWindow.document.body.innerHTML; + }-*/; + + protected native String getTextImpl() /*-{ + return this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.contentWindow.document.body.textContent; + }-*/; + + @Override + protected native void hookEvents() /*-{ + var elem = this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem; + var wnd = elem.contentWindow; + + elem.__gwt_handler = function(evt) { + if (elem.__listener) { + elem.__listener.@org.ourproject.kune.platf.client.ui.rte.RichTextArea::onBrowserEvent(Lcom/google/gwt/user/client/Event;)(evt); + } + }; + + elem.__gwt_focusHandler = function(evt) { + if (elem.__gwt_isFocused) { + return; + } + + elem.__gwt_isFocused = true; + elem.__gwt_handler(evt); + }; + + elem.__gwt_blurHandler = function(evt) { + if (!elem.__gwt_isFocused) { + return; + } + + elem.__gwt_isFocused = false; + elem.__gwt_handler(evt); + }; + + wnd.addEventListener('keydown', elem.__gwt_handler, true); + wnd.addEventListener('keyup', elem.__gwt_handler, true); + wnd.addEventListener('keypress', elem.__gwt_handler, true); + wnd.addEventListener('mousedown', elem.__gwt_handler, true); + wnd.addEventListener('mouseup', elem.__gwt_handler, true); + wnd.addEventListener('mousemove', elem.__gwt_handler, true); + wnd.addEventListener('mouseover', elem.__gwt_handler, true); + wnd.addEventListener('mouseout', elem.__gwt_handler, true); + wnd.addEventListener('click', elem.__gwt_handler, true); + + wnd.addEventListener('focus', elem.__gwt_focusHandler, true); + wnd.addEventListener('blur', elem.__gwt_blurHandler, true); + }-*/; + + @Override + protected void onElementInitialized() { + // Issue 1897: This method is called after a timeout, during which time + // the + // element might by detached. + if (!initializing) { + return; + } + initializing = false; + + super.onElementInitialized(); + + // When the iframe is ready, ensure cached content is set. + if (beforeInitPlaceholder != null) { + setHTMLImpl(DOM.getInnerHTML(beforeInitPlaceholder)); + beforeInitPlaceholder = null; + } + } + + protected native void setHTMLImpl(String html) /*-{ + this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.contentWindow.document.body.innerHTML = html; + }-*/; + + protected native void setTextImpl(String text) /*-{ + this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.contentWindow.document.body.textContent = text; + }-*/; + + protected native void unhookEvents() /*-{ + var elem = this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem; + var wnd = elem.contentWindow; + + wnd.removeEventListener('keydown', elem.__gwt_handler, true); + wnd.removeEventListener('keyup', elem.__gwt_handler, true); + wnd.removeEventListener('keypress', elem.__gwt_handler, true); + wnd.removeEventListener('mousedown', elem.__gwt_handler, true); + wnd.removeEventListener('mouseup', elem.__gwt_handler, true); + wnd.removeEventListener('mousemove', elem.__gwt_handler, true); + wnd.removeEventListener('mouseover', elem.__gwt_handler, true); + wnd.removeEventListener('mouseout', elem.__gwt_handler, true); + wnd.removeEventListener('click', elem.__gwt_handler, true); + + wnd.removeEventListener('focus', elem.__gwt_focusHandler, true); + wnd.removeEventListener('blur', elem.__gwt_blurHandler, true); + + elem.__gwt_handler = null; + elem.__gwt_focusHandler = null; + elem.__gwt_blurHandler = null; + }-*/; + + void execCommand(String cmd, String param) { + if (isRichEditingActive(elem)) { + // When executing a command, focus the iframe first, since some + // commands + // don't take properly when it's not focused. + setFocus(true); + execCommandAssumingFocus(cmd, param); + } + } + + native void execCommandAssumingFocus(String cmd, String param) /*-{ + this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.contentWindow.document.execCommand(cmd, false, param); + }-*/; + + native boolean isRichEditingActive(Element e) /*-{ + return ((e.contentWindow.document.designMode).toUpperCase()) == 'ON'; + }-*/; + + boolean queryCommandState(String cmd) { + if (isRichEditingActive(elem)) { + // When executing a command, focus the iframe first, since some + // commands + // don't take properly when it's not focused. + setFocus(true); + return queryCommandStateAssumingFocus(cmd); + } else { + return false; + } + } + + native boolean queryCommandStateAssumingFocus(String cmd) /*-{ + return !!this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.contentWindow.document.queryCommandState(cmd); + }-*/; + + String queryCommandValue(String cmd) { + // When executing a command, focus the iframe first, since some commands + // don't take properly when it's not focused. + setFocus(true); + return queryCommandValueAssumingFocus(cmd); + } + + native String queryCommandValueAssumingFocus(String cmd) /*-{ + return this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.contentWindow.document.queryCommandValue(cmd); + }-*/; +} Modified: trunk/src/main/java/org/ourproject/kune/workspace/Kune-Workspace.gwt.xml =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/Kune-Workspace.gwt.xml 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/workspace/Kune-Workspace.gwt.xml 2009-01-27 01:24:24 UTC (rev 1040) @@ -1,48 +1,48 @@ <!DOCTYPE document SYSTEM "src/main/java/gwt-module.dtd"> <module> - <inherits name='org.ourproject.kune.platf.Kune-Platform' /> - <inherits name="com.google.gwt.core.Core" /> - <inherits name="com.google.gwt.user.UserAgent" /> - <!-- RTE css inject --> - <!-- See gwt-user: com/google/gwt/user/RichText.gwt.xml --> + <inherits name='org.ourproject.kune.platf.Kune-Platform' /> + <inherits name="com.google.gwt.core.Core" /> + <inherits name="com.google.gwt.user.UserAgent" /> + <!-- RTE css inject --> + <!-- See gwt-user: com/google/gwt/user/RichText.gwt.xml --> - <!-- IE-specific implementation --> - <replace-with - class="org.ourproject.kune.workspace.client.editor.WrappedRichTextAreaImplIE6"> - <when-type-is - class="com.google.gwt.user.client.ui.impl.RichTextAreaImpl" /> - <when-property-is name="user.agent" value="ie6" /> - </replace-with> + <!-- IE-specific implementation --> + <replace-with + class="org.ourproject.kune.workspace.client.editor.WrappedRichTextAreaImplIE6"> + <when-type-is + class="org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl" /> + <when-property-is name="user.agent" value="ie6" /> + </replace-with> - <!-- Mozilla-specific implementation --> - <replace-with - class="org.ourproject.kune.workspace.client.editor.WrappedRichTextAreaImplMozilla"> - <when-type-is - class="com.google.gwt.user.client.ui.impl.RichTextAreaImpl" /> - <any> - <when-property-is name="user.agent" value="gecko1_8" /> - <when-property-is name="user.agent" value="gecko" /> - </any> - </replace-with> + <!-- Mozilla-specific implementation --> + <replace-with + class="org.ourproject.kune.workspace.client.editor.WrappedRichTextAreaImplMozilla"> + <when-type-is + class="org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl" /> + <any> + <when-property-is name="user.agent" value="gecko1_8" /> + <when-property-is name="user.agent" value="gecko" /> + </any> + </replace-with> - <!-- Safari-specific implementation --> - <replace-with - class="org.ourproject.kune.workspace.client.editor.WrappedRichTextAreaImplSafari"> - <when-type-is - class="com.google.gwt.user.client.ui.impl.RichTextAreaImpl" /> - <any> - <when-property-is name="user.agent" value="safari" /> - </any> - </replace-with> + <!-- Safari-specific implementation --> + <replace-with + class="org.ourproject.kune.workspace.client.editor.WrappedRichTextAreaImplSafari"> + <when-type-is + class="org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl" /> + <any> + <when-property-is name="user.agent" value="safari" /> + </any> + </replace-with> - <!-- Opera-specific implementation --> - <replace-with - class="org.ourproject.kune.workspace.client.editor.WrappedRichTextAreaImplOpera"> - <when-type-is - class="com.google.gwt.user.client.ui.impl.RichTextAreaImpl" /> - <any> - <when-property-is name="user.agent" value="opera" /> - </any> - </replace-with> + <!-- Opera-specific implementation --> + <replace-with + class="org.ourproject.kune.workspace.client.editor.WrappedRichTextAreaImplOpera"> + <when-type-is + class="org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl" /> + <any> + <when-property-is name="user.agent" value="opera" /> + </any> + </replace-with> </module> Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPanel.java 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorPanel.java 2009-01-27 01:24:24 UTC (rev 1040) @@ -21,13 +21,13 @@ import org.ourproject.kune.platf.client.services.I18nTranslationService; import org.ourproject.kune.platf.client.ui.palette.ColorWebSafePalette; +import org.ourproject.kune.platf.client.ui.rte.RichTextArea; import org.ourproject.kune.workspace.client.editor.insert.TextEditorInsertElement; import org.ourproject.kune.workspace.client.skel.Toolbar; import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Timer; -import com.google.gwt.user.client.ui.RichTextArea; import com.google.gwt.user.client.ui.VerticalPanel; import com.gwtext.client.widgets.BoxComponent; import com.gwtext.client.widgets.MessageBox; Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorToolbar.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorToolbar.java 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/editor/TextEditorToolbar.java 2009-01-27 01:24:24 UTC (rev 1040) @@ -22,6 +22,7 @@ import org.ourproject.kune.platf.client.services.I18nTranslationService; import org.ourproject.kune.platf.client.ui.KuneUiUtils; import org.ourproject.kune.platf.client.ui.palette.ColorWebSafePalette; +import org.ourproject.kune.platf.client.ui.rte.RichTextArea; import org.ourproject.kune.workspace.client.editor.insert.TextEditorInsertElement; import com.calclab.suco.client.events.Listener; @@ -36,7 +37,6 @@ import com.google.gwt.user.client.ui.KeyboardListener; import com.google.gwt.user.client.ui.MenuBar; 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; @@ -62,7 +62,7 @@ public EventListener(TextEditorInsertElement insertElement) { this.insertElement = insertElement; - insertElement.onInsert(new Listener2<String, String>() { + insertElement.addOnCreateLink(new Listener2<String, String>() { public void onEvent(String name, String url) { extended.createLink(url); } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/editor/WrappedRichTextAreaImplIE6.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/editor/WrappedRichTextAreaImplIE6.java 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/editor/WrappedRichTextAreaImplIE6.java 2009-01-27 01:24:24 UTC (rev 1040) @@ -19,7 +19,7 @@ */ package org.ourproject.kune.workspace.client.editor; -import com.google.gwt.user.client.ui.impl.RichTextAreaImplIE6; +import org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplIE6; /** * A wrapper used to inject css into RTA. As published in: @@ -35,33 +35,33 @@ @Override public native void initElement() /*-{ - var _this = this; - _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::initializing = true; + var _this = this; + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplStandard::initializing = true; - setTimeout(function() { - if (_this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::initializing == false) { - return; - } + setTimeout(function() { + if (_this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplStandard::initializing == false) { + return; + } - // Attempt to set the iframe document's body to 'contentEditable' mode. - // There's no way to know when the body will actually be available, so - // keep trying every so often until it is. - // Note: The body seems to be missing only rarely, so please don't remove - // this retry loop just because it's hard to reproduce. - var elem = [email protected]::elem; - var doc = elem.contentWindow.document; - if (!doc.body) { - // Retry in 50 ms. Faster would run the risk of pegging the CPU. Slower - // would increase the probability of a user-visible delay. - setTimeout(arguments.callee, 50); - return; - } - var ct = "<html><head><style>@import url('" + "css/richtext.css" + "');</style></head><body CONTENTEDITABLE='true'></body></html>" ; - doc.write( ct ); - doc.body.contentEditable = true; + // Attempt to set the iframe document's body to 'contentEditable' mode. + // There's no way to know when the body will actually be available, so + // keep trying every so often until it is. + // Note: The body seems to be missing only rarely, so please don't remove + // this retry loop just because it's hard to reproduce. + var elem = _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem; + var doc = elem.contentWindow.document; + if (!doc.body) { + // Retry in 50 ms. Faster would run the risk of pegging the CPU. Slower + // would increase the probability of a user-visible delay. + setTimeout(arguments.callee, 50); + return; + } + var ct = "<html><head><style>@import url('" + "css/richtext.css" + "');</style></head><body CONTENTEDITABLE='true'></body></html>" ; + doc.write( ct ); + doc.body.contentEditable = true; - // Send notification that the iframe has reached design mode. - _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::onElementInitialized()(); - }, 1); - }-*/; + // Send notification that the iframe has reached design mode. + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplStandard::onElementInitialized()(); + }, 1); + }-*/; } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/editor/WrappedRichTextAreaImplMozilla.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/editor/WrappedRichTextAreaImplMozilla.java 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/editor/WrappedRichTextAreaImplMozilla.java 2009-01-27 01:24:24 UTC (rev 1040) @@ -19,7 +19,7 @@ */ package org.ourproject.kune.workspace.client.editor; -import com.google.gwt.user.client.ui.impl.RichTextAreaImplMozilla; +import org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplMozilla; /** * A wrapper used to inject css into RTA. As published in: @@ -35,48 +35,48 @@ @Override public native void initElement() /*-{ - // Mozilla doesn't allow designMode to be set reliably until the iframe is - // fully loaded. - var _this = this; - var iframe = [email protected]::elem; - _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::initializing = true; + // Mozilla doesn't allow designMode to be set reliably until the iframe is + // fully loaded. + var _this = this; + var iframe = _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem; + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplStandard::initializing = true; - iframe.onload = function() { - // Some Mozillae have the nasty habit of calling onload again when you set - // designMode, so let's avoid doing it more than once. - iframe.onload = null; + iframe.onload = function() { + // Some Mozillae have the nasty habit of calling onload again when you set + // designMode, so let's avoid doing it more than once. + iframe.onload = null; - // patch ccs inject: + // patch ccs inject: - var doc = [email protected]::elem.contentWindow.document; - head=doc.getElementsByTagName('head')[0]; - link=document.createElement('link'); - link.setAttribute('rel',"stylesheet"); - link.setAttribute('type',"text/css"); - link.setAttribute('href',"css/richtext.css" ); - head.appendChild(link); + var doc = _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.contentWindow.document; + head=doc.getElementsByTagName('head')[0]; + link=document.createElement('link'); + link.setAttribute('rel',"stylesheet"); + link.setAttribute('type',"text/css"); + link.setAttribute('href',"css/richtext.css" ); + head.appendChild(link); - var styles = document.createElement('style'); - styles.setAttribute('type', 'text/css'); - var newStyle = document.createTextNode('\n<!--\nbody{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:400;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400;}q:before,q:after{content:\'\';}abbr,acronym{border:0;font-variant:normal;}sup,sub{line-height:-1px;vertical-align:text-top;}sub{vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;}body{font:13px/1.22 arial,helvetica,clean,sans-serif;font-size:small;font:x-small;}table{font-size:inherit;font:100%;}pre,code,kbd,samp,tt{font-family:monospace;font-size:108%;line-height:99%;}h1{font-size:138.5%;}h2{font-size:123.1%;}h3{font-size:108%;}h1,h2,h3{margin:1em 0;}h1,h2,h3,h4,h5,h6,strong{font-weight:700;}abbr,acronym{border-bottom:1px dotted #000;cursor:help;}em{font-style:italic;}blockquote,ul,ol,dl{margin:1em;}ol,ul,dl{margin-left:2em;}ol li{list-style:decimal outside;}ul li{list-style:disc outside;}dl dd{margin-left:1em;}th,td{border:1px solid #000;padding:.5em;}th{font-weight:700;text-align:center;}caption{margin-bottom:.5em;text-align:center;}p,fieldset,table,pre{margin-bottom:1em;}input[type=text],input[type=password],textarea{width:12.25em;width:11.9em;}body{font-family:arial, sans;margin:5px}\n-->\n'); - styles.appendChild(newStyle); - head.appendChild(styles); + var styles = document.createElement('style'); + styles.setAttribute('type', 'text/css'); + var newStyle = document.createTextNode('\n<!--\nbody{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:400;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400;}q:before,q:after{content:\'\';}abbr,acronym{border:0;font-variant:normal;}sup,sub{line-height:-1px;vertical-align:text-top;}sub{vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;}body{font:13px/1.22 arial,helvetica,clean,sans-serif;font-size:small;font:x-small;}table{font-size:inherit;font:100%;}pre,code,kbd,samp,tt{font-family:monospace;font-size:108%;line-height:99%;}h1{font-size:138.5%;}h2{font-size:123.1%;}h3{font-size:108%;}h1,h2,h3{margin:1em 0;}h1,h2,h3,h4,h5,h6,strong{font-weight:700;}abbr,acronym{border-bottom:1px dotted #000;cursor:help;}em{font-style:italic;}blockquote,ul,ol,dl{margin:1em;}ol,ul,dl{margin-left:2em;}ol li{list-style:decimal outside;}ul li{list-style:disc outside;}dl dd{margin-left:1em;}th,td{border:1px solid #000;padding:.5em;}th{font-weight:700;text-align:center;}caption{margin-bottom:.5em;text-align:center;}p,fieldset,table,pre{margin-bottom:1em;}input[type=text],input[type=password],textarea{width:12.25em;width:11.9em;}body{font-family:arial, sans;margin:5px}\n-->\n'); + styles.appendChild(newStyle); + head.appendChild(styles); - // -- patch + // -- patch - // Send notification that the iframe has finished loading. - _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::onElementInitialized()(); + // Send notification that the iframe has finished loading. + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplStandard::onElementInitialized()(); - // Don't set designMode until the RTA actually gets focused. This is - // necessary because editing won't work on Mozilla if the iframe is - // *hidden, but attached*. Waiting for focus gets around this issue. - // - // Note: This onfocus will not conflict with the addEventListener('focus', - // ...) // in RichTextAreaImplStandard. - iframe.contentWindow.onfocus = function() { - iframe.contentWindow.onfocus = null; - iframe.contentWindow.document.designMode = 'On'; - }; - }; - }-*/; + // Don't set designMode until the RTA actually gets focused. This is + // necessary because editing won't work on Mozilla if the iframe is + // *hidden, but attached*. Waiting for focus gets around this issue. + // + // Note: This onfocus will not conflict with the addEventListener('focus', + // ...) // in RichTextAreaImplStandard. + iframe.contentWindow.onfocus = function() { + iframe.contentWindow.onfocus = null; + iframe.contentWindow.document.designMode = 'On'; + }; + }; + }-*/; } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/editor/WrappedRichTextAreaImplOpera.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/editor/WrappedRichTextAreaImplOpera.java 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/editor/WrappedRichTextAreaImplOpera.java 2009-01-27 01:24:24 UTC (rev 1040) @@ -18,30 +18,30 @@ * */package org.ourproject.kune.workspace.client.editor; -import com.google.gwt.user.client.ui.impl.RichTextAreaImplOpera; +import org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplOpera; public class WrappedRichTextAreaImplOpera extends RichTextAreaImplOpera { @Override public native void initElement() /*-{ - // Most browsers don't like setting designMode until slightly _after_ - // the iframe becomes attached to the DOM. Any non-zero timeout will do - // just fine. - var _this = this; - _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::initializing = true; - setTimeout(function() { - // Turn on design mode. - [email protected]::elem.contentWindow.document.designMode = 'On'; - // patch css inject: - var elem = [email protected]::elem; - var doc = elem.contentWindow.document; - var ct = "<html><head><style>@import url('" + "css/richtext.css" + "');</style></head><body CONTENTEDITABLE='true'></body></html>" ; - doc.write( ct ); - // -- patch + // Most browsers don't like setting designMode until slightly _after_ + // the iframe becomes attached to the DOM. Any non-zero timeout will do + // just fine. + var _this = this; + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplStandard::initializing = true; + setTimeout(function() { + // Turn on design mode. + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.contentWindow.document.designMode = 'On'; + // patch css inject: + var elem = _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem; + var doc = elem.contentWindow.document; + var ct = "<html><head><style>@import url('" + "css/richtext.css" + "');</style></head><body CONTENTEDITABLE='true'></body></html>" ; + doc.write( ct ); + // -- patch - // Send notification that the iframe has reached design mode. - _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::onElementInitialized()(); - }, 1); - }-*/; + // Send notification that the iframe has reached design mode. + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplStandard::onElementInitialized()(); + }, 1); + }-*/; } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/editor/WrappedRichTextAreaImplSafari.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/editor/WrappedRichTextAreaImplSafari.java 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/editor/WrappedRichTextAreaImplSafari.java 2009-01-27 01:24:24 UTC (rev 1040) @@ -18,31 +18,31 @@ * */package org.ourproject.kune.workspace.client.editor; -import com.google.gwt.user.client.ui.impl.RichTextAreaImplSafari; +import org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplSafari; public class WrappedRichTextAreaImplSafari extends RichTextAreaImplSafari { @Override public native void initElement() /*-{ - // Most browsers don't like setting designMode until slightly _after_ - // the iframe becomes attached to the DOM. Any non-zero timeout will do - // just fine. - var _this = this; - _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::initializing = true; - setTimeout(function() { - // Turn on design mode. - [email protected]::elem.contentWindow.document.designMode = 'On'; - - // patch css inject: - var elem = [email protected]::elem; - var doc = elem.contentWindow.document; - var ct = "<html><head><style>@import url('" + "css/richtext.css" + "');</style></head><body CONTENTEDITABLE='true'></body></html>" ; - doc.write( ct ); - // -- patch + // Most browsers don't like setting designMode until slightly _after_ + // the iframe becomes attached to the DOM. Any non-zero timeout will do + // just fine. + var _this = this; + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplStandard::initializing = true; + setTimeout(function() { + // Turn on design mode. + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem.contentWindow.document.designMode = 'On'; - // Send notification that the iframe has reached design mode. - _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::onElementInitialized()(); - }, 1); - }-*/; + // patch css inject: + var elem = _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl::elem; + var doc = elem.contentWindow.document; + var ct = "<html><head><style>@import url('" + "css/richtext.css" + "');</style></head><body CONTENTEDITABLE='true'></body></html>" ; + doc.write( ct ); + // -- patch + // Send notification that the iframe has reached design mode. + _this.@org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImplStandard::onElementInitialized()(); + }, 1); + }-*/; + } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/editor/insert/TextEditorInsertElement.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/editor/insert/TextEditorInsertElement.java 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/editor/insert/TextEditorInsertElement.java 2009-01-27 01:24:24 UTC (rev 1040) @@ -6,8 +6,8 @@ public interface TextEditorInsertElement extends AbstractOptions { - void fireOnInsert(String name, String link); + void addOnCreateLink(Listener2<String, String> slot); - void onInsert(Listener2<String, String> slot); + void fireOnCreateLink(String name, String link); } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/editor/insert/TextEditorInsertElementPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/editor/insert/TextEditorInsertElementPresenter.java 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/editor/insert/TextEditorInsertElementPresenter.java 2009-01-27 01:24:24 UTC (rev 1040) @@ -7,22 +7,27 @@ public class TextEditorInsertElementPresenter extends AbstractOptionsPresenter implements TextEditorInsertElement { - private final Event2<String, String> onInsert; + private final Event2<String, String> onCreateLink; public TextEditorInsertElementPresenter() { - this.onInsert = new Event2<String, String>("onInsert"); + this.onCreateLink = new Event2<String, String>("onCreateLink"); } - public void fireOnInsert(String name, String link) { - onInsert.fire(name, link); + public void addOnCreateLink(final Listener2<String, String> slot) { + onCreateLink.add(slot); + } + + public void fireOnCreateLink(String name, String link) { + onCreateLink.fire(name, link); super.hide(); } + public void fireOnInsertHtml(String name, String link) { + onCreateLink.fire(name, link); + super.hide(); + } + public void init(TextEditorInsertElementView view) { super.init(view); } - - public void onInsert(final Listener2<String, String> slot) { - onInsert.add(slot); - } } \ No newline at end of file Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/editor/insert/abstractlink/TextEditorInsertAbstractPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/editor/insert/abstractlink/TextEditorInsertAbstractPresenter.java 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/editor/insert/abstractlink/TextEditorInsertAbstractPresenter.java 2009-01-27 01:24:24 UTC (rev 1040) @@ -22,7 +22,7 @@ } public void onInsert(String name, String link) { - editorInsertElement.fireOnInsert(name, link); + editorInsertElement.fireOnCreateLink(name, link); reset(); } Modified: trunk/src/main/rails/publicspace/public/templates/basic/docs.liquid.html =================================================================== --- trunk/src/main/rails/publicspace/public/templates/basic/docs.liquid.html 2009-01-26 23:25:53 UTC (rev 1039) +++ trunk/src/main/rails/publicspace/public/templates/basic/docs.liquid.html 2009-01-27 01:24:24 UTC (rev 1040) @@ -4,7 +4,7 @@ <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>{{ content.group_short_name }}: {{ content.title }}</title> - <link rel="shortcut icon" href="/kune/servlets/EntityLogoDownloadManager?token={{ content.statetoken }} /> + <link rel="shortcut icon" href="/kune/servlets/EntityLogoDownloadManager?token={{ content.statetoken }}" /> <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.6.0/build/reset/reset-min.css"> <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.6.0/build/fonts/fonts-min.css"> <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.6.0/build/base/base-min.css">
participants (1)
-
vjrj